@lmctl-ai/lmctl 0.1.11 → 0.1.12

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 GT=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var ie=(t,e)=>{for(var r in e)GT(t,r,{get:e[r],enumerable:!0})};import{existsSync as Nr,readdirSync as YT,readFileSync as zT}from"node:fs";import{homedir as ZT,platform as Gd}from"node:os";import{join as gt}from"node:path";function rr(){let t=process.env.LMCTL_HOME;return t!==void 0&&t.length>0?t:gt(ZT(),QT)}function pn(){return gt(rr(),Vd)}function nr(){return gt(rr(),eS)}function wt(t){return gt(nr(),t)}function Lt(t){return gt(wt(t),Vd)}function ya(){let t=[],e=new Set,r=o=>{Nr(o.db_path)&&(e.has(o.db_path)||(e.add(o.db_path),t.push(o)))};r({workspace_name:null,db_path:pn(),kind:"legacy"});let n=nr();if(!Nr(n))return t;let s;try{s=YT(n)}catch{return t}for(let o of s.sort())Fe(o)&&r({workspace_name:o,db_path:Lt(o),kind:"workspace"});return t}function Ea(t){return gt(wt(t),"projects")}function $s(){return gt(rr(),tS)}function Fe(t){return!(t.length===0||t.length>64||!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(t)||t==="."||t==="..")}function Ns(){let t=$s();if(!Nr(t))return null;try{let e=zT(t,"utf8").trim();return e.length===0||!Fe(e)?null:e}catch{return null}}function hn(){let t=process.env.LMCTL_WORKSPACE;return t!==void 0&&t.length>0&&Fe(t)?t:Ns()}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=hn();if(e!==null)return Lt(e);let r=pn();return Nr(r)||!Nr(nr())?r:Lt(Kd)}function sS(t,e=Gd()){return e!=="linux"?!1:t.startsWith("/mnt/c/")||t==="/mnt/c"}function Yd(t,e=process.stderr,r=Gd()){sS(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 ba(){return gt(rr(),rS)}function zd(){return gt(rr(),nS)}function oS(){try{return Nr(ba())}catch{return!1}}function Zd(t=process.stderr){oS()&&t.write(`note: legacy ~/.lmctl/profiles/ detected \u2014 run 'lmctl workspace migrate' to move it to ~/.lmctl/workspaces/
3
- `)}var QT,Vd,eS,tS,Kd,rS,nS,sr,He=E(()=>{"use strict";QT=".lmctl",Vd="state.db",eS="workspaces",tS="active-workspace",Kd="default",rS="profiles",nS="active-profile";sr={default:Kd}});function cS(t){for(let e of lS)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 uS(t){let e=t.toLowerCase();return!!(e==="::1"||e==="::"||e.startsWith("fe80:")||e.startsWith("fe80::"))}function mS(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 _n(t){let e=t;for(let{re:r,replacement:n}of aS)e=e.replace(r,n);return e=e.replace(dS,r=>!mS(r)||cS(r)?r:Qd),e=e.replace(fS,r=>uS(r)?r:Qd),e}function gn(t){return t.split(`
1
+ var GT=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var ie=(t,e)=>{for(var r in e)GT(t,r,{get:e[r],enumerable:!0})};import{existsSync as Nr,readdirSync as YT,readFileSync as zT}from"node:fs";import{homedir as ZT,platform as Gd}from"node:os";import{join as gt}from"node:path";function nr(){let t=process.env.LMCTL_HOME;return t!==void 0&&t.length>0?t:gt(ZT(),QT)}function pn(){return gt(nr(),Vd)}function sr(){return gt(nr(),eS)}function wt(t){return gt(sr(),t)}function Lt(t){return gt(wt(t),Vd)}function Ea(){let t=[],e=new Set,r=o=>{Nr(o.db_path)&&(e.has(o.db_path)||(e.add(o.db_path),t.push(o)))};r({workspace_name:null,db_path:pn(),kind:"legacy"});let n=sr();if(!Nr(n))return t;let s;try{s=YT(n)}catch{return t}for(let o of s.sort())Fe(o)&&r({workspace_name:o,db_path:Lt(o),kind:"workspace"});return t}function ba(t){return gt(wt(t),"projects")}function $s(){return gt(nr(),tS)}function Fe(t){return!(t.length===0||t.length>64||!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(t)||t==="."||t==="..")}function Ns(){let t=$s();if(!Nr(t))return null;try{let e=zT(t,"utf8").trim();return e.length===0||!Fe(e)?null:e}catch{return null}}function hn(){let t=process.env.LMCTL_WORKSPACE;return t!==void 0&&t.length>0&&Fe(t)?t:Ns()}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=hn();if(e!==null)return Lt(e);let r=pn();return Nr(r)||!Nr(sr())?r:Lt(Kd)}function sS(t,e=Gd()){return e!=="linux"?!1:t.startsWith("/mnt/c/")||t==="/mnt/c"}function Yd(t,e=process.stderr,r=Gd()){sS(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 Ta(){return gt(nr(),rS)}function zd(){return gt(nr(),nS)}function oS(){try{return Nr(Ta())}catch{return!1}}function Zd(t=process.stderr){oS()&&t.write(`note: legacy ~/.lmctl/profiles/ detected \u2014 run 'lmctl workspace migrate' to move it to ~/.lmctl/workspaces/
3
+ `)}var QT,Vd,eS,tS,Kd,rS,nS,or,He=E(()=>{"use strict";QT=".lmctl",Vd="state.db",eS="workspaces",tS="active-workspace",Kd="default",rS="profiles",nS="active-profile";or={default:Kd}});function cS(t){for(let e of lS)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 uS(t){let e=t.toLowerCase();return!!(e==="::1"||e==="::"||e.startsWith("fe80:")||e.startsWith("fe80::"))}function mS(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 _n(t){let e=t;for(let{re:r,replacement:n}of aS)e=e.replace(r,n);return e=e.replace(dS,r=>!mS(r)||cS(r)?r:Qd),e=e.replace(fS,r=>uS(r)?r:Qd),e}function gn(t){return t.split(`
4
4
  `).map(e=>_n(e)).join(`
5
- `)}function tf(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:_n(e)}}function Ct(t){if(typeof t=="string")return _n(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 rf(t,e){for(let{name:r,re:n}of pS){let s=e.match(n);if(s!==null&&!s[0].includes(Ze))throw new or(t,r)}}var Ze,iS,Qd,ef,aS,lS,dS,fS,pS,or,xs=E(()=>{"use strict";Ze="[REDACTED]",iS="[REDACTED_EMAIL]",Qd="[REDACTED_IP]",ef="[USER]",aS=[{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${ef}`},{re:/(\/Users\/)[^/\s"'`]+/g,replacement:`$1${ef}`},{re:/\b[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}\b/g,replacement:iS}],lS=["127.","10.","192.168.","0.0.0.0"];dS=/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/g,fS=/\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;pS=[{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"'`]+/}],or=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 Ta}from"node:child_process";import{readFileSync as hS}from"node:fs";import{readFile as ka,stat as nf}from"node:fs/promises";import{homedir as _S}from"node:os";import{join as gS}from"node:path";import{fileURLToPath as wS}from"node:url";function ir(){try{let t=new URL("../../package.json",import.meta.url),e=JSON.parse(hS(wS(t),"utf8"));if(typeof e.version=="string")return e.version}catch{}return"0.0.0"}async function sf(t){let e=new Set(t.include??js),r={};return e.has("serve")&&(r.serve=await ES(t)),e.has("db")&&(r.db=bS(t)),e.has("runs")&&(r.runs=TS(t)),e.has("jobs")&&(r.jobs=SS(t)),e.has("attentions")&&(r.attentions=kS(t)),e.has("env")&&(r.env=await vS(t)),e.has("intents")&&(r.intents=await $S(t)),r}async function ES(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 ka(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 ka(r,"utf8")).split(`
5
+ `)}function tf(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:_n(e)}}function Ct(t){if(typeof t=="string")return _n(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 rf(t,e){for(let{name:r,re:n}of pS){let s=e.match(n);if(s!==null&&!s[0].includes(Ze))throw new ir(t,r)}}var Ze,iS,Qd,ef,aS,lS,dS,fS,pS,ir,xs=E(()=>{"use strict";Ze="[REDACTED]",iS="[REDACTED_EMAIL]",Qd="[REDACTED_IP]",ef="[USER]",aS=[{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${ef}`},{re:/(\/Users\/)[^/\s"'`]+/g,replacement:`$1${ef}`},{re:/\b[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}\b/g,replacement:iS}],lS=["127.","10.","192.168.","0.0.0.0"];dS=/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/g,fS=/\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;pS=[{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"'`]+/}],ir=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 hS}from"node:fs";import{readFile as va,stat as nf}from"node:fs/promises";import{homedir as _S}from"node:os";import{join as gS}from"node:path";import{fileURLToPath as wS}from"node:url";function ar(){try{let t=new URL("../../package.json",import.meta.url),e=JSON.parse(hS(wS(t),"utf8"));if(typeof e.version=="string")return e.version}catch{}return"0.0.0"}async function sf(t){let e=new Set(t.include??js),r={};return e.has("serve")&&(r.serve=await ES(t)),e.has("db")&&(r.db=bS(t)),e.has("runs")&&(r.runs=TS(t)),e.has("jobs")&&(r.jobs=SS(t)),e.has("attentions")&&(r.attentions=kS(t)),e.has("env")&&(r.env=await vS(t)),e.has("intents")&&(r.intents=await $S(t)),r}async function ES(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 va(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 va(r,"utf8")).split(`
6
6
  `),f=d.slice(Math.max(0,d.length-n));c=f.length,a=gn(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 bS(t){let{dal:e}=t,r="unknown";try{r=e.query("PRAGMA integrity_check;").map(i=>i.integrity_check??JSON.stringify(i)).join(`
8
- `)}catch(o){r=`integrity_check failed: ${o instanceof Error?o.message:String(o)}`}let n=0;try{n=e.query("PRAGMA user_version;")[0]?.user_version??0}catch{n=0}let s={};try{let o=e.query("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name");for(let{name:i}of o)try{let a=e.query(`SELECT COUNT(*) AS c FROM "${i.replace(/"/g,'""')}"`);s[i]=a[0]?.c??0}catch{s[i]=-1}}catch{}return{integrity_check:r,schema_version:n,table_counts:s}}function TS(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 ${Sa} FROM run ORDER BY id DESC LIMIT 50`),i=e.query(`SELECT ${Sa} FROM run WHERE paused_at IS NOT NULL AND terminal_state IS NULL ORDER BY paused_at DESC LIMIT 50`),a=e.query(`SELECT ${Sa} FROM run
8
+ `)}catch(o){r=`integrity_check failed: ${o instanceof Error?o.message:String(o)}`}let n=0;try{n=e.query("PRAGMA user_version;")[0]?.user_version??0}catch{n=0}let s={};try{let o=e.query("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name");for(let{name:i}of o)try{let a=e.query(`SELECT COUNT(*) AS c FROM "${i.replace(/"/g,'""')}"`);s[i]=a[0]?.c??0}catch{s[i]=-1}}catch{}return{integrity_check:r,schema_version:n,table_counts:s}}function TS(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 ${ka} FROM run ORDER BY id DESC LIMIT 50`),i=e.query(`SELECT ${ka} FROM run WHERE paused_at IS NOT NULL AND terminal_state IS NULL ORDER BY paused_at DESC LIMIT 50`),a=e.query(`SELECT ${ka} FROM run
9
9
  WHERE terminal_state IS NULL
10
10
  AND started_at < ?
11
11
  ORDER BY started_at ASC LIMIT 50`,s);return{last_50:Ct(o),stale:Ct(a),paused:Ct(i)}}function SS(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 kS(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 vS(t){let e=ir(),r=process.version,n=Ta("uname",["-a"],{encoding:"utf8"}),s=gn((n.stdout??"").trim()),o=[],i=t.dbPath??process.env.LMCTL_DB;if(i!==void 0)try{await nf(i);let u=Ta("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 nf(a);let u=Ta("du",["-sh",a],{encoding:"utf8"});u.status===0&&o.push(u.stdout.trim())}catch{}let l=o.length===0?"(no paths configured)":gn(o.join(`
13
- `)),c=[];for(let u of yS){let d=process.env[u];if(d===void 0){c.push({key:u,value:"(unset)"});continue}c.push(tf(u,d))}return{lmctl_next_version:e,node_version:r,os_info:s,disk_usage:l,env_keys_present:c}}function IS(){return process.env.LMCTL_INTENT_LOG??gS(_S(),".lmctl","recent-intents.log")}async function $S(t){let e=t.intentLog??IS(),r=t.intentLogTailLines??500;try{let s=(await ka(e,"utf8")).split(`
12
+ FROM attention WHERE acknowledged_at IS NULL ORDER BY created_at DESC LIMIT 100`);return{unacked:Ct(r)}}async function vS(t){let e=ar(),r=process.version,n=Sa("uname",["-a"],{encoding:"utf8"}),s=gn((n.stdout??"").trim()),o=[],i=t.dbPath??process.env.LMCTL_DB;if(i!==void 0)try{await nf(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 nf(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)":gn(o.join(`
13
+ `)),c=[];for(let u of yS){let d=process.env[u];if(d===void 0){c.push({key:u,value:"(unset)"});continue}c.push(tf(u,d))}return{lmctl_next_version:e,node_version:r,os_info:s,disk_usage:l,env_keys_present:c}}function IS(){return process.env.LMCTL_INTENT_LOG??gS(_S(),".lmctl","recent-intents.log")}async function $S(t){let e=t.intentLog??IS(),r=t.intentLogTailLines??500;try{let s=(await va(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:gn(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 js,yS,Sa,As=E(()=>{"use strict";xs();js=["serve","db","runs","jobs","attentions","env","intents"];yS=["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"];Sa=["id","job_id","workflow_id","team_id","current_state","terminal_state","started_at","ended_at","paused_at","parent_run_id","blocker"].join(", ")});import NS from"better-sqlite3";import{existsSync as xS,mkdirSync as jS,readFileSync as AS}from"node:fs";import{homedir as RS}from"node:os";import{dirname as of,join as OS,resolve as af}from"node:path";import{fileURLToPath as LS,pathToFileURL as CS}from"node:url";function Ia(t){t.dbPath!==":memory:"&&jS(of(t.dbPath),{recursive:!0});let e=new NS(t.dbPath);e.pragma("journal_mode = WAL"),e.pragma("synchronous = NORMAL"),e.pragma("foreign_keys = ON");let r=cf(e);return r===0&&(e.exec(AS(MS,"utf8")),e.pragma(`user_version = ${va}`)),PS(e,r),e}function PS(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 js,yS,ka,As=E(()=>{"use strict";xs();js=["serve","db","runs","jobs","attentions","env","intents"];yS=["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"];ka=["id","job_id","workflow_id","team_id","current_state","terminal_state","started_at","ended_at","paused_at","parent_run_id","blocker"].join(", ")});import NS from"better-sqlite3";import{existsSync as xS,mkdirSync as jS,readFileSync as AS}from"node:fs";import{homedir as RS}from"node:os";import{dirname as of,join as OS,resolve as af}from"node:path";import{fileURLToPath as LS,pathToFileURL as CS}from"node:url";function $a(t){t.dbPath!==":memory:"&&jS(of(t.dbPath),{recursive:!0});let e=new NS(t.dbPath);e.pragma("journal_mode = WAL"),e.pragma("synchronous = NORMAL"),e.pragma("foreign_keys = ON");let r=cf(e);return r===0&&(e.exec(AS(MS,"utf8")),e.pragma(`user_version = ${Ia}`)),PS(e,r),e}function PS(t,e){let r=e;if(r<2&&r!==0&&(t.exec(`
16
16
  CREATE TABLE IF NOT EXISTS session_size (
17
17
  id INTEGER PRIMARY KEY AUTOINCREMENT,
18
18
  team_name TEXT NOT NULL,
@@ -463,9 +463,9 @@ var GT=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var ie=(t,e)=>{f
463
463
  ORDER BY id ASC;
464
464
  DROP TABLE team_connection;
465
465
  ALTER TABLE team_connection_v37 RENAME TO team_connection;
466
- `),t.pragma("user_version = 37"),r=37),xS(DS)}function xe(t,e){let r=t.prepare(`PRAGMA table_info(${e})`).all();return new Set(r.map(n=>n.name))}function cf(t){let e=t.pragma("user_version",{simple:!0});return typeof e=="number"?e:0}function FS(){return process.env.LMCTL_DB??OS(RS(),".lmctl","state.db")}var lf,MS,DS,va,$a=E(()=>{"use strict";lf=of(LS(import.meta.url)),MS=af(lf,"schema.sql"),DS=af(lf,"migrations"),va=37;if(process.argv[1]&&import.meta.url===CS(process.argv[1]).href){let t=Ia({dbPath:process.argv[2]??FS()});try{process.stdout.write(`migrated user_version=${cf(t)}
466
+ `),t.pragma("user_version = 37"),r=37),xS(DS)}function xe(t,e){let r=t.prepare(`PRAGMA table_info(${e})`).all();return new Set(r.map(n=>n.name))}function cf(t){let e=t.pragma("user_version",{simple:!0});return typeof e=="number"?e:0}function FS(){return process.env.LMCTL_DB??OS(RS(),".lmctl","state.db")}var lf,MS,DS,Ia,Na=E(()=>{"use strict";lf=of(LS(import.meta.url)),MS=af(lf,"schema.sql"),DS=af(lf,"migrations"),Ia=37;if(process.argv[1]&&import.meta.url===CS(process.argv[1]).href){let t=$a({dbPath:process.argv[2]??FS()});try{process.stdout.write(`migrated user_version=${cf(t)}
467
467
  `)}finally{t.close()}}});function xr(t){return typeof t=="string"&&US.has(t)}function ff(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: ${Rs[0]}`,` STANCE: ${Rs[1]}`,` STANCE: ${Rs[2]}`,` STANCE: ${uf}: <one short sentence: why no declared outcome fits>`,"Never invent a different outcome; never leave the STANCE line out."].join(`
468
- `)}var uf,Rs,US,wn,df,Na,Os,yn=E(()=>{"use strict";uf="other",Rs=["not_enough_information","dont_know","other_work"],US=new Set([uf,...Rs]),wn="@abort",df="invalid_decision",Na="escalation_aborted",Os="workflow_escalation"});import{randomUUID as WS}from"node:crypto";function ke(t){return t.provider_resolved??t.provider}function D(){return new Date().toISOString()}function pe(t){return new xa(Ia({dbPath:t.path}))}function mf(t,e,r){let n=pf(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 pf(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 pf(t){let e=BS(t),r=e===null?null:qS(e,"states");if(r===null)return[];let n=[];for(let s of Object.values(r))ja(s)&&s.type==="Subflow"&&typeof s.workflow_name=="string"&&s.workflow_name.length>0&&n.push(s.workflow_name);return n}function BS(t){try{let e=JSON.parse(t);return ja(e)?e:null}catch{return null}}function qS(t,e){let r=t[e];return ja(r)?r:null}function ja(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function HS(t){return{insertWorkflow:t.prepare(`
468
+ `)}var uf,Rs,US,wn,df,xa,Os,yn=E(()=>{"use strict";uf="other",Rs=["not_enough_information","dont_know","other_work"],US=new Set([uf,...Rs]),wn="@abort",df="invalid_decision",xa="escalation_aborted",Os="workflow_escalation"});import{randomUUID as WS}from"node:crypto";function ke(t){return t.provider_resolved??t.provider}function D(){return new Date().toISOString()}function pe(t){return new ja($a({dbPath:t.path}))}function mf(t,e,r){let n=pf(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 pf(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 pf(t){let e=BS(t),r=e===null?null:qS(e,"states");if(r===null)return[];let n=[];for(let s of Object.values(r))Aa(s)&&s.type==="Subflow"&&typeof s.workflow_name=="string"&&s.workflow_name.length>0&&n.push(s.workflow_name);return n}function BS(t){try{let e=JSON.parse(t);return Aa(e)?e:null}catch{return null}}function qS(t,e){let r=t[e];return Aa(r)?r:null}function Aa(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function HS(t){return{insertWorkflow:t.prepare(`
469
469
  INSERT INTO workflow (name, version, definition_schema_version, definition, created_at)
470
470
  VALUES (?, ?, ?, ?, ?)
471
471
  `),setWorkflowSource:t.prepare("UPDATE workflow SET source_uri = ?, source_sha256 = ? WHERE id = ?"),getWorkflow:t.prepare("SELECT * FROM workflow WHERE id = ?"),findWorkflowVersion:t.prepare("SELECT * FROM workflow WHERE name = ? AND version = ?"),findWorkflowLatest:t.prepare("SELECT * FROM workflow WHERE name = ? ORDER BY version DESC LIMIT 1"),updateWorkflowActiveVersion:t.prepare("UPDATE workflow SET active_version_id = ? WHERE id = ?"),updateWorkflowActiveVersionAndDefinition:t.prepare(`
@@ -921,9 +921,9 @@ var GT=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var ie=(t,e)=>{f
921
921
  AND sender_teamfile = ?
922
922
  AND sender_alias = ?
923
923
  AND active_count > 1
924
- `),clearAgentInflightOlderThan:t.prepare("DELETE FROM agent_inflight WHERE started_at < ?")}}function JS(t,e){return e===void 0?{resumed:!1,reason:t}:{resumed:!1,reason:t,valid:e}}var xa,Me=E(()=>{"use strict";$a();yn();xa=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;replaceTeamConnectionsTxn;tryAcquireAgentInflightTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=HS(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)=>JS("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!==Os)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!==wn&&!a.includes(n))return{resumed:!1,reason:df};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){mf(e.name,e.definition,i=>this.getWorkflowByName(i));let r=this.stmts.insertWorkflow.run(e.name,e.version??1,e.definition_schema_version??1,e.definition,D()),n=this.getWorkflow(Number(r.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(n.id,n.version,e.definition,e.author??null,D());this.stmts.updateWorkflowActiveVersion.run(s.lastInsertRowid,n.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,n.id);let o=this.getWorkflow(n.id);return this.syncWorkflowTriggers(n.id,e.definition),o}upsertWorkflow(e){mf(e.name,e.definition,i=>this.getWorkflowByName(i));let r=this.getWorkflowByName(e.name);if(r===null)return this.insertWorkflow({name:e.name,definition_schema_version:e.definition_schema_version,definition:e.definition,author:e.author,source_uri:e.source_uri,source_sha256:e.source_sha256});let s=(this.stmts.getLatestWorkflowVersion.get(r.id)?.version??r.version)+1,o=this.stmts.insertWorkflowVersion.run(r.id,s,e.definition,e.author??null,D());return this.stmts.updateWorkflowActiveVersionDefinitionAndVersion.run(Number(o.lastInsertRowid),e.definition,e.definition_schema_version??r.definition_schema_version,s,r.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,r.id),this.syncWorkflowTriggers(r.id,e.definition),this.getWorkflow(r.id)}insertCompositionUnit(e){this.stmts.insertCompositionUnit.run(e.name,e.version,e.lang,e.source,e.source_sha,e.compiled_workflow_version_id,D())}getWorkflow(e){return this.stmts.getWorkflow.get(e)??null}getWorkflowByName(e,r){return(r===void 0?this.stmts.findWorkflowLatest.get(e):this.stmts.findWorkflowVersion.get(e,r))??null}findWorkflowByName(e,r){return this.getWorkflowByName(e,r)}insertWorkflowVersion(e,r,n){let o=(this.stmts.getLatestWorkflowVersion.get(e)?.version??0)+1,i=this.stmts.insertWorkflowVersion.run(e,o,r,n??null,D());return this.stmts.getWorkflowVersion.get(i.lastInsertRowid)}activateWorkflowVersion(e,r){let n=this.getWorkflowVersionById(r);if(n===null||n.workflow_id!==e)return null;let s=1;try{let o=JSON.parse(n.definition);typeof o.definition_schema_version=="number"&&(s=o.definition_schema_version)}catch{}return this.stmts.updateWorkflowActiveVersionAndDefinition.run(r,n.definition,s,e),this.syncWorkflowTriggers(e,n.definition),this.getWorkflow(e)}getWorkflowVersionById(e){return this.stmts.getWorkflowVersion.get(e)??null}listWorkflowVersions(e){return this.stmts.listWorkflowVersions.all(e)}upsertTriggerInstance(e){return this.stmts.upsertTriggerInstance.run(e.workflow_id,e.trigger_id,e.trigger_type,e.parameters,e.enabled===!1?0:1,D()),this.stmts.getTriggerInstanceByWorkflowAndId.get(e.workflow_id,e.trigger_id)}listTriggerInstancesForWorkflow(e){return this.stmts.listTriggerInstancesForWorkflow.all(e)}listEnabledTriggerInstances(){return this.stmts.listEnabledTriggerInstances.all()}setTriggerCursor(e,r){return this.stmts.setTriggerCursor.run(r,D(),e),this.stmts.getTriggerInstance.get(e)??null}setTriggerFailure(e,r){return this.stmts.setTriggerFailure.run(D(),r,e),this.stmts.getTriggerInstance.get(e)??null}syncWorkflowTriggers(e,r){let n;try{n=JSON.parse(r)}catch{return}if(n===null||typeof n!="object"||Array.isArray(n))return;let s=n.triggers;if(Array.isArray(s))for(let o of s){if(o===null||typeof o!="object"||Array.isArray(o))continue;let i=o;typeof i.id!="string"||i.id.length===0||typeof i.type!="string"||i.type.length===0||this.upsertTriggerInstance({workflow_id:e,trigger_id:i.id,trigger_type:i.type,parameters:JSON.stringify(i.parameters??{})})}}insertTeam(e){let r=this.stmts.insertTeam.run(e.name,D());return this.stmts.getTeam.get(r.lastInsertRowid)}getTeam(e){return this.stmts.getTeam.get(e)??null}findTeamByName(e){return this.stmts.findTeamByName.get(e)??null}listTeams(){return this.stmts.listTeams.all()}insertTeamMember(e){let r=this.stmts.insertTeamMember.run(e.team_id,e.alias,e.role??"agent",e.provider,e.model??null,e.sessionid??null,e.sessiondir,D());return this.stmts.getTeamMember.get(r.lastInsertRowid)}listTeamMembers(e){return this.stmts.listTeamMembers.all(e)}findTeamMemberByAlias(e,r){return this.stmts.findTeamMemberByAlias.get(e,r)??null}updateTeamMemberSession(e,r){return this.stmts.updateTeamMemberSession.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberState(e,r,n){return this.stmts.setMemberState.run(r,n??null,D(),e),this.stmts.getTeamMember.get(e)??null}listMembersInState(e){return this.stmts.listMembersInState.all(e)}setMemberPromptSnapshot(e,r){return this.stmts.setMemberPromptSnapshot.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberProviderResolved(e,r){return this.stmts.setMemberProviderResolved.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberRolePrompt(e,r){return this.stmts.setMemberRolePrompt.run(r,e),this.stmts.getTeamMember.get(e)??null}updateTeamMemberMeta(e,r){let n=this.stmts.getTeamMember.get(e);if(n===void 0)return null;let s=Object.prototype.hasOwnProperty.call(r,"role_prompt"),o=Object.prototype.hasOwnProperty.call(r,"model"),i=Object.prototype.hasOwnProperty.call(r,"provider");return this.stmts.updateTeamMemberMeta.run(s?r.role_prompt??null:n.role_prompt,o?r.model??null:n.model,i?r.provider??n.provider:n.provider,e),this.stmts.getTeamMember.get(e)??null}insertTeamMemberCompanion(e){let r=this.stmts.insertTeamMemberCompanion.run(e.interpreter_id,e.companion_id,D());return this.stmts.getTeamMemberCompanion.get(r.lastInsertRowid)}insertProject(e){let r=this.stmts.insertProject.run(e.name,e.description??null,e.local_path,e.workflow_name,e.team_id,e.default_branch??null,e.intake_config??null,e.test_argv??null,e.test_command??null,e.durable_memory_mode??"folder",D());return this.stmts.getProject.get(r.lastInsertRowid)}listProjects(){return this.stmts.listProjects.all()}getProject(e){return this.stmts.getProject.get(e)??null}findProjectByName(e){return this.stmts.findProjectByName.get(e)??null}setProjectIntakeConfig(e,r){return this.stmts.setProjectIntakeConfig.run(r,e),this.stmts.getProject.get(e)??null}updateProjectSettings(e,r){let n=this.stmts.getProject.get(e);if(n===void 0)return null;let s=Object.prototype.hasOwnProperty.call(r,"local_path"),o=Object.prototype.hasOwnProperty.call(r,"durable_memory_mode"),i=Object.prototype.hasOwnProperty.call(r,"default_branch"),a=Object.prototype.hasOwnProperty.call(r,"intake_config");return this.stmts.updateProjectSettings.run(s?r.local_path:n.local_path,o?r.durable_memory_mode:n.durable_memory_mode,i?r.default_branch??null:n.default_branch,a?r.intake_config??null:n.intake_config,e),this.stmts.getProject.get(e)??null}listProjectsWithIntakeEnabled(){return this.stmts.listProjectsWithIntakeConfig.all().filter(e=>{if(e.intake_config===null)return!1;try{let r=JSON.parse(e.intake_config);return typeof r=="object"&&r!==null&&!Array.isArray(r)&&r.scan_github_issues===!0}catch{return!1}})}getProjectByJob(e){return this.stmts.getProjectByJob.get(e)??null}insertProjectWorkflow(e){let r=e.condition??null,n=this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,r);if(n!==void 0)return n;let s=this.stmts.insertProjectWorkflow.run(e.project_id,e.workflow_id,r,e.parameters_override??null,e.enabled===!1?0:1,e.priority??100,D());return s.changes===1?this.stmts.getProjectWorkflow.get(s.lastInsertRowid):this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,r)}getProjectWorkflow(e){return this.stmts.getProjectWorkflow.get(e)??null}listProjectWorkflows(e,r={}){return r.enabled_only===!0?this.stmts.listEnabledProjectWorkflows.all(e):this.stmts.listProjectWorkflows.all(e)}removeProjectWorkflow(e){return this.stmts.removeProjectWorkflow.run(e).changes>0}setProjectWorkflowEnabled(e,r){return this.stmts.setProjectWorkflowEnabled.run(r?1:0,e),this.getProjectWorkflow(e)}createIssue(e){let r=D(),n=this.stmts.createIssue.run(e.project_id,e.title,e.body,e.severity??"medium",e.labels??null,e.ai_test_path??null,e.source_run_id??null,r,r);return this.stmts.getIssue.get(n.lastInsertRowid)}getIssue(e){return this.stmts.getIssue.get(e)??null}listIssues(e,r={}){return this.stmts.listIssuesForProject.all(e).filter(n=>!(r.status!==void 0&&!r.status.includes(n.status)||r.severity!==void 0&&!r.severity.includes(n.severity)||r.ai_test_path!==void 0&&n.ai_test_path!==r.ai_test_path))}claimNextIssue(e,r){return this.stmts.claimNextIssue.get(r,D(),e)??null}claimIssue(e,r){return this.stmts.claimIssue.get(r,D(),e)??null}closeIssue(e,r,n){let s=D(),o=this.stmts.closeIssue.get(r,n??null,s,s,e);if(o===void 0)throw new Error(`issue not found: ${e}`);return o}reopenIssue(e,r){let n=this.stmts.reopenIssue.get(r,D(),e);if(n===void 0)throw this.getIssue(e)===null?new Error(`issue not found: ${e}`):new Error(`issue ${e} is not closed`);return n}updateIssue(e,r){let n=this.getIssue(e);if(n===null)throw new Error(`issue not found: ${e}`);let s=Object.prototype.hasOwnProperty.call(r,"labels"),o=Object.prototype.hasOwnProperty.call(r,"ai_test_path"),i=this.stmts.updateIssue.get(r.title??n.title,r.body??n.body,r.severity??n.severity,s?r.labels??null:n.labels,o?r.ai_test_path??null:n.ai_test_path,D(),e);if(i===void 0)throw new Error(`issue not found: ${e}`);return i}listWorkflows(){return this.stmts.listWorkflows.all()}getOrCreateWebuiSession(e,r){let n=this.stmts.getWebuiSession.get(e);if(n!==void 0)return n;let s=D();return this.stmts.insertWebuiSession.run(e,r,"N1",null,null,null,null,"authenticated",s,s),this.stmts.getWebuiSession.get(e)}getWebuiSession(e){return this.stmts.getWebuiSession.get(e)??null}updateWebuiSessionTransition(e,r,n,s,o){if(this.stmts.updateWebuiSessionTransition.run(r,n,s,o,D(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}setWebuiSessionChatbot(e,r){if(this.stmts.setWebuiSessionChatbot.run(r,D(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}createChatbotSession(e,r){let n=WS(),s=D();return this.stmts.insertChatbotSession.run(n,e,r??null,s,s,"active"),this.stmts.getChatbotSession.get(n)}getChatbotSession(e){return this.stmts.getChatbotSession.get(e)??null}listChatbotSessions(e){return this.stmts.listChatbotSessionsForUser.all(e)}appendChatbotMessage(e,r,n,s){let o=D(),i=this.stmts.insertChatbotMessage.run(e,r,n,s??null,o);return this.stmts.touchChatbotSession.run(o,e),this.stmts.getChatbotMessage.get(i.lastInsertRowid)}listChatbotMessages(e){return this.stmts.listChatbotMessages.all(e)}getConfig(e){return this.stmts.getConfig.get(e)?.value??null}setConfig(e,r){this.stmts.upsertConfig.run(e,r,D())}getConfigAll(){let e=this.stmts.listConfig.all(),r={};for(let n of e)r[n.key]=n.value;return r}enqueueJob(e){let r=this.stmts.insertJob.run(e.project_id,e.workflow_id_override??null,e.source,e.source_ref??null,e.payload??null,e.priority??0,e.available_at??D(),e.dedupe_key??null,e.concurrency_key??null,D());if(r.changes===1)return this.stmts.getJob.get(r.lastInsertRowid);if(e.dedupe_key===void 0||e.dedupe_key===null)throw new Error("job insert ignored without dedupe key");return this.stmts.findJobByDedupe.get(e.source,e.dedupe_key)}claimNextJob(e){let r=D(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimTxn(e.worker_id,n,r)}claimNextJobWithConcurrency(e){let r=D(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimWithConcurrencyTxn(e.worker_id,n,r,e.evaluator)}claimJobByIdWithConcurrency(e){let r=D(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimByIdWithConcurrencyTxn(e.job_id,e.worker_id,n,r,e.evaluator)}releaseJob(e,r,n){let s=r==="queued"||r==="running"?null:D();return this.stmts.releaseJob.run(r,n??null,s,e),this.getJob(e)}getJob(e){return this.stmts.getJob.get(e)??null}findJobBySourceAndDedupe(e,r){return this.stmts.findJobByDedupe.get(e,r)??null}insertRun(e){let r=this.getWorkflow(e.workflow_id);if(r===null)throw new Error(`workflow not found: ${e.workflow_id}`);let n=this.stmts.insertRun.run(e.job_id,e.workflow_id,e.team_id,e.current_state??null,r.active_version_id,e.parent_run_id??null,D()),s=this.stmts.getRun.get(n.lastInsertRowid);return(e.parent_run_id===void 0||e.parent_run_id===null)&&this.stmts.setJobRun.run(s.id,e.job_id),s}setJobRun(e,r){return this.stmts.setJobRun.run(r,e),this.getJob(e)}insertPromptDispatch(e){return this.stmts.insertPromptDispatch.run(e.prompt_id,e.project_id,e.job_id,e.text,e.context_json??null,D()),this.stmts.getPromptDispatch.get(e.prompt_id)}getPromptDispatch(e){return this.stmts.getPromptDispatch.get(e)??null}setPromptDispatchCompleted(e,r){return this.stmts.setPromptDispatchCompleted.run(r??D(),e),this.getPromptDispatch(e)}getWorkspace(e){return this.stmts.getWorkspace.get(e)??null}ensureWorkspace(e={}){let r=e.id??"default";this.stmts.ensureWorkspace.run(r,e.name??"Default workspace",e.idleThresholdMs??6e5,D());let n=this.getWorkspace(r);if(n===null)throw new Error(`workspace ${r} missing after upsert`);return n}listWebProjectsActive(e){return this.stmts.listWebProjectsActive.all(e)}getWebProject(e){return this.stmts.getWebProject.get(e)??null}insertWebProject(e){let r=D(),n=this.stmts.insertWebProject.run(e.workspace_id,e.name,e.repo_path,e.config_json??null,e.linked_v4_project_id??null,r,r),s=Number(n.lastInsertRowid),o=this.getWebProject(s);if(o===null)throw new Error(`web_project ${s} missing after insert`);return o}updateWebProject(e){let r=this.getWebProject(e.id);return r===null||r.deleted_at!==null?null:(this.stmts.updateWebProject.run(e.name??r.name,e.config_json===void 0?r.config_json:e.config_json,D(),e.id),this.getWebProject(e.id))}softDeleteWebProject(e){return this.stmts.softDeleteWebProject.run(D(),e).changes===1}loadMailboxCursor(e,r){return this.stmts.loadMailboxCursor.get(e,r)??null}saveMailboxCursor(e){this.stmts.saveMailboxCursor.run(e.user_id,e.mailbox_key,e.last_processed_version_id,e.last_processed_seq??null,e.last_processed_at)}addUsage(e){this.stmts.addUsage.run(e.user_id,e.device_id,e.period,e.put,e.get,e.list,e.updated_at)}loadUsage(e,r,n){return this.stmts.loadUsage.get(e,r,n)??null}sumUsageForPeriod(e,r){let n=this.stmts.sumUsageForPeriod.get(e,r);return{put:n?.put??0,get:n?.get??0,list:n?.list??0}}upsertRootTeam(e){this.stmts.upsertRootTeam.run(e.teamfile_path,e.name,e.raw_text,e.raw_sha256,e.registered_at,e.last_seeded_at)}getRootTeam(e){return this.stmts.getRootTeam.get(e)??null}listRootTeams(){return this.stmts.listRootTeams.all()}replaceTeamConnections(e,r){this.replaceTeamConnectionsTxn(e,r)}listTeamConnections(e){return this.stmts.listTeamConnections.all(e)}insertTeamChatLog(e){let r=this.stmts.insertTeamChatLog.run(e.root_teamfile,e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias,e.message,e.response,e.status,e.error_detail,e.truncated,e.created_at);return Number(r.lastInsertRowid)}listTeamChatLog(e){return this.stmts.listTeamChatLog.all(e)}listTeamChatLogSinceId(e,r=500){return this.stmts.listTeamChatLogSinceId.all(e,Math.max(1,Math.trunc(r)))}getMaxTeamChatLogId(){return this.stmts.getMaxTeamChatLogId.get()?.max_id??0}loadTeamChatLogCursor(e){return this.stmts.loadTeamChatLogCursor.get(e)??null}saveTeamChatLogCursor(e){this.stmts.saveTeamChatLogCursor.run(e.cursor_key,e.last_pushed_id,e.updated_at)}updateTeamChatLogResponse(e,r){this.stmts.updateTeamChatLogResponse.run(r.response,r.status,r.error_detail,r.truncated,e)}getAgentInflight(e,r){return this.stmts.getAgentInflight.get(e,r)??null}tryAcquireAgentInflight(e,r){return this.tryAcquireAgentInflightTxn(e,r)}clearAgentInflight(e,r){this.stmts.clearAgentInflight.run(e,r)}releaseAgentInflight(e){this.db.exec("BEGIN IMMEDIATE");try{let r=this.getAgentInflight(e.receiver_teamfile,e.receiver_alias);if(r===null||r.sender_teamfile!==e.sender_teamfile||r.sender_alias!==e.sender_alias)return this.db.exec("COMMIT"),!1;if(r.active_count<=1)return this.stmts.clearAgentInflightIfSender.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias),this.db.exec("COMMIT"),!0;let n=this.stmts.decrementAgentInflight.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias);return this.db.exec("COMMIT"),n.changes===1}catch(r){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),r}}clearAgentInflightOlderThan(e){return this.stmts.clearAgentInflightOlderThan.run(e).changes}getRun(e){return this.stmts.getRun.get(e)??null}setRunCurrentState(e,r){return this.stmts.setRunCurrentState.run(r,e),this.stmts.getRun.get(e)??null}setRunPausedState(e,r,n){return this.stmts.setRunPausedState.run(r,n,e),this.stmts.getRun.get(e)??null}setRunPendingEscalationDecision(e,r){return this.stmts.setRunPendingEscalationDecision.run(r,e),this.stmts.getRun.get(e)??null}setRunTerminalState(e,r){return this.stmts.setRunTerminalState.run(r,D(),e),this.stmts.getRun.get(e)??null}pauseJob(e){return this.stmts.pauseJob.run(e),this.getJob(e)}resumeRun(e,r){return this.resumeRunTxn(e,r,D())}insertStep(e){let r=this.stmts.insertStep.run(e.run_id,e.parent_step_id??null,e.state_name,e.outcome??null,e.status_detail??null,D());return this.stmts.getStep.get(r.lastInsertRowid)}finishStep(e,r,n){return this.stmts.finishStep.run(r??null,n??null,D(),e),this.stmts.getStep.get(e)??null}listStepsForRun(e){return this.stmts.listStepsForRun.all(e)}listLatestStepOutcomesByState(e){let r=this.stmts.listLatestStepOutcomesByState.all(e),n={};for(let s of r)n[s.state_name]=s.outcome;return n}insertSubmittedPr(e){let r=this.stmts.insertSubmittedPr.run(e.repo,e.pr_url,e.issue_url??null,e.local_path??null,e.branch??null,e.head_sha??null,e.status??"watching",e.submitted_at??D(),e.last_known_state??null,e.created_by_run_id??null);return this.stmts.getSubmittedPr.get(r.lastInsertRowid)}listSubmittedPrs(e){return e?.status!==void 0?this.stmts.listSubmittedPrsByStatus.all(e.status):this.stmts.listSubmittedPrs.all()}getSubmittedPr(e){return this.stmts.getSubmittedPr.get(e)??null}findSubmittedPrByUrl(e){return this.stmts.findSubmittedPrByUrl.get(e)??null}insertStepArtifact(e){let r=this.stmts.insertStepArtifact.run(e.step_id,e.kind,e.path??null,e.content??null,e.sha??null,e.provider_call_mode??null,D());return this.stmts.getStepArtifact.get(r.lastInsertRowid)}insertExternalObject(e){let n=this.stmts.insertExternalObject.run(e.type,e.provider,e.project_id,e.run_id??null,e.external_id,e.url??null,e.status??null,e.metadata??null,e.last_seen_at??null,D()).changes===1;return{row:this.stmts.findExternalObjectByUnique.get(e.provider,e.type,e.external_id),inserted:n}}insertExternalSignal(e){let r=this.stmts.insertExternalSignal.run(e.object_id,e.kind,e.source??null,e.occurred_at??null,e.payload??null,e.signal_hash??null,null,D()),n=r.changes===1;return{row:e.signal_hash===void 0||e.signal_hash===null?this.stmts.getExternalSignal.get(r.lastInsertRowid):this.stmts.findExternalSignalByUnique.get(e.object_id,e.kind,e.signal_hash),inserted:n}}raiseAttention(e){let r=this.stmts.insertAttention.run(e.kind,e.severity??"warn",e.project_id??null,e.run_id??null,e.external_object_id??null,e.requires_user===!0?1:0,e.payload??null,D());return this.stmts.getAttention.get(r.lastInsertRowid)}acknowledgeAttention(e){return this.stmts.ackAttention.run(D(),e),this.stmts.getAttention.get(e)??null}upsertDurableMemory(e){let r=D();return this.stmts.upsertDurableMemory.run(e.project_id,e.type,e.name,e.description??null,e.body,r,r),this.stmts.getDurableMemoryByName.get(e.project_id,e.name)}getDurableMemoryByName(e,r){return this.stmts.getDurableMemoryByName.get(e,r)??null}deleteDurableMemory(e,r){return this.stmts.deleteDurableMemory.run(e,r).changes>0}listDurableMemory(e,r){return r!==void 0?this.stmts.listDurableMemoryByType.all(e,r):this.stmts.listDurableMemory.all(e)}indexDurableMemory(e,r){return r!==void 0&&r.length>0?this.stmts.listDurableMemory.all(e).filter(s=>r.includes(s.type)).map(({name:s,description:o,type:i,updated_at:a})=>({name:s,description:o,type:i,updated_at:a})):this.stmts.listDurableMemory.all(e).map(({name:n,description:s,type:o,updated_at:i})=>({name:n,description:s,type:o,updated_at:i}))}recordSessionSize(e){let r=this.stmts.insertSessionSize.run(e.team_name,e.alias,e.sessionid,e.input_tokens??null,e.cache_tokens??null,e.output_tokens??null,e.total_tokens??null,e.observed_at??D());return this.stmts.getSessionSize.get(r.lastInsertRowid)}latestSessionSizes(){return this.stmts.latestSessionSizes.all()}sessionSizeHistory(e,r,n=20){return this.stmts.sessionSizeHistory.all(e,r,n)}insertSessionEvent(e){let r=this.stmts.insertSessionEvent.run(e.run_id,e.step_id??null,e.kind,e.timestamp_ms,e.payload,e.payload_truncated??0,e.overflow_artifact_id??null);return this.stmts.getSessionEvent.get(r.lastInsertRowid)}listSessionEvents(e,r){return r!==void 0?this.stmts.listSessionEventsSince.all(e,r):this.stmts.listSessionEvents.all(e)}listSessionEventsSince(e,r=1e3){return this.stmts.listAllEventsSince.all(e,r)}latestAgentCall(e){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call' ORDER BY id DESC LIMIT 1").get(e);if(r===void 0)return null;try{let n=JSON.parse(r.payload);return typeof n.alias!="string"||typeof n.provider!="string"?null:{alias:n.alias,provider:n.provider,...typeof n.model=="string"?{model:n.model}:{}}}catch{return null}}agentCallTokenTotals(e){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call'").all(e),n=0,s=0,o=0;for(let i of r)try{let a=JSON.parse(i.payload);typeof a.tokens_in=="number"&&(n+=a.tokens_in),typeof a.tokens_out=="number"&&(s+=a.tokens_out),o+=1}catch{}return{totalInputTokens:n,totalOutputTokens:s,agentCallCount:o}}addRollupValue(e){this.stmts.upsertRollupStat.run(e.run_id,e.step_id??null,e.metric_kind,e.value,e.bucket_start_ms,e.bucket_end_ms,e.updated_at)}listRollupStats(e){return this.stmts.listRollupStats.all(e)}getRollupCursor(){return this.stmts.getRollupCursor.get("last_event_id")?.value??0}setRollupCursor(e){this.stmts.setRollupCursor.run("last_event_id",e)}insertDriftSignal(e){let r=this.stmts.insertDriftSignal.run(e.team_member_id,e.project_id??null,e.signal_kind,e.severity,e.description,e.detected_at,e.expires_at??null,e.payload??null);return this.stmts.getDriftSignal.get(r.lastInsertRowid)}listDriftSignals(e={}){return e.team_member_id!==void 0&&e.unacked?this.stmts.listUnackedDriftByMember.all(e.team_member_id):e.team_member_id!==void 0?this.stmts.listDriftByMember.all(e.team_member_id):e.project_id!==void 0?this.stmts.listDriftByProject.all(e.project_id):this.stmts.listAllDrift.all()}hasUnackedDriftSignal(e,r,n){return this.stmts.findUnackedDrift.get(e,r??null,n)!==void 0}acknowledgeDriftSignal(e){return this.stmts.ackDriftSignal.run(Date.now(),e),this.stmts.getDriftSignal.get(e)??null}insertInteractiveSession(e){let r=Date.now();return this.stmts.insertInteractiveSession.run(e.run_id,e.step_id,e.state_name,e.status,r,r),this.stmts.getInteractiveSessionByStepId.get(e.step_id)}getInteractiveSessionByStepId(e){return this.stmts.getInteractiveSessionByStepId.get(e)??null}getInteractiveSessionByRunAndState(e,r){return this.stmts.getInteractiveSessionByRunAndState.get(e,r)??null}setInteractiveAgentOutput(e,r,n){this.stmts.setInteractiveAgentOutput.run(r,n,Date.now(),e)}resumeInteractive(e,r,n){return this.resumeInteractiveTxn(e,r,n,D())}resumeEscalation(e,r){return this.resumeEscalationTxn(e,r,D())}}});import{realpathSync as XS}from"node:fs";import{resolve as GS}from"node:path";function Aa(t){let e=GS(t);try{return XS(e)}catch{return e}}var hf=E(()=>{"use strict"});import{platform as _f}from"node:os";function at(t){let e=new En;for(let r of t)e.registerAdapter(r);return e}var En,Ra=E(()=>{"use strict";hf();En=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=Aa(e.workspace);o=o.filter(a=>Aa(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=_f()==="darwin"||_f()==="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 gf}from"node:fs";import{createInterface as wf}from"node:readline";import{stat as VS}from"node:fs/promises";import{homedir as KS}from"node:os";async function*De(t){let e=gf(t,{encoding:"utf-8"}),r=wf({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=gf(t,{encoding:"utf-8"}),s=wf({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 VS(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,Mt=E(()=>{"use strict";be=KS()});import{readdir as Ls,stat as yf,unlink as YS}from"node:fs/promises";import{join as jr,basename as Ef}from"node:path";function zS(t){return t==="file-history-snapshot"||t==="progress"||t==="system"||t==="queue-operation"}function ZS(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 bf(t){let e=0,r=0,n=0,s=0,o=0,i=0,a;for await(let l of De(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 Cs,Tf=E(()=>{"use strict";Mt();Cs=class{name="claude";claudeDir;projectsDir;constructor(e={}){this.claudeDir=e.claudeDir||jr(be,".claude"),this.projectsDir=jr(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await Ls(this.projectsDir)}catch{return e}for(let n of r){let s=jr(this.projectsDir,n);if(!(await yf(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await Ls(s)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=Ef(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=jr(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(!zS(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 bf(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 De(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:ZS(h)});continue}if(h.type==="user"&&h.message){if(h.isMeta)continue;let g=new Date(h.timestamp||0),_=h.message.content;if(typeof _=="string"){if(_.includes("<command-name>")||_.includes("<local-command-"))continue;u||(u=G(_.trim(),80)),d=G(_.trim(),80),s.push({role:"user",timestamp:g,content:ce(_.trim())})}else if(Array.isArray(_)){for(let T of _)if(T.type==="tool_result"){let S=typeof T.content=="string"?ce(T.content):JSON.stringify(T.content);s.push({role:"tool_result",timestamp:g,content:S,toolCallId:T.tool_use_id})}}}if(h.type==="assistant"&&h.message){h.message.model&&(l=h.message.model);let g=new Date(h.timestamp||0),_=h.message.content;if(Array.isArray(_))for(let T of _)T.type==="text"&&T.text?s.push({role:"assistant",timestamp:g,content:ce(T.text),model:h.message.model}):T.type==="tool_use"?s.push({role:"tool_use",timestamp:g,content:T.name||"unknown tool",toolName:T.name,toolInput:JSON.stringify(T.input,null,2),toolCallId:T.id,model:h.message.model}):T.type==="thinking"&&T.thinking&&s.push({role:"thinking",timestamp:g,content:T.thinking})}}if(!o)return null;let p=await bf(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 Ls(this.projectsDir)}catch{return null}let n=[];for(let i of r){let a=jr(this.projectsDir,i);if(!(await yf(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await Ls(a)}catch{continue}for(let u of c){if(!u.endsWith(".jsonl"))continue;let d=Ef(u,".jsonl");/^[0-9a-f]{8}-/.test(d)&&n.push({filePath:jr(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 Ms(t){return"'"+t.replace(/'/g,"'\\''")+"'"}function ek(t,e,r){if(!r)return"";let n=t.tools[e]??Oa[e],s=n?.profiles?.[r]?.flags??Oa[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 Sf(t,e){return!!t.tools[e]}function kf(t,e,r,n,s){let o=t.tools[e]??Oa[e],i;if(o?.agent){let l=Ms(n);i=o.agent.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,l)}else{let l=QS[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(Ms).join(" ");i=`printf '%s\\n' ${Ms(n)} | ${u}`}else i=c.map(Ms).join(" ")}let a=ek(t,e,s);return a&&(i+=" "+a),i}var Oa,QS,vf=E(()=>{"use strict";Oa={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:""}}}},QS={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 If(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 $f=E(()=>{"use strict"});var tk,Ie,Ds,yt=E(()=>{"use strict";tk="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: ${tk}`,Ds=`send this exact lmctl seed instruction: "${Ie}"`});import{spawn as Nf}from"node:child_process";import{mkdirSync as rk}from"node:fs";var La,je,Dt=E(()=>{"use strict";vf();$f();yt();La=class t extends Error{cancelReason;constructor(e,r){super(e),this.name="TurnAbortError",this.cancelReason=r,Object.setPrototypeOf(this,t.prototype)}},je=class t{name;capabilities;injection;provider;binary;seedArgs;seedStdin;resumeTemplate;startTemplate;transportFn;constructor(e){this.name=e.provider.name,this.provider=e.provider,this.capabilities=e.capabilities,this.injection=e.injection,this.binary=e.binary,this.seedArgs=e.seedArgs,this.seedStdin=e.seedStdin,this.resumeTemplate=e.resumeTemplate,this.startTemplate=e.startTemplate,this.transportFn=e.transport}discover(){return this.provider.discoverSessions()}load(e){return this.provider.loadSession(e)}resolvePath(e){return this.provider.resolveSessionPath(e)}delete(e){return this.provider.deleteSession(e)}getWatchPaths(){return this.provider.getWatchPaths?.()??[]}seedArgsFor(e){let r=e?.prompt;return r===void 0?this.seedArgs:this.seedArgs.map(n=>n===Ie?r:n)}seed(e,r){return rk(e,{recursive:!0}),new Promise(n=>{let s;try{s=Nf(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:Ds,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${e}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(e,r){if(r.userConfig&&Sf(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 La("Turn cancelled","external"):p}),m=new Promise(p=>{l=p});return Promise.race([f,m])}runOneShotAgent(e,r,n){let s=kf(r.userConfig,this.name,r.sessionId,e,r.profile),o=Date.now();return new Promise((i,a)=>{let l=If(r.env),c=Nf(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 Fs(t,e){let r;if(e&&typeof e=="object"){let n=e.code;typeof n=="number"&&(r=n)}return new bt(t,r,e)}var Je,ye,Et,Ps,bt,Ar=E(()=>{"use strict";Je=class extends Error{constructor(e,r){super(e,r),this.name=this.constructor.name}},ye=class extends Je{},Et=class extends Je{exitCode;signal;stderr;constructor(e,r,n=null,s){super(e),this.exitCode=r,this.signal=n,this.stderr=s}},Ps=class extends Je{line;constructor(e,r,n){super(e,{cause:n}),this.line=r}},bt=class extends Je{rpcCode;rpcData;constructor(e,r,n){super(e),r!==void 0&&(this.rpcCode=r),n!==void 0&&(this.rpcData=n)}}});import*as Ma from"node:child_process";function sk(t){if(typeof Ma.spawnSync=="function")try{Ma.spawnSync("taskkill",["/T","/F","/PID",String(t)],{windowsHide:!0})}catch{}}function xf(t){return t.exitCode!==null||t.signalCode!==null}function Ca(t,e){return xf(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 Qe(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??sk;if(xf(t))return{signal:"natural",elapsedMs:Date.now()-r};if(n&&t.stdin&&!t.stdin.destroyed)try{t.stdin.end()}catch{}if(await Ca(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 Ca(t,o))return{signal:"SIGTERM",elapsedMs:Date.now()-r};if(i!=="win32")try{t.kill("SIGKILL")}catch{}return await Ca(t,nk)?{signal:"SIGKILL",elapsedMs:Date.now()-r}:{signal:"abandoned",elapsedMs:Date.now()-r}}var nk,Us=E(()=>{"use strict";nk=1e3});import{readFileSync as ok,appendFileSync as ik,mkdirSync as ak,existsSync as gB,readdirSync as wB,unlinkSync as yB}from"node:fs";import{join as Rf,dirname as lk}from"node:path";import{homedir as Of}from"node:os";function lt(){if(Lf)return!0;let t=Date.now();return t-Af>=ck&&(jf=mk(),Af=t),jf}function dk(){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 Pt(t,e){if(e?.verbose){if(!Lf)return}else if(!e?.always&&!lt())return;try{fk();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};ik(Ws,JSON.stringify(r)+`
924
+ `),clearAgentInflightOlderThan:t.prepare("DELETE FROM agent_inflight WHERE started_at < ?")}}function JS(t,e){return e===void 0?{resumed:!1,reason:t}:{resumed:!1,reason:t,valid:e}}var ja,Me=E(()=>{"use strict";Na();yn();ja=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;replaceTeamConnectionsTxn;tryAcquireAgentInflightTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=HS(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)=>JS("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!==Os)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!==wn&&!a.includes(n))return{resumed:!1,reason:df};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){mf(e.name,e.definition,i=>this.getWorkflowByName(i));let r=this.stmts.insertWorkflow.run(e.name,e.version??1,e.definition_schema_version??1,e.definition,D()),n=this.getWorkflow(Number(r.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(n.id,n.version,e.definition,e.author??null,D());this.stmts.updateWorkflowActiveVersion.run(s.lastInsertRowid,n.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,n.id);let o=this.getWorkflow(n.id);return this.syncWorkflowTriggers(n.id,e.definition),o}upsertWorkflow(e){mf(e.name,e.definition,i=>this.getWorkflowByName(i));let r=this.getWorkflowByName(e.name);if(r===null)return this.insertWorkflow({name:e.name,definition_schema_version:e.definition_schema_version,definition:e.definition,author:e.author,source_uri:e.source_uri,source_sha256:e.source_sha256});let s=(this.stmts.getLatestWorkflowVersion.get(r.id)?.version??r.version)+1,o=this.stmts.insertWorkflowVersion.run(r.id,s,e.definition,e.author??null,D());return this.stmts.updateWorkflowActiveVersionDefinitionAndVersion.run(Number(o.lastInsertRowid),e.definition,e.definition_schema_version??r.definition_schema_version,s,r.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,r.id),this.syncWorkflowTriggers(r.id,e.definition),this.getWorkflow(r.id)}insertCompositionUnit(e){this.stmts.insertCompositionUnit.run(e.name,e.version,e.lang,e.source,e.source_sha,e.compiled_workflow_version_id,D())}getWorkflow(e){return this.stmts.getWorkflow.get(e)??null}getWorkflowByName(e,r){return(r===void 0?this.stmts.findWorkflowLatest.get(e):this.stmts.findWorkflowVersion.get(e,r))??null}findWorkflowByName(e,r){return this.getWorkflowByName(e,r)}insertWorkflowVersion(e,r,n){let o=(this.stmts.getLatestWorkflowVersion.get(e)?.version??0)+1,i=this.stmts.insertWorkflowVersion.run(e,o,r,n??null,D());return this.stmts.getWorkflowVersion.get(i.lastInsertRowid)}activateWorkflowVersion(e,r){let n=this.getWorkflowVersionById(r);if(n===null||n.workflow_id!==e)return null;let s=1;try{let o=JSON.parse(n.definition);typeof o.definition_schema_version=="number"&&(s=o.definition_schema_version)}catch{}return this.stmts.updateWorkflowActiveVersionAndDefinition.run(r,n.definition,s,e),this.syncWorkflowTriggers(e,n.definition),this.getWorkflow(e)}getWorkflowVersionById(e){return this.stmts.getWorkflowVersion.get(e)??null}listWorkflowVersions(e){return this.stmts.listWorkflowVersions.all(e)}upsertTriggerInstance(e){return this.stmts.upsertTriggerInstance.run(e.workflow_id,e.trigger_id,e.trigger_type,e.parameters,e.enabled===!1?0:1,D()),this.stmts.getTriggerInstanceByWorkflowAndId.get(e.workflow_id,e.trigger_id)}listTriggerInstancesForWorkflow(e){return this.stmts.listTriggerInstancesForWorkflow.all(e)}listEnabledTriggerInstances(){return this.stmts.listEnabledTriggerInstances.all()}setTriggerCursor(e,r){return this.stmts.setTriggerCursor.run(r,D(),e),this.stmts.getTriggerInstance.get(e)??null}setTriggerFailure(e,r){return this.stmts.setTriggerFailure.run(D(),r,e),this.stmts.getTriggerInstance.get(e)??null}syncWorkflowTriggers(e,r){let n;try{n=JSON.parse(r)}catch{return}if(n===null||typeof n!="object"||Array.isArray(n))return;let s=n.triggers;if(Array.isArray(s))for(let o of s){if(o===null||typeof o!="object"||Array.isArray(o))continue;let i=o;typeof i.id!="string"||i.id.length===0||typeof i.type!="string"||i.type.length===0||this.upsertTriggerInstance({workflow_id:e,trigger_id:i.id,trigger_type:i.type,parameters:JSON.stringify(i.parameters??{})})}}insertTeam(e){let r=this.stmts.insertTeam.run(e.name,D());return this.stmts.getTeam.get(r.lastInsertRowid)}getTeam(e){return this.stmts.getTeam.get(e)??null}findTeamByName(e){return this.stmts.findTeamByName.get(e)??null}listTeams(){return this.stmts.listTeams.all()}insertTeamMember(e){let r=this.stmts.insertTeamMember.run(e.team_id,e.alias,e.role??"agent",e.provider,e.model??null,e.sessionid??null,e.sessiondir,D());return this.stmts.getTeamMember.get(r.lastInsertRowid)}listTeamMembers(e){return this.stmts.listTeamMembers.all(e)}findTeamMemberByAlias(e,r){return this.stmts.findTeamMemberByAlias.get(e,r)??null}updateTeamMemberSession(e,r){return this.stmts.updateTeamMemberSession.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberState(e,r,n){return this.stmts.setMemberState.run(r,n??null,D(),e),this.stmts.getTeamMember.get(e)??null}listMembersInState(e){return this.stmts.listMembersInState.all(e)}setMemberPromptSnapshot(e,r){return this.stmts.setMemberPromptSnapshot.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberProviderResolved(e,r){return this.stmts.setMemberProviderResolved.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberRolePrompt(e,r){return this.stmts.setMemberRolePrompt.run(r,e),this.stmts.getTeamMember.get(e)??null}updateTeamMemberMeta(e,r){let n=this.stmts.getTeamMember.get(e);if(n===void 0)return null;let s=Object.prototype.hasOwnProperty.call(r,"role_prompt"),o=Object.prototype.hasOwnProperty.call(r,"model"),i=Object.prototype.hasOwnProperty.call(r,"provider");return this.stmts.updateTeamMemberMeta.run(s?r.role_prompt??null:n.role_prompt,o?r.model??null:n.model,i?r.provider??n.provider:n.provider,e),this.stmts.getTeamMember.get(e)??null}insertTeamMemberCompanion(e){let r=this.stmts.insertTeamMemberCompanion.run(e.interpreter_id,e.companion_id,D());return this.stmts.getTeamMemberCompanion.get(r.lastInsertRowid)}insertProject(e){let r=this.stmts.insertProject.run(e.name,e.description??null,e.local_path,e.workflow_name,e.team_id,e.default_branch??null,e.intake_config??null,e.test_argv??null,e.test_command??null,e.durable_memory_mode??"folder",D());return this.stmts.getProject.get(r.lastInsertRowid)}listProjects(){return this.stmts.listProjects.all()}getProject(e){return this.stmts.getProject.get(e)??null}findProjectByName(e){return this.stmts.findProjectByName.get(e)??null}setProjectIntakeConfig(e,r){return this.stmts.setProjectIntakeConfig.run(r,e),this.stmts.getProject.get(e)??null}updateProjectSettings(e,r){let n=this.stmts.getProject.get(e);if(n===void 0)return null;let s=Object.prototype.hasOwnProperty.call(r,"local_path"),o=Object.prototype.hasOwnProperty.call(r,"durable_memory_mode"),i=Object.prototype.hasOwnProperty.call(r,"default_branch"),a=Object.prototype.hasOwnProperty.call(r,"intake_config");return this.stmts.updateProjectSettings.run(s?r.local_path:n.local_path,o?r.durable_memory_mode:n.durable_memory_mode,i?r.default_branch??null:n.default_branch,a?r.intake_config??null:n.intake_config,e),this.stmts.getProject.get(e)??null}listProjectsWithIntakeEnabled(){return this.stmts.listProjectsWithIntakeConfig.all().filter(e=>{if(e.intake_config===null)return!1;try{let r=JSON.parse(e.intake_config);return typeof r=="object"&&r!==null&&!Array.isArray(r)&&r.scan_github_issues===!0}catch{return!1}})}getProjectByJob(e){return this.stmts.getProjectByJob.get(e)??null}insertProjectWorkflow(e){let r=e.condition??null,n=this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,r);if(n!==void 0)return n;let s=this.stmts.insertProjectWorkflow.run(e.project_id,e.workflow_id,r,e.parameters_override??null,e.enabled===!1?0:1,e.priority??100,D());return s.changes===1?this.stmts.getProjectWorkflow.get(s.lastInsertRowid):this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,r)}getProjectWorkflow(e){return this.stmts.getProjectWorkflow.get(e)??null}listProjectWorkflows(e,r={}){return r.enabled_only===!0?this.stmts.listEnabledProjectWorkflows.all(e):this.stmts.listProjectWorkflows.all(e)}removeProjectWorkflow(e){return this.stmts.removeProjectWorkflow.run(e).changes>0}setProjectWorkflowEnabled(e,r){return this.stmts.setProjectWorkflowEnabled.run(r?1:0,e),this.getProjectWorkflow(e)}createIssue(e){let r=D(),n=this.stmts.createIssue.run(e.project_id,e.title,e.body,e.severity??"medium",e.labels??null,e.ai_test_path??null,e.source_run_id??null,r,r);return this.stmts.getIssue.get(n.lastInsertRowid)}getIssue(e){return this.stmts.getIssue.get(e)??null}listIssues(e,r={}){return this.stmts.listIssuesForProject.all(e).filter(n=>!(r.status!==void 0&&!r.status.includes(n.status)||r.severity!==void 0&&!r.severity.includes(n.severity)||r.ai_test_path!==void 0&&n.ai_test_path!==r.ai_test_path))}claimNextIssue(e,r){return this.stmts.claimNextIssue.get(r,D(),e)??null}claimIssue(e,r){return this.stmts.claimIssue.get(r,D(),e)??null}closeIssue(e,r,n){let s=D(),o=this.stmts.closeIssue.get(r,n??null,s,s,e);if(o===void 0)throw new Error(`issue not found: ${e}`);return o}reopenIssue(e,r){let n=this.stmts.reopenIssue.get(r,D(),e);if(n===void 0)throw this.getIssue(e)===null?new Error(`issue not found: ${e}`):new Error(`issue ${e} is not closed`);return n}updateIssue(e,r){let n=this.getIssue(e);if(n===null)throw new Error(`issue not found: ${e}`);let s=Object.prototype.hasOwnProperty.call(r,"labels"),o=Object.prototype.hasOwnProperty.call(r,"ai_test_path"),i=this.stmts.updateIssue.get(r.title??n.title,r.body??n.body,r.severity??n.severity,s?r.labels??null:n.labels,o?r.ai_test_path??null:n.ai_test_path,D(),e);if(i===void 0)throw new Error(`issue not found: ${e}`);return i}listWorkflows(){return this.stmts.listWorkflows.all()}getOrCreateWebuiSession(e,r){let n=this.stmts.getWebuiSession.get(e);if(n!==void 0)return n;let s=D();return this.stmts.insertWebuiSession.run(e,r,"N1",null,null,null,null,"authenticated",s,s),this.stmts.getWebuiSession.get(e)}getWebuiSession(e){return this.stmts.getWebuiSession.get(e)??null}updateWebuiSessionTransition(e,r,n,s,o){if(this.stmts.updateWebuiSessionTransition.run(r,n,s,o,D(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}setWebuiSessionChatbot(e,r){if(this.stmts.setWebuiSessionChatbot.run(r,D(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}createChatbotSession(e,r){let n=WS(),s=D();return this.stmts.insertChatbotSession.run(n,e,r??null,s,s,"active"),this.stmts.getChatbotSession.get(n)}getChatbotSession(e){return this.stmts.getChatbotSession.get(e)??null}listChatbotSessions(e){return this.stmts.listChatbotSessionsForUser.all(e)}appendChatbotMessage(e,r,n,s){let o=D(),i=this.stmts.insertChatbotMessage.run(e,r,n,s??null,o);return this.stmts.touchChatbotSession.run(o,e),this.stmts.getChatbotMessage.get(i.lastInsertRowid)}listChatbotMessages(e){return this.stmts.listChatbotMessages.all(e)}getConfig(e){return this.stmts.getConfig.get(e)?.value??null}setConfig(e,r){this.stmts.upsertConfig.run(e,r,D())}getConfigAll(){let e=this.stmts.listConfig.all(),r={};for(let n of e)r[n.key]=n.value;return r}enqueueJob(e){let r=this.stmts.insertJob.run(e.project_id,e.workflow_id_override??null,e.source,e.source_ref??null,e.payload??null,e.priority??0,e.available_at??D(),e.dedupe_key??null,e.concurrency_key??null,D());if(r.changes===1)return this.stmts.getJob.get(r.lastInsertRowid);if(e.dedupe_key===void 0||e.dedupe_key===null)throw new Error("job insert ignored without dedupe key");return this.stmts.findJobByDedupe.get(e.source,e.dedupe_key)}claimNextJob(e){let r=D(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimTxn(e.worker_id,n,r)}claimNextJobWithConcurrency(e){let r=D(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimWithConcurrencyTxn(e.worker_id,n,r,e.evaluator)}claimJobByIdWithConcurrency(e){let r=D(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimByIdWithConcurrencyTxn(e.job_id,e.worker_id,n,r,e.evaluator)}releaseJob(e,r,n){let s=r==="queued"||r==="running"?null:D();return this.stmts.releaseJob.run(r,n??null,s,e),this.getJob(e)}getJob(e){return this.stmts.getJob.get(e)??null}findJobBySourceAndDedupe(e,r){return this.stmts.findJobByDedupe.get(e,r)??null}insertRun(e){let r=this.getWorkflow(e.workflow_id);if(r===null)throw new Error(`workflow not found: ${e.workflow_id}`);let n=this.stmts.insertRun.run(e.job_id,e.workflow_id,e.team_id,e.current_state??null,r.active_version_id,e.parent_run_id??null,D()),s=this.stmts.getRun.get(n.lastInsertRowid);return(e.parent_run_id===void 0||e.parent_run_id===null)&&this.stmts.setJobRun.run(s.id,e.job_id),s}setJobRun(e,r){return this.stmts.setJobRun.run(r,e),this.getJob(e)}insertPromptDispatch(e){return this.stmts.insertPromptDispatch.run(e.prompt_id,e.project_id,e.job_id,e.text,e.context_json??null,D()),this.stmts.getPromptDispatch.get(e.prompt_id)}getPromptDispatch(e){return this.stmts.getPromptDispatch.get(e)??null}setPromptDispatchCompleted(e,r){return this.stmts.setPromptDispatchCompleted.run(r??D(),e),this.getPromptDispatch(e)}getWorkspace(e){return this.stmts.getWorkspace.get(e)??null}ensureWorkspace(e={}){let r=e.id??"default";this.stmts.ensureWorkspace.run(r,e.name??"Default workspace",e.idleThresholdMs??6e5,D());let n=this.getWorkspace(r);if(n===null)throw new Error(`workspace ${r} missing after upsert`);return n}listWebProjectsActive(e){return this.stmts.listWebProjectsActive.all(e)}getWebProject(e){return this.stmts.getWebProject.get(e)??null}insertWebProject(e){let r=D(),n=this.stmts.insertWebProject.run(e.workspace_id,e.name,e.repo_path,e.config_json??null,e.linked_v4_project_id??null,r,r),s=Number(n.lastInsertRowid),o=this.getWebProject(s);if(o===null)throw new Error(`web_project ${s} missing after insert`);return o}updateWebProject(e){let r=this.getWebProject(e.id);return r===null||r.deleted_at!==null?null:(this.stmts.updateWebProject.run(e.name??r.name,e.config_json===void 0?r.config_json:e.config_json,D(),e.id),this.getWebProject(e.id))}softDeleteWebProject(e){return this.stmts.softDeleteWebProject.run(D(),e).changes===1}loadMailboxCursor(e,r){return this.stmts.loadMailboxCursor.get(e,r)??null}saveMailboxCursor(e){this.stmts.saveMailboxCursor.run(e.user_id,e.mailbox_key,e.last_processed_version_id,e.last_processed_seq??null,e.last_processed_at)}addUsage(e){this.stmts.addUsage.run(e.user_id,e.device_id,e.period,e.put,e.get,e.list,e.updated_at)}loadUsage(e,r,n){return this.stmts.loadUsage.get(e,r,n)??null}sumUsageForPeriod(e,r){let n=this.stmts.sumUsageForPeriod.get(e,r);return{put:n?.put??0,get:n?.get??0,list:n?.list??0}}upsertRootTeam(e){this.stmts.upsertRootTeam.run(e.teamfile_path,e.name,e.raw_text,e.raw_sha256,e.registered_at,e.last_seeded_at)}getRootTeam(e){return this.stmts.getRootTeam.get(e)??null}listRootTeams(){return this.stmts.listRootTeams.all()}replaceTeamConnections(e,r){this.replaceTeamConnectionsTxn(e,r)}listTeamConnections(e){return this.stmts.listTeamConnections.all(e)}insertTeamChatLog(e){let r=this.stmts.insertTeamChatLog.run(e.root_teamfile,e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias,e.message,e.response,e.status,e.error_detail,e.truncated,e.created_at);return Number(r.lastInsertRowid)}listTeamChatLog(e){return this.stmts.listTeamChatLog.all(e)}listTeamChatLogSinceId(e,r=500){return this.stmts.listTeamChatLogSinceId.all(e,Math.max(1,Math.trunc(r)))}getMaxTeamChatLogId(){return this.stmts.getMaxTeamChatLogId.get()?.max_id??0}loadTeamChatLogCursor(e){return this.stmts.loadTeamChatLogCursor.get(e)??null}saveTeamChatLogCursor(e){this.stmts.saveTeamChatLogCursor.run(e.cursor_key,e.last_pushed_id,e.updated_at)}updateTeamChatLogResponse(e,r){this.stmts.updateTeamChatLogResponse.run(r.response,r.status,r.error_detail,r.truncated,e)}getAgentInflight(e,r){return this.stmts.getAgentInflight.get(e,r)??null}tryAcquireAgentInflight(e,r){return this.tryAcquireAgentInflightTxn(e,r)}clearAgentInflight(e,r){this.stmts.clearAgentInflight.run(e,r)}releaseAgentInflight(e){this.db.exec("BEGIN IMMEDIATE");try{let r=this.getAgentInflight(e.receiver_teamfile,e.receiver_alias);if(r===null||r.sender_teamfile!==e.sender_teamfile||r.sender_alias!==e.sender_alias)return this.db.exec("COMMIT"),!1;if(r.active_count<=1)return this.stmts.clearAgentInflightIfSender.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias),this.db.exec("COMMIT"),!0;let n=this.stmts.decrementAgentInflight.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias);return this.db.exec("COMMIT"),n.changes===1}catch(r){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),r}}clearAgentInflightOlderThan(e){return this.stmts.clearAgentInflightOlderThan.run(e).changes}getRun(e){return this.stmts.getRun.get(e)??null}setRunCurrentState(e,r){return this.stmts.setRunCurrentState.run(r,e),this.stmts.getRun.get(e)??null}setRunPausedState(e,r,n){return this.stmts.setRunPausedState.run(r,n,e),this.stmts.getRun.get(e)??null}setRunPendingEscalationDecision(e,r){return this.stmts.setRunPendingEscalationDecision.run(r,e),this.stmts.getRun.get(e)??null}setRunTerminalState(e,r){return this.stmts.setRunTerminalState.run(r,D(),e),this.stmts.getRun.get(e)??null}pauseJob(e){return this.stmts.pauseJob.run(e),this.getJob(e)}resumeRun(e,r){return this.resumeRunTxn(e,r,D())}insertStep(e){let r=this.stmts.insertStep.run(e.run_id,e.parent_step_id??null,e.state_name,e.outcome??null,e.status_detail??null,D());return this.stmts.getStep.get(r.lastInsertRowid)}finishStep(e,r,n){return this.stmts.finishStep.run(r??null,n??null,D(),e),this.stmts.getStep.get(e)??null}listStepsForRun(e){return this.stmts.listStepsForRun.all(e)}listLatestStepOutcomesByState(e){let r=this.stmts.listLatestStepOutcomesByState.all(e),n={};for(let s of r)n[s.state_name]=s.outcome;return n}insertSubmittedPr(e){let r=this.stmts.insertSubmittedPr.run(e.repo,e.pr_url,e.issue_url??null,e.local_path??null,e.branch??null,e.head_sha??null,e.status??"watching",e.submitted_at??D(),e.last_known_state??null,e.created_by_run_id??null);return this.stmts.getSubmittedPr.get(r.lastInsertRowid)}listSubmittedPrs(e){return e?.status!==void 0?this.stmts.listSubmittedPrsByStatus.all(e.status):this.stmts.listSubmittedPrs.all()}getSubmittedPr(e){return this.stmts.getSubmittedPr.get(e)??null}findSubmittedPrByUrl(e){return this.stmts.findSubmittedPrByUrl.get(e)??null}insertStepArtifact(e){let r=this.stmts.insertStepArtifact.run(e.step_id,e.kind,e.path??null,e.content??null,e.sha??null,e.provider_call_mode??null,D());return this.stmts.getStepArtifact.get(r.lastInsertRowid)}insertExternalObject(e){let n=this.stmts.insertExternalObject.run(e.type,e.provider,e.project_id,e.run_id??null,e.external_id,e.url??null,e.status??null,e.metadata??null,e.last_seen_at??null,D()).changes===1;return{row:this.stmts.findExternalObjectByUnique.get(e.provider,e.type,e.external_id),inserted:n}}insertExternalSignal(e){let r=this.stmts.insertExternalSignal.run(e.object_id,e.kind,e.source??null,e.occurred_at??null,e.payload??null,e.signal_hash??null,null,D()),n=r.changes===1;return{row:e.signal_hash===void 0||e.signal_hash===null?this.stmts.getExternalSignal.get(r.lastInsertRowid):this.stmts.findExternalSignalByUnique.get(e.object_id,e.kind,e.signal_hash),inserted:n}}raiseAttention(e){let r=this.stmts.insertAttention.run(e.kind,e.severity??"warn",e.project_id??null,e.run_id??null,e.external_object_id??null,e.requires_user===!0?1:0,e.payload??null,D());return this.stmts.getAttention.get(r.lastInsertRowid)}acknowledgeAttention(e){return this.stmts.ackAttention.run(D(),e),this.stmts.getAttention.get(e)??null}upsertDurableMemory(e){let r=D();return this.stmts.upsertDurableMemory.run(e.project_id,e.type,e.name,e.description??null,e.body,r,r),this.stmts.getDurableMemoryByName.get(e.project_id,e.name)}getDurableMemoryByName(e,r){return this.stmts.getDurableMemoryByName.get(e,r)??null}deleteDurableMemory(e,r){return this.stmts.deleteDurableMemory.run(e,r).changes>0}listDurableMemory(e,r){return r!==void 0?this.stmts.listDurableMemoryByType.all(e,r):this.stmts.listDurableMemory.all(e)}indexDurableMemory(e,r){return r!==void 0&&r.length>0?this.stmts.listDurableMemory.all(e).filter(s=>r.includes(s.type)).map(({name:s,description:o,type:i,updated_at:a})=>({name:s,description:o,type:i,updated_at:a})):this.stmts.listDurableMemory.all(e).map(({name:n,description:s,type:o,updated_at:i})=>({name:n,description:s,type:o,updated_at:i}))}recordSessionSize(e){let r=this.stmts.insertSessionSize.run(e.team_name,e.alias,e.sessionid,e.input_tokens??null,e.cache_tokens??null,e.output_tokens??null,e.total_tokens??null,e.observed_at??D());return this.stmts.getSessionSize.get(r.lastInsertRowid)}latestSessionSizes(){return this.stmts.latestSessionSizes.all()}sessionSizeHistory(e,r,n=20){return this.stmts.sessionSizeHistory.all(e,r,n)}insertSessionEvent(e){let r=this.stmts.insertSessionEvent.run(e.run_id,e.step_id??null,e.kind,e.timestamp_ms,e.payload,e.payload_truncated??0,e.overflow_artifact_id??null);return this.stmts.getSessionEvent.get(r.lastInsertRowid)}listSessionEvents(e,r){return r!==void 0?this.stmts.listSessionEventsSince.all(e,r):this.stmts.listSessionEvents.all(e)}listSessionEventsSince(e,r=1e3){return this.stmts.listAllEventsSince.all(e,r)}latestAgentCall(e){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call' ORDER BY id DESC LIMIT 1").get(e);if(r===void 0)return null;try{let n=JSON.parse(r.payload);return typeof n.alias!="string"||typeof n.provider!="string"?null:{alias:n.alias,provider:n.provider,...typeof n.model=="string"?{model:n.model}:{}}}catch{return null}}agentCallTokenTotals(e){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call'").all(e),n=0,s=0,o=0;for(let i of r)try{let a=JSON.parse(i.payload);typeof a.tokens_in=="number"&&(n+=a.tokens_in),typeof a.tokens_out=="number"&&(s+=a.tokens_out),o+=1}catch{}return{totalInputTokens:n,totalOutputTokens:s,agentCallCount:o}}addRollupValue(e){this.stmts.upsertRollupStat.run(e.run_id,e.step_id??null,e.metric_kind,e.value,e.bucket_start_ms,e.bucket_end_ms,e.updated_at)}listRollupStats(e){return this.stmts.listRollupStats.all(e)}getRollupCursor(){return this.stmts.getRollupCursor.get("last_event_id")?.value??0}setRollupCursor(e){this.stmts.setRollupCursor.run("last_event_id",e)}insertDriftSignal(e){let r=this.stmts.insertDriftSignal.run(e.team_member_id,e.project_id??null,e.signal_kind,e.severity,e.description,e.detected_at,e.expires_at??null,e.payload??null);return this.stmts.getDriftSignal.get(r.lastInsertRowid)}listDriftSignals(e={}){return e.team_member_id!==void 0&&e.unacked?this.stmts.listUnackedDriftByMember.all(e.team_member_id):e.team_member_id!==void 0?this.stmts.listDriftByMember.all(e.team_member_id):e.project_id!==void 0?this.stmts.listDriftByProject.all(e.project_id):this.stmts.listAllDrift.all()}hasUnackedDriftSignal(e,r,n){return this.stmts.findUnackedDrift.get(e,r??null,n)!==void 0}acknowledgeDriftSignal(e){return this.stmts.ackDriftSignal.run(Date.now(),e),this.stmts.getDriftSignal.get(e)??null}insertInteractiveSession(e){let r=Date.now();return this.stmts.insertInteractiveSession.run(e.run_id,e.step_id,e.state_name,e.status,r,r),this.stmts.getInteractiveSessionByStepId.get(e.step_id)}getInteractiveSessionByStepId(e){return this.stmts.getInteractiveSessionByStepId.get(e)??null}getInteractiveSessionByRunAndState(e,r){return this.stmts.getInteractiveSessionByRunAndState.get(e,r)??null}setInteractiveAgentOutput(e,r,n){this.stmts.setInteractiveAgentOutput.run(r,n,Date.now(),e)}resumeInteractive(e,r,n){return this.resumeInteractiveTxn(e,r,n,D())}resumeEscalation(e,r){return this.resumeEscalationTxn(e,r,D())}}});import{realpathSync as XS}from"node:fs";import{resolve as GS}from"node:path";function Ra(t){let e=GS(t);try{return XS(e)}catch{return e}}var hf=E(()=>{"use strict"});import{platform as _f}from"node:os";function at(t){let e=new En;for(let r of t)e.registerAdapter(r);return e}var En,Oa=E(()=>{"use strict";hf();En=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=Ra(e.workspace);o=o.filter(a=>Ra(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=_f()==="darwin"||_f()==="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 gf}from"node:fs";import{createInterface as wf}from"node:readline";import{stat as VS}from"node:fs/promises";import{homedir as KS}from"node:os";async function*De(t){let e=gf(t,{encoding:"utf-8"}),r=wf({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=gf(t,{encoding:"utf-8"}),s=wf({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 VS(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,Mt=E(()=>{"use strict";be=KS()});import{readdir as Ls,stat as yf,unlink as YS}from"node:fs/promises";import{join as jr,basename as Ef}from"node:path";function zS(t){return t==="file-history-snapshot"||t==="progress"||t==="system"||t==="queue-operation"}function ZS(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 bf(t){let e=0,r=0,n=0,s=0,o=0,i=0,a;for await(let l of De(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 Cs,Tf=E(()=>{"use strict";Mt();Cs=class{name="claude";claudeDir;projectsDir;constructor(e={}){this.claudeDir=e.claudeDir||jr(be,".claude"),this.projectsDir=jr(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await Ls(this.projectsDir)}catch{return e}for(let n of r){let s=jr(this.projectsDir,n);if(!(await yf(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await Ls(s)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=Ef(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=jr(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(!zS(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 bf(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 De(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:ZS(h)});continue}if(h.type==="user"&&h.message){if(h.isMeta)continue;let g=new Date(h.timestamp||0),_=h.message.content;if(typeof _=="string"){if(_.includes("<command-name>")||_.includes("<local-command-"))continue;u||(u=G(_.trim(),80)),d=G(_.trim(),80),s.push({role:"user",timestamp:g,content:ce(_.trim())})}else if(Array.isArray(_)){for(let T of _)if(T.type==="tool_result"){let S=typeof T.content=="string"?ce(T.content):JSON.stringify(T.content);s.push({role:"tool_result",timestamp:g,content:S,toolCallId:T.tool_use_id})}}}if(h.type==="assistant"&&h.message){h.message.model&&(l=h.message.model);let g=new Date(h.timestamp||0),_=h.message.content;if(Array.isArray(_))for(let T of _)T.type==="text"&&T.text?s.push({role:"assistant",timestamp:g,content:ce(T.text),model:h.message.model}):T.type==="tool_use"?s.push({role:"tool_use",timestamp:g,content:T.name||"unknown tool",toolName:T.name,toolInput:JSON.stringify(T.input,null,2),toolCallId:T.id,model:h.message.model}):T.type==="thinking"&&T.thinking&&s.push({role:"thinking",timestamp:g,content:T.thinking})}}if(!o)return null;let p=await bf(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 Ls(this.projectsDir)}catch{return null}let n=[];for(let i of r){let a=jr(this.projectsDir,i);if(!(await yf(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await Ls(a)}catch{continue}for(let u of c){if(!u.endsWith(".jsonl"))continue;let d=Ef(u,".jsonl");/^[0-9a-f]{8}-/.test(d)&&n.push({filePath:jr(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 Ms(t){return"'"+t.replace(/'/g,"'\\''")+"'"}function ek(t,e,r){if(!r)return"";let n=t.tools[e]??La[e],s=n?.profiles?.[r]?.flags??La[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 Sf(t,e){return!!t.tools[e]}function kf(t,e,r,n,s){let o=t.tools[e]??La[e],i;if(o?.agent){let l=Ms(n);i=o.agent.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,l)}else{let l=QS[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(Ms).join(" ");i=`printf '%s\\n' ${Ms(n)} | ${u}`}else i=c.map(Ms).join(" ")}let a=ek(t,e,s);return a&&(i+=" "+a),i}var La,QS,vf=E(()=>{"use strict";La={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:""}}}},QS={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 If(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 $f=E(()=>{"use strict"});var tk,Ie,Ds,yt=E(()=>{"use strict";tk="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: ${tk}`,Ds=`send this exact lmctl seed instruction: "${Ie}"`});import{spawn as Nf}from"node:child_process";import{mkdirSync as rk}from"node:fs";var Ca,je,Dt=E(()=>{"use strict";vf();$f();yt();Ca=class t extends Error{cancelReason;constructor(e,r){super(e),this.name="TurnAbortError",this.cancelReason=r,Object.setPrototypeOf(this,t.prototype)}},je=class t{name;capabilities;injection;provider;binary;seedArgs;seedStdin;resumeTemplate;startTemplate;transportFn;constructor(e){this.name=e.provider.name,this.provider=e.provider,this.capabilities=e.capabilities,this.injection=e.injection,this.binary=e.binary,this.seedArgs=e.seedArgs,this.seedStdin=e.seedStdin,this.resumeTemplate=e.resumeTemplate,this.startTemplate=e.startTemplate,this.transportFn=e.transport}discover(){return this.provider.discoverSessions()}load(e){return this.provider.loadSession(e)}resolvePath(e){return this.provider.resolveSessionPath(e)}delete(e){return this.provider.deleteSession(e)}getWatchPaths(){return this.provider.getWatchPaths?.()??[]}seedArgsFor(e){let r=e?.prompt;return r===void 0?this.seedArgs:this.seedArgs.map(n=>n===Ie?r:n)}seed(e,r){return rk(e,{recursive:!0}),new Promise(n=>{let s;try{s=Nf(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:Ds,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${e}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(e,r){if(r.userConfig&&Sf(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 Ca("Turn cancelled","external"):p}),m=new Promise(p=>{l=p});return Promise.race([f,m])}runOneShotAgent(e,r,n){let s=kf(r.userConfig,this.name,r.sessionId,e,r.profile),o=Date.now();return new Promise((i,a)=>{let l=If(r.env),c=Nf(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 Fs(t,e){let r;if(e&&typeof e=="object"){let n=e.code;typeof n=="number"&&(r=n)}return new bt(t,r,e)}var Je,ye,Et,Ps,bt,Ar=E(()=>{"use strict";Je=class extends Error{constructor(e,r){super(e,r),this.name=this.constructor.name}},ye=class extends Je{},Et=class extends Je{exitCode;signal;stderr;constructor(e,r,n=null,s){super(e),this.exitCode=r,this.signal=n,this.stderr=s}},Ps=class extends Je{line;constructor(e,r,n){super(e,{cause:n}),this.line=r}},bt=class extends Je{rpcCode;rpcData;constructor(e,r,n){super(e),r!==void 0&&(this.rpcCode=r),n!==void 0&&(this.rpcData=n)}}});import*as Da from"node:child_process";function sk(t){if(typeof Da.spawnSync=="function")try{Da.spawnSync("taskkill",["/T","/F","/PID",String(t)],{windowsHide:!0})}catch{}}function xf(t){return t.exitCode!==null||t.signalCode!==null}function Ma(t,e){return xf(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 Qe(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??sk;if(xf(t))return{signal:"natural",elapsedMs:Date.now()-r};if(n&&t.stdin&&!t.stdin.destroyed)try{t.stdin.end()}catch{}if(await Ma(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 Ma(t,o))return{signal:"SIGTERM",elapsedMs:Date.now()-r};if(i!=="win32")try{t.kill("SIGKILL")}catch{}return await Ma(t,nk)?{signal:"SIGKILL",elapsedMs:Date.now()-r}:{signal:"abandoned",elapsedMs:Date.now()-r}}var nk,Us=E(()=>{"use strict";nk=1e3});import{readFileSync as ok,appendFileSync as ik,mkdirSync as ak,existsSync as gB,readdirSync as wB,unlinkSync as yB}from"node:fs";import{join as Rf,dirname as lk}from"node:path";import{homedir as Of}from"node:os";function lt(){if(Lf)return!0;let t=Date.now();return t-Af>=ck&&(jf=mk(),Af=t),jf}function dk(){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 Pt(t,e){if(e?.verbose){if(!Lf)return}else if(!e?.always&&!lt())return;try{fk();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};ik(Ws,JSON.stringify(r)+`
927
927
  `)}catch{}}function fk(){if(!Ws){let e=dk().slice(0,13).replace("T","-");Ws=Rf(Of(),".lmctl",`debug-${e}.log`)}ak(lk(Ws),{recursive:!0})}function Tt(...t){Pt({event:"legacy",msg:t.join(" ")},{verbose:!0})}function te(t){Pt(t,{always:!0})}function mk(){try{let t=ok(uk,"utf-8");for(let e of t.split(`
928
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 Lf,jf,Af,ck,uk,Ws,Xe=E(()=>{"use strict";Lf=!1,jf=!1,Af=0,ck=5e3,uk=Rf(Of(),".lmctl","config.toml");Ws=null});function Rr(t,e){let r=hk[t];if(r)return r[e]??r.yolo}function gk(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 Ft(t,e,r="yolo"){if(_k.has(t))return;let n=r==="plan"?Rr(t,"plan"):pk[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(!gk(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 pk,hk,_k,bn=E(()=>{"use strict";Ar();Xe();pk={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"]},hk={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"]}};_k=new Set(["codex","opencode"])});import{spawn as wk}from"node:child_process";import{existsSync as yk}from"node:fs";function bk(t){if(t.length===0)return"";if(t.length===1)return t[0];let e=[];for(let r=0;r<t.length;r++)r===0?e.push(t[r]):e.push(`
929
929
 
@@ -942,9 +942,9 @@ ${e}
942
942
  ${r}`:r}function Gk(t,e){let r=Hk(t);return r.willRetry||(e.pendingCodexError=r.turnError),r}function Vk(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(...Df());let i=e.permissionMode??"yolo",a=Fk(i);try{Ft("codex",o,i)}catch(R){return n(R)}if(e.cwd&&!Mk(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=Lk(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"}),Qe(l).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{c=!0,te({event:"transport_abort",provider:"codex"}),Qe(l).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let u=Ck({input:l.stdout}),d=new Map,f=1,m=e.threadId||"",p="",h=!1,g=!1,_=Date.now(),T=Bk(),S=Jk();function I(R,L={}){return new Promise((B,ee)=>{let x=f++;d.set(x,{resolve:B,reject:ee});let H=JSON.stringify({jsonrpc:"2.0",id:x,method:R,params:L});l.stdin?.write(H+`
943
943
  `)})}function v(R,L={}){let B=JSON.stringify({jsonrpc:"2.0",method:R,params:L});l.stdin?.write(B+`
944
944
  `)}u.on("line",R=>{let L;try{L=JSON.parse(R)}catch{return}if(typeof L.id=="number"&&d.has(L.id)){let x=d.get(L.id);if(d.delete(L.id),L.error){let H=L.error,me=typeof H?.message=="string"&&H.message.length>0?H.message:JSON.stringify(L.error);x.reject(Fs(`codex app-server error: ${me}`,H))}else x.resolve(L);e.onEvent?.(L);return}let B=L.method;if(!B){e.onEvent?.(L);return}if(B==="thread/started"){let H=L.params?.thread;H?.id&&(m=H.id)}let ee=lt()?x=>{Ut("item.text/buffer-mismatch",{itemId:x.itemId,threadId:x.threadId??null,turnId:x.turnId??null,expectedFromItemText:x.expectedFromItemText,gotFromBuffer:x.gotFromBuffer,expectedLen:x.expectedFromItemText.length,gotLen:x.gotFromBuffer.length})}:void 0;if(B==="turn/started"){let x=L.params,H=x?.turn;H?.id&&(p=H.id),Ff(L,T,e.onDelta,ee),lt()&&Ut("turn/started",{params:x??null})}if(lt()&&(B==="item/started"||B==="item/completed")){let x=L.params;x?.item?.type==="agentMessage"&&Ut(B,{params:x??null})}if(B==="item/started"||B==="item/agentMessage/delta"||B==="item/completed"){if(B==="item/agentMessage/delta"){let x=L.params;lt()&&Ut("agentMessage/delta",{params:x??null})}Ff(L,T,e.onDelta,ee)}if(B==="turn/completed"){let x=L.params;if(lt())for(let[me,$]of T.agentItems.entries())$.buffer&&Ut("turn/completed/unflushed-item",{itemId:me,phase:$.phase,bufferLen:$.buffer.length});qk(T),lt()&&Ut("turn/completed",{params:x??null});let H=Vk(L,S);H.shouldReject?(lt()&&Ut("turn/completed/terminal-reject",{message:H.turnError.message}),g=!0,h=!0,l.stdin?.end(),n(H.turnError)):(h=!0,l.stdin?.end())}if(B==="error"){let x=Gk(L,S);if(lt()){let H=L.params,me=H?.error,$=typeof me?.message=="string"?me.message:"(no message)";Ut(x.willRetry?"error/retry":"error/terminal-deferred",{message:$,willRetry:x.willRetry,params:H??null})}}e.onEvent?.(L)});let k="";l.stderr?.on("data",R=>{k+=R.toString()}),l.on("error",R=>{te({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:R.message}),n(new ye(`Failed to spawn codex app-server: ${R.message}`,{cause:R}))}),l.on("exit",R=>{if(!c&&!g){if(h){r({result:T.resultText,threadId:m,turnId:p,durationMs:Date.now()-_,exitCode:R});return}if(S.pendingCodexError){n(S.pendingCodexError);return}te({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:R,stderr_tail:k.slice(0,500)}),n(new Error(Xk({exitCode:R,stderr:k})))}}),(async()=>{try{if(await I("initialize",Wk()),v("initialized",{}),e.threadId)try{let R=I("thread/resume",{threadId:e.threadId,sandbox:a,approvalPolicy:"never",...e.model?{model:e.model}:{}}),L=new Promise((B,ee)=>setTimeout(()=>ee(new Error("resume timeout")),5e3));await Promise.race([R,L]),m=e.threadId}catch{process.stderr.write(`[codex] thread/resume failed, creating new thread
945
- `);let L=(await I("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:a,...e.model?{model:e.model}:{}})).result?.thread;L?.id&&(m=L.id)}else{let L=(await I("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:a,...e.model?{model:e.model}:{}})).result?.thread;L?.id&&(m=L.id)}await I("turn/start",{threadId:m,input:[{type:"text",text:t}],...e.model?{model:e.model}:{}})}catch(R){Qe(l).catch(()=>{}),n(R instanceof Error?R:new Error(String(R)))}})()})}var Uk,Wf=E(()=>{"use strict";Xe();Xe();Ar();Us();bn();Pf();Xe();Uk=(()=>{try{let t=new URL("../../../package.json",import.meta.url),e=JSON.parse(Dk(Pk(t),"utf8"));return typeof e.version=="string"?e.version:"0.0.0"}catch{return"0.0.0"}})()});function Da(){return{deepseek:{npm:"@ai-sdk/openai-compatible",name:"DeepSeek",options:{baseURL:"https://api.deepseek.com/v1",apiKey:"{env:DEEPSEEK_API_KEY}"},models:Object.fromEntries(Bf.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(qf.map(t=>[t,{name:t}]))}}}function Hf(){return[...Kk,...Bf.map(t=>`deepseek/${t}`),...qf.map(t=>`openrouter/${t}`)].sort()}var Kk,Bf,qf,Pa=E(()=>{"use strict";Kk=["github-copilot/claude-haiku-4.5","github-copilot/gpt-5-mini"],Bf=["deepseek-chat","deepseek-reasoner","deepseek-v4-flash","deepseek-v4-pro"],qf=["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 zk,readFileSync as Zk,writeFileSync as Jf}from"node:fs";import{join as Xf}from"node:path";function Vf(){return{type:"local",command:["lmctl","mcp"],enabled:!0,timeout:Qk}}function ev(t,e){return JSON.stringify(t)===JSON.stringify(e)}function tv(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 qs(t,e={}){let r=Xf(t,".opencode"),n=Xf(r,"opencode.json");if(Or("lmctl","lmctl_chat",e),!Yk(n)){zk(r,{recursive:!0});let l=JSON.stringify({permission:"allow",provider:Da(),mcp:{lmctl:Vf()}},null,2);return Jf(n,l+`
945
+ `);let L=(await I("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:a,...e.model?{model:e.model}:{}})).result?.thread;L?.id&&(m=L.id)}else{let L=(await I("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:a,...e.model?{model:e.model}:{}})).result?.thread;L?.id&&(m=L.id)}await I("turn/start",{threadId:m,input:[{type:"text",text:t}],...e.model?{model:e.model}:{}})}catch(R){Qe(l).catch(()=>{}),n(R instanceof Error?R:new Error(String(R)))}})()})}var Uk,Wf=E(()=>{"use strict";Xe();Xe();Ar();Us();bn();Pf();Xe();Uk=(()=>{try{let t=new URL("../../../package.json",import.meta.url),e=JSON.parse(Dk(Pk(t),"utf8"));return typeof e.version=="string"?e.version:"0.0.0"}catch{return"0.0.0"}})()});function Pa(){return{deepseek:{npm:"@ai-sdk/openai-compatible",name:"DeepSeek",options:{baseURL:"https://api.deepseek.com/v1",apiKey:"{env:DEEPSEEK_API_KEY}"},models:Object.fromEntries(Bf.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(qf.map(t=>[t,{name:t}]))}}}function Hf(){return[...Kk,...Bf.map(t=>`deepseek/${t}`),...qf.map(t=>`openrouter/${t}`)].sort()}var Kk,Bf,qf,Fa=E(()=>{"use strict";Kk=["github-copilot/claude-haiku-4.5","github-copilot/gpt-5-mini"],Bf=["deepseek-chat","deepseek-reasoner","deepseek-v4-flash","deepseek-v4-pro"],qf=["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 zk,readFileSync as Zk,writeFileSync as Jf}from"node:fs";import{join as Xf}from"node:path";function Vf(){return{type:"local",command:["lmctl","mcp"],enabled:!0,timeout:Qk}}function ev(t,e){return JSON.stringify(t)===JSON.stringify(e)}function tv(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 qs(t,e={}){let r=Xf(t,".opencode"),n=Xf(r,"opencode.json");if(Or("lmctl","lmctl_chat",e),!Yk(n)){zk(r,{recursive:!0});let l=JSON.stringify({permission:"allow",provider:Pa(),mcp:{lmctl:Vf()}},null,2);return Jf(n,l+`
946
946
  `,"utf-8"),!0}let s;try{s=JSON.parse(Zk(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),tv(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.`}),rv(s)&&(o=!0);let i=s.mcp&&typeof s.mcp=="object"&&!Array.isArray(s.mcp)?{...s.mcp}:{},a=Vf();return ev(i.lmctl,a)||(i.lmctl=a,s.mcp=i,o=!0),o&&Jf(n,JSON.stringify(s,null,2)+`
947
- `,"utf-8"),o}function rv(t){let e=Da(),r=Tn(t.provider)?t.provider:{},n=!Tn(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(!Tn(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=Tn(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=Tn(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 Tn(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Gf,Qk,Fa=E(()=>{"use strict";Xe();Pa();Bs();Gf={yellow:t=>t},Qk=864e5});import{spawn as nv}from"node:child_process";import{existsSync as sv}from"node:fs";import{createInterface as ov}from"node:readline";function iv(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 rv(t){let e=Pa(),r=Tn(t.provider)?t.provider:{},n=!Tn(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(!Tn(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=Tn(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=Tn(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 Tn(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Gf,Qk,Ua=E(()=>{"use strict";Xe();Fa();Bs();Gf={yellow:t=>t},Qk=864e5});import{spawn as nv}from"node:child_process";import{existsSync as sv}from"node:fs";import{createInterface as ov}from"node:readline";function iv(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: ${t.tool} ACP process exited with code ${t.exitCode} before completing the prompt.
948
948
  One possible cause: the provider process failed before a complete ACP response was delivered.`;return e?`Original provider error:
949
949
  ${e}
950
950
 
@@ -955,20 +955,20 @@ ${r}`:r}function pv(t){let e=[...t.matchAll(cv)];if(e.length>0){let r=e[e.length
955
955
  `);return}if(R==="session/update"){let B=k.params?.update;if(B?.sessionUpdate==="agent_message_chunk"){let x=B.content?.text||"";x&&(h+=x,e.onDelta?.(x))}}}});let S="";c.stderr?.on("data",v=>{S+=v.toString()}),c.on("error",v=>{te({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:v.message,elapsed_ms:Date.now()-u}),s(new ye(`Failed to spawn ${r.binary} ${r.args.join(" ")}: ${v.message}`,{cause:v}))}),c.on("exit",v=>{d||(_?n({result:e.tool==="gemini"?pv(h):h,sessionId:p,durationMs:Date.now()-u,stopReason:g,exitCode:v}):(te({event:"transport_error",provider:e.tool,error_class:"Error",reason:"provider_no_result",exit_code:v,stderr_tail:S.slice(0,500),elapsed_ms:Date.now()-u}),s(new Error(iv({tool:e.tool,exitCode:v,stderr:S})))))});function I(v,k={}){let R=JSON.stringify({jsonrpc:"2.0",method:v,params:k});c.stdin?.write(R+`
956
956
  `)}(async()=>{try{if(await T("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),I("notifications/initialized"),e.sessionId)try{p=(await T("session/load",{sessionId:e.sessionId,cwd:e.cwd,mcpServers:[]})).result?.sessionId||e.sessionId}catch(k){if(e.requireResume)throw new Error(`Cannot resume session ${e.sessionId} via ACP: ${k instanceof Error?k.message:String(k)}`);process.stderr.write(`[acp] session/load failed for ${e.sessionId}, creating new session
957
957
  `),p=(await T("session/new",{cwd:e.cwd,mcpServers:[]})).result?.sessionId||""}else p=(await T("session/new",{cwd:e.cwd,mcpServers:[]})).result?.sessionId||"";if(e.model&&e.tool==="opencode")try{await T("session/set_config_option",{sessionId:p,configId:"model",value:e.model}),Tt(`acp: set_config_option(model=${e.model}) ok`)}catch(k){let R=k instanceof Error?k.message:String(k);process.stderr.write(`[acp] set_config_option(model=${e.model}) failed: ${R}
958
- `)}Tt(`acp: prompt sent (${t.length} chars)`),g=(await T("session/prompt",{sessionId:p,prompt:[{type:"text",text:t}]})).result?.stopReason||"",_=!0,Tt(`acp: result received (${h.length} chars, stopReason=${g})`),c.stdin?.end()}catch(v){Qe(c).catch(()=>{}),s(v instanceof Error?v:new Error(String(v)))}})()}):Promise.reject(new Error(`No ACP config for tool "${e.tool}"`))}var av,lv,Yf,cv,uv,dv,fv,mv,Zf=E(()=>{"use strict";Xe();Ar();Us();bn();Fa();Xe();av={gemini:{binary:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{binary:"copilot",args:["--acp","--yolo"]},opencode:{binary:"opencode",args:["acp"]}},lv=1,Yf="(?:png|jpe?g|webp|heic|pdf)",cv=new RegExp(`\\bSTANCE:\\s*\\S+_\\d{6,}\\.${Yf}\\s*`,"gi"),uv=new RegExp(`^ACK:\\s*waiting for explicit lmctl task\\.\\d{6,}\\.${Yf}\\s*`,"i"),dv=/^ACK:\s*waiting for explicit lmctl task[._]?\s*/i,fv=/^STANCE:\s+\S+\s*$/gim,mv=/\[Thought:\s*true\]\s*/gi});function he(t,e=120){let r=t.replace(/\s+/g," ").trim();return r.length>e?r.slice(0,e-1)+"\u2026":r}function Qf(t,e){return r=>{if(r.kind==="tool_use"&&typeof r.id=="string"){if(t.size>=_v){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 gv(){let t=new Map;return(e,r)=>{wv(e,Qf(t,r))}}function wv(t,e){let r=t.type;if(r==="system"){let n=t.subtype;if(n==="api_retry"){let s=typeof t.attempt=="number"?t.attempt:void 0,o=typeof t.max_retries=="number"?t.max_retries:void 0,i=typeof t.error_status=="number"?t.error_status:void 0,a=typeof t.error=="string"?t.error:void 0,l=typeof t.retry_delay_ms=="number"?t.retry_delay_ms:void 0,c=[];s!==void 0&&c.push(o!==void 0?`attempt ${s}/${o}`:`attempt ${s}`),i!==void 0&&c.push(`HTTP ${i}`),l!==void 0&&c.push(`retry in ${Math.round(l/1e3)}s`),a&&c.push(he(a,60));let u=c.length>0?c.join(", "):n;e({kind:"api_retry",summary:u});return}if(n==="api_error"){let s=typeof t.error_status=="number"?t.error_status:void 0,o=typeof t.error=="string"?t.error:void 0,i=["api_error"];s!==void 0&&i.push(`HTTP ${s}`),o&&i.push(he(o,80)),e({kind:"other",summary:i.join(": "),raw:t});return}e({kind:"system",summary:n||"system",raw:t});return}if(r==="assistant"||r==="user"){let s=t.message?.content;if(!Array.isArray(s))return;for(let o of s){let i=o.type;if(i==="text"){let a=o.text||"";a&&e({kind:"text",summary:he(a),raw:o})}else if(i==="tool_use"){let a=o.name||"tool",l=typeof o.id=="string"?o.id:void 0,c=o.input,u="";c&&(typeof c.command=="string"?u=c.command:typeof c.file_path=="string"?u=c.file_path:typeof c.path=="string"?u=c.path:typeof c.pattern=="string"?u=c.pattern:typeof c.url=="string"?u=c.url:u=he(JSON.stringify(c))),e({kind:"tool_use",tool:a,summary:he(u),id:l,raw:o})}else if(i==="thinking"){let a=o.thinking||"";e({kind:"thinking",summary:he(a),raw:o})}else if(i==="tool_result"){let l=o.is_error===!0?"error":"ok",c=typeof o.tool_use_id=="string"?o.tool_use_id:void 0,u,d=o.content;if(typeof d=="string")u=`${d.split(`
958
+ `)}Tt(`acp: prompt sent (${t.length} chars)`),g=(await T("session/prompt",{sessionId:p,prompt:[{type:"text",text:t}]})).result?.stopReason||"",_=!0,Tt(`acp: result received (${h.length} chars, stopReason=${g})`),c.stdin?.end()}catch(v){Qe(c).catch(()=>{}),s(v instanceof Error?v:new Error(String(v)))}})()}):Promise.reject(new Error(`No ACP config for tool "${e.tool}"`))}var av,lv,Yf,cv,uv,dv,fv,mv,Zf=E(()=>{"use strict";Xe();Ar();Us();bn();Ua();Xe();av={gemini:{binary:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{binary:"copilot",args:["--acp","--yolo"]},opencode:{binary:"opencode",args:["acp"]}},lv=1,Yf="(?:png|jpe?g|webp|heic|pdf)",cv=new RegExp(`\\bSTANCE:\\s*\\S+_\\d{6,}\\.${Yf}\\s*`,"gi"),uv=new RegExp(`^ACK:\\s*waiting for explicit lmctl task\\.\\d{6,}\\.${Yf}\\s*`,"i"),dv=/^ACK:\s*waiting for explicit lmctl task[._]?\s*/i,fv=/^STANCE:\s+\S+\s*$/gim,mv=/\[Thought:\s*true\]\s*/gi});function he(t,e=120){let r=t.replace(/\s+/g," ").trim();return r.length>e?r.slice(0,e-1)+"\u2026":r}function Qf(t,e){return r=>{if(r.kind==="tool_use"&&typeof r.id=="string"){if(t.size>=_v){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 gv(){let t=new Map;return(e,r)=>{wv(e,Qf(t,r))}}function wv(t,e){let r=t.type;if(r==="system"){let n=t.subtype;if(n==="api_retry"){let s=typeof t.attempt=="number"?t.attempt:void 0,o=typeof t.max_retries=="number"?t.max_retries:void 0,i=typeof t.error_status=="number"?t.error_status:void 0,a=typeof t.error=="string"?t.error:void 0,l=typeof t.retry_delay_ms=="number"?t.retry_delay_ms:void 0,c=[];s!==void 0&&c.push(o!==void 0?`attempt ${s}/${o}`:`attempt ${s}`),i!==void 0&&c.push(`HTTP ${i}`),l!==void 0&&c.push(`retry in ${Math.round(l/1e3)}s`),a&&c.push(he(a,60));let u=c.length>0?c.join(", "):n;e({kind:"api_retry",summary:u});return}if(n==="api_error"){let s=typeof t.error_status=="number"?t.error_status:void 0,o=typeof t.error=="string"?t.error:void 0,i=["api_error"];s!==void 0&&i.push(`HTTP ${s}`),o&&i.push(he(o,80)),e({kind:"other",summary:i.join(": "),raw:t});return}e({kind:"system",summary:n||"system",raw:t});return}if(r==="assistant"||r==="user"){let s=t.message?.content;if(!Array.isArray(s))return;for(let o of s){let i=o.type;if(i==="text"){let a=o.text||"";a&&e({kind:"text",summary:he(a),raw:o})}else if(i==="tool_use"){let a=o.name||"tool",l=typeof o.id=="string"?o.id:void 0,c=o.input,u="";c&&(typeof c.command=="string"?u=c.command:typeof c.file_path=="string"?u=c.file_path:typeof c.path=="string"?u=c.path:typeof c.pattern=="string"?u=c.pattern:typeof c.url=="string"?u=c.url:u=he(JSON.stringify(c))),e({kind:"tool_use",tool:a,summary:he(u),id:l,raw:o})}else if(i==="thinking"){let a=o.thinking||"";e({kind:"thinking",summary:he(a),raw:o})}else if(i==="tool_result"){let l=o.is_error===!0?"error":"ok",c=typeof o.tool_use_id=="string"?o.tool_use_id:void 0,u,d=o.content;if(typeof d=="string")u=`${d.split(`
959
959
  `).length} lines, ${d.length} chars`;else if(Array.isArray(d)){let f=d.map(m=>typeof m=="object"&&m&&"text"in m?m.text:"").filter(Boolean).join("");f&&(u=`${f.split(`
960
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 Hs(t,e){let r=e.binary==="qwen"?"qwen":"claude",n=e.onProgress?gv():void 0,s=await Cf(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 yv(){let t=new Map;return(e,r)=>{Ev(e,Qf(t,r))}}function Ev(t,e){if(t.method!=="session/update")return;let s=t.params?.update;if(!s)return;let o=s.sessionUpdate;if(o){if(o==="agent_message_chunk"){let a=s.content?.text||"";a&&e({kind:"text",summary:he(a)});return}if(o==="agent_thought_chunk"){let a=s.content?.text||"";e({kind:"thinking",summary:he(a)});return}if(o==="tool_call"){let i=s.title||s.kind||"tool",a=typeof s.toolCallId=="string"?s.toolCallId:void 0,l="",c=s.rawInput;c&&(typeof c.command=="string"?l=c.command:typeof c.file_path=="string"?l=c.file_path:typeof c.path=="string"?l=c.path:l=he(JSON.stringify(c))),e({kind:"tool_use",tool:i,summary:he(l),id:a});return}if(o==="tool_call_update"){let i=s.status||"",a=typeof s.toolCallId=="string"?s.toolCallId:void 0;if(i==="completed"||i==="failed")e({kind:"tool_result",summary:i,status:i==="failed"?"error":"ok",id:a});else if(i==="in_progress"){let l=s.content,c=typeof l=="string"?l:typeof l?.text=="string"?l.text:"",u=c?`running\u2026 ${he(c,80)}`:"running\u2026";e({kind:"other",summary:u,id:a})}return}e({kind:"other",summary:o})}}async function Lr(t,e){let r=e.acpTool||e.binary;e.model&&r==="copilot"&&Pt({event:"model_ignored",provider:r,model:e.model,reason:"copilot --acp does not implement per-session model selection"});let n=e.onProgress?yv():void 0,s=await zf(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 bv(t,e){let r=t.method;if(!r)return;let n=t.params;if(r==="turn/started"){e({kind:"system",summary:"turn started"});return}if(r==="turn/completed"){e({kind:"system",summary:"turn completed"});return}if(r==="error"){let s=n?.error,o=typeof s?.message=="string"?s.message:void 0,i=o&&o.length>0?o:"(no message)",a=n?.willRetry===!0;e(a?{kind:"api_retry",summary:`codex retry: ${he(i,120)}`}:{kind:"other",summary:`codex error: ${he(i,120)}`});return}if(r==="item/started"||r==="item/completed"){let s=n?.item;if(!s)return;let o=s.type,i=r==="item/started";switch(o){case"commandExecution":{let a=typeof s.id=="string"?s.id:void 0,l=s.command,c=Array.isArray(l)?l.join(" "):typeof l=="string"?l:"";if(i)e({kind:"tool_use",tool:"Bash",summary:he(c||"(command)"),id:a});else{let u=s.exitCode,d=s.status||"",f=typeof s.durationMs=="number"?s.durationMs:void 0,m=typeof u=="number"?`exit ${u}`:d||"done",p=[];typeof u=="number"?p.push(`exit ${u}`):d&&p.push(d),typeof f=="number"&&p.push(`${Math.round(f/1e3)}s`),e({kind:"tool_result",summary:p.join(", ")||"done",status:m,elapsedMs:f,id:a})}return}case"fileChange":{let a=typeof s.id=="string"?s.id:void 0;if(i){let l=s.changes,c=Array.isArray(l)?l.map(u=>u.path||"").filter(Boolean).join(", "):"";e({kind:"tool_use",tool:"FileChange",summary:he(c||"(edit)"),id:a})}else{let l=s.status||"done";e({kind:"tool_result",summary:l,status:l,id:a})}return}case"mcpToolCall":{let a=typeof s.id=="string"?s.id:void 0,l=s.server||"mcp",c=s.tool||"tool";if(i)e({kind:"tool_use",tool:`${l}/${c}`,summary:"",id:a});else{let u=s.status||"done";e({kind:"tool_result",summary:u,status:u,id:a})}return}case"webSearch":{let a=typeof s.id=="string"?s.id:void 0;e(i?{kind:"tool_use",tool:"WebSearch",summary:he(s.query||""),id:a}:{kind:"tool_result",summary:"done",status:"done",id:a});return}case"reasoning":{i&&e({kind:"thinking",summary:""});return}case"agentMessage":case"userMessage":return;default:{o&&e({kind:i?"tool_use":"tool_result",tool:o,summary:""});return}}}if(r==="item/agentMessage/delta"){let s=n?.delta||"";if(s){let o=typeof n?._lmctlItemPhase=="string"?n._lmctlItemPhase:void 0;e(o==="commentary"?{kind:"thinking",summary:he(s)}:{kind:"text",summary:he(s)})}return}if(r==="item/reasoning/summaryTextDelta"||r==="item/reasoning/textDelta"){let s=n?.delta||"";s&&e({kind:"thinking",summary:he(s)});return}if(r==="item/commandExecution/outputDelta"){let s=(typeof n?.delta=="string"?n.delta:"")||"";if(s){let o=s.split(`
961
961
  `).filter(l=>l.length>0),i=o[o.length-1]||"",a=o.length>1?`${o.length} lines: ${he(i,60)}`:he(s,80);e({kind:"other",summary:`running\u2026 ${a}`})}else e({kind:"other",summary:"running\u2026"});return}if(r==="item/commandExecution/terminalInteraction"||r==="item/commandExecution/outputChunk"||r==="item/commandExecution/output"){let s=(typeof n?.stdin=="string"?n.stdin:"")||(typeof n?.delta=="string"?n.delta:"")||(typeof n?.output=="string"?n.output:"")||(typeof n?.text=="string"?n.text:"")||(typeof n?.content=="string"?n.content:"")||(typeof n?.chunk=="string"?n.chunk:"")||"";if(s){let o=s.split(`
962
- `).filter(l=>l.length>0),i=o[o.length-1]||"",a=o.length>1?`${o.length} lines: ${he(i,60)}`:he(s,80);e({kind:"other",summary:`running\u2026 ${a}`})}else e({kind:"other",summary:"running\u2026"});return}if(r.startsWith("item/")){e({kind:"other",summary:r.slice(5)});return}}async function em(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=>bv(n,e.onProgress):void 0,signal:e.signal});return{text:r.result,sessionId:r.threadId,durationMs:r.durationMs}}var _v,ar=E(()=>{"use strict";Mf();Wf();Zf();Xe();_v=256});function Wa(t){return new Ua(t)}var Ua,Ba=E(()=>{"use strict";Tf();Dt();ar();yt();Ua=class extends je{constructor(e){super({provider:new Cs(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:Hs})}}});import{readdir as Tv,stat as tm,unlink as Sv}from"node:fs/promises";import{join as Sn,basename as kv}from"node:path";function vv(t,e,r){return`${t}|${e.toISOString()}|${r}`}function kn(t,e,r){let n=vv(r.role,r.timestamp,r.content);e.has(n)||(e.add(n),t.push(r))}function rm(t,e){return e==="exec"||t==="codex_exec"?"codex exec":"codex"}function Iv(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 Js(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 Js(r)}).filter(r=>r.length>0).join(`
962
+ `).filter(l=>l.length>0),i=o[o.length-1]||"",a=o.length>1?`${o.length} lines: ${he(i,60)}`:he(s,80);e({kind:"other",summary:`running\u2026 ${a}`})}else e({kind:"other",summary:"running\u2026"});return}if(r.startsWith("item/")){e({kind:"other",summary:r.slice(5)});return}}async function em(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=>bv(n,e.onProgress):void 0,signal:e.signal});return{text:r.result,sessionId:r.threadId,durationMs:r.durationMs}}var _v,lr=E(()=>{"use strict";Mf();Wf();Zf();Xe();_v=256});function Ba(t){return new Wa(t)}var Wa,qa=E(()=>{"use strict";Tf();Dt();lr();yt();Wa=class extends je{constructor(e){super({provider:new Cs(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:Hs})}}});import{readdir as Tv,stat as tm,unlink as Sv}from"node:fs/promises";import{join as Sn,basename as kv}from"node:path";function vv(t,e,r){return`${t}|${e.toISOString()}|${r}`}function kn(t,e,r){let n=vv(r.role,r.timestamp,r.content);e.has(n)||(e.add(n),t.push(r))}function rm(t,e){return e==="exec"||t==="codex_exec"?"codex exec":"codex"}function Iv(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 Js(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 Js(r)}).filter(r=>r.length>0).join(`
963
963
  `);try{return JSON.stringify(t)}catch{return String(t)}}async function nm(t){let e=0,r=0,n=0,s=0,o=0,i,a;for await(let l of De(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=Iv(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 Xs,sm=E(()=>{"use strict";Mt();Xs=class{name="codex";codexDirs;constructor(e={}){let r=[Sn(be,".codex"),Sn(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:Sn(e,"sessions"),filePattern:/\.jsonl$/}))}async getSessionsDirs(){let e=[];for(let r of this.codexDirs){let n=Sn(r,"sessions");try{await tm(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 Tv(e)}catch{return r}for(let s of n){let o=Sn(e,s),i=await tm(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=kv(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 nm(e);return{provider:"codex",sessionId:s,cwd:o,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:i,startCommand:rm(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 De(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=rm(h.payload.originator,h.payload.source);continue}if(h.type==="turn_context"&&h.payload){h.payload.model&&(a=h.payload.model),!o&&h.payload.cwd&&(o=h.payload.cwd);continue}if(h.type==="response_item"&&h.payload){let _=h.payload;if(_.type==="message"){if(_.role==="user"&&_.content){for(let T of _.content)if(T.type==="input_text"&&typeof T.text=="string"&&T.text){let S=T.text.trim();c||(c=G(S,80)),u=G(S,80),kn(s,m,{role:"user",timestamp:g,content:ce(S)})}continue}if(_.role==="assistant"&&_.content){for(let T of _.content)T.type==="output_text"&&typeof T.text=="string"&&T.text&&kn(s,m,{role:"assistant",timestamp:g,content:ce(T.text),model:a});continue}if(_.role!=="user"&&_.role!=="assistant"&&_.content){for(let T of _.content)(T.type==="input_text"||T.type==="output_text")&&typeof T.text=="string"&&T.text&&kn(s,m,{role:"system",timestamp:g,content:ce(T.text.trim())});continue}}if(_.type==="function_call"){s.push({role:"tool_use",timestamp:g,content:_.name||"unknown tool",toolName:_.name,toolInput:_.arguments!==void 0?ce(Js(_.arguments)):void 0,toolCallId:_.call_id});continue}if(_.type==="function_call_output"){s.push({role:"tool_result",timestamp:g,content:ce(Js(_.output)),toolCallId:_.call_id});continue}if(_.type==="reasoning"&&_.summary){let T=_.summary.map(S=>Js(S.text)).join(`
964
- `);T.trim()&&kn(s,m,{role:"thinking",timestamp:g,content:ce(T)});continue}}if(h.type==="event_msg"&&h.payload&&h.payload.type==="agent_reasoning"){let _=h.payload.message||h.payload.text;_&&kn(s,m,{role:"thinking",timestamp:g,content:ce(_)})}}if(!o)return null;let p=await nm(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 Sv(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 Ha(t){return new qa(t)}var qa,Ja=E(()=>{"use strict";sm();Dt();ar();yt();qa=class extends je{constructor(e){super({provider:new Xs(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}
964
+ `);T.trim()&&kn(s,m,{role:"thinking",timestamp:g,content:ce(T)});continue}}if(h.type==="event_msg"&&h.payload&&h.payload.type==="agent_reasoning"){let _=h.payload.message||h.payload.text;_&&kn(s,m,{role:"thinking",timestamp:g,content:ce(_)})}}if(!o)return null;let p=await nm(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 Sv(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 Ja(t){return new Ha(t)}var Ha,Xa=E(()=>{"use strict";sm();Dt();lr();yt();Ha=class extends je{constructor(e){super({provider:new Xs(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
965
  `,resumeTemplate:"codex resume {{session_id}}",startTemplate:"codex",transport:em})}seedArgsFor(e){let r=super.seedArgsFor(e);return e?.model?[...r.slice(0,-1),"--model",e.model,r[r.length-1]]:r}}});function vn(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 Gs(t){let e=vn(t);if(e==="unknown")throw new Error("gemini session content matches neither known format (old .json with messages[] or new .jsonl with kind metadata)");if(e==="json"){let a=JSON.parse(t);return{sessionId:a.sessionId,projectHash:a.projectHash,startTime:a.startTime,lastUpdated:a.lastUpdated,kind:a.kind,messages:Array.isArray(a.messages)?a.messages:[]}}let r=t.split(`
966
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?$v(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 $v(t,e){for(let[r,n]of Object.entries(e))if(n!==void 0){if(r==="tokens"&&om(t.tokens)&&om(n)){t.tokens={...t.tokens,...n};continue}t[r]=n}}function om(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function im(t,e){if(e==="json")return JSON.stringify(t,null,2);let{messages:r,...n}=t,s=[JSON.stringify(n)];for(let o of r)s.push(JSON.stringify(o));return s.join(`
967
967
  `)+`
968
- `}var Xa=E(()=>{"use strict"});import{createHash as Nv}from"node:crypto";import{readdir as In,readFile as am,stat as Vs,unlink as xv}from"node:fs/promises";import{join as Ue,basename as jv,dirname as Av}from"node:path";import{cwd as Rv}from"node:process";function lm(t){return t?typeof t=="string"?t:Array.isArray(t)?t.map(e=>e.text||"").join(""):"":""}function cm(t){return t==="user"}function Ga(t){return t==="gemini"||t==="assistant"}function lr(t,e=new Date(0)){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function Ov(t){return`${t.sessionId}\0${t.cwd}`}function Lv(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 Ks(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function um(t){let e=0,r=0,n=0,s=0,o=0,i;for(let a of t){if(!Ga(a.type)||!a.tokens)continue;let l=Ks(a.tokens.input),c=Ks(a.tokens.cached),u=Math.max(l-c,0),d=Ks(a.tokens.output),f=Ks(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 Cv(t){return Nv("sha256").update(t).digest("hex")}function $n(t,e){let r=e;for(;r&&!t.has(r);){t.add(r);let n=Av(r);if(n===r)break;r=n}}var Ys,dm=E(()=>{"use strict";Mt();Xa();Xe();Ys=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(e={}){let r=e.geminiDir||Ue(be,".gemini");this.geminiProjectsFile=Ue(r,"projects.json"),this.geminiTmpDir=Ue(r,"tmp");let n=e.claudeDir||Ue(be,".claude");this.claudeProjectsDir=Ue(n,"projects");let s=[Ue(be,".codex"),Ue(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=>Ue(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=Ov(s),i=r.get(o);r.set(o,i?Lv(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 _=lr(g.timestamp),T=g.type,S=ce(lm(g.content));if(cm(T)){let v=S.trim();v&&(u||(u=G(v,80)),d=G(v,80)),o.push({role:"user",timestamp:_,content:v||S});continue}if(Ga(T)){g.model&&(f=g.model);for(let v of g.thoughts||[]){let k=[v.subject,v.description].filter(Boolean).join(`
969
- `).trim();k&&o.push({role:"thinking",timestamp:lr(v.timestamp,_),content:ce(k)})}o.push({role:"assistant",timestamp:_,content:S,model:g.model});continue}let I=T?`[${T}] `:"";o.push({role:"system",timestamp:_,content:`${I}${S}`.trim()})}let m=lr(n.startTime,s.createdAt),p=lr(n.lastUpdated,s.modifiedAt),h=um(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(cm(m.type)){d++;let p=lm(m.content).trim();p&&(l||(l=G(ce(p),80)),c=G(ce(p),80))}else Ga(m.type)&&(d++,m.model&&(u=m.model));let f=um(s);return{provider:"gemini",sessionId:o,cwd:a,createdAt:lr(r.startTime,n.createdAt),modifiedAt:lr(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 am(e,"utf-8");if(vn(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 Gs(r)}catch{return null}}extractSessionIdFromFilename(e){let r=jv(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 In(this.geminiTmpDir)}catch{return e}for(let n of r){let s=Ue(this.geminiTmpDir,n,"chats");if(!(await Vs(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await In(s)}catch{continue}for(let a of i)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||e.push(Ue(s,a)))}return e}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await xv(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:lr(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;$n(e,Rv());for(let n of this.extraWorkspacePaths)$n(e,n);for(let n of await this.collectGeminiProjectPaths())$n(e,n);for(let n of await this.collectCodexCwds())$n(e,n);for(let n of await this.collectClaudeCwds())$n(e,n);let r=new Map;for(let n of e)r.set(Cv(n),n);return this.workspaceHashMap=r,r}async collectGeminiProjectPaths(){let e;try{e=await am(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 In(this.claudeProjectsDir)}catch{return[]}for(let n of r){let s=Ue(this.claudeProjectsDir,n);if(!(await Vs(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await In(s)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=Ue(s,a),u=(await Ae(l,1).catch(()=>[]))[0]?.cwd;u&&e.add(u)}}return[...e]}async findJsonlFiles(e){let r=[];if(!(await Vs(e).catch(()=>null))?.isDirectory())return r;let s;try{s=await In(e)}catch{return r}for(let o of s){let i=Ue(e,o),a=await Vs(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 Mv,writeFileSync as Dv,mkdirSync as Pv}from"node:fs";import{join as Fv,dirname as Uv}from"node:path";import{randomUUID as Wv}from"node:crypto";function Ka(t){return new Va(t)}var Va,Ya=E(()=>{"use strict";dm();Dt();ar();yt();Xa();Va=class extends je{constructor(e){super({provider:new Ys(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)=>Lr(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(`
968
+ `}var Ga=E(()=>{"use strict"});import{createHash as Nv}from"node:crypto";import{readdir as In,readFile as am,stat as Vs,unlink as xv}from"node:fs/promises";import{join as Ue,basename as jv,dirname as Av}from"node:path";import{cwd as Rv}from"node:process";function lm(t){return t?typeof t=="string"?t:Array.isArray(t)?t.map(e=>e.text||"").join(""):"":""}function cm(t){return t==="user"}function Va(t){return t==="gemini"||t==="assistant"}function cr(t,e=new Date(0)){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function Ov(t){return`${t.sessionId}\0${t.cwd}`}function Lv(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 Ks(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function um(t){let e=0,r=0,n=0,s=0,o=0,i;for(let a of t){if(!Va(a.type)||!a.tokens)continue;let l=Ks(a.tokens.input),c=Ks(a.tokens.cached),u=Math.max(l-c,0),d=Ks(a.tokens.output),f=Ks(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 Cv(t){return Nv("sha256").update(t).digest("hex")}function $n(t,e){let r=e;for(;r&&!t.has(r);){t.add(r);let n=Av(r);if(n===r)break;r=n}}var Ys,dm=E(()=>{"use strict";Mt();Ga();Xe();Ys=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(e={}){let r=e.geminiDir||Ue(be,".gemini");this.geminiProjectsFile=Ue(r,"projects.json"),this.geminiTmpDir=Ue(r,"tmp");let n=e.claudeDir||Ue(be,".claude");this.claudeProjectsDir=Ue(n,"projects");let s=[Ue(be,".codex"),Ue(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=>Ue(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=Ov(s),i=r.get(o);r.set(o,i?Lv(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 _=cr(g.timestamp),T=g.type,S=ce(lm(g.content));if(cm(T)){let v=S.trim();v&&(u||(u=G(v,80)),d=G(v,80)),o.push({role:"user",timestamp:_,content:v||S});continue}if(Va(T)){g.model&&(f=g.model);for(let v of g.thoughts||[]){let k=[v.subject,v.description].filter(Boolean).join(`
969
+ `).trim();k&&o.push({role:"thinking",timestamp:cr(v.timestamp,_),content:ce(k)})}o.push({role:"assistant",timestamp:_,content:S,model:g.model});continue}let I=T?`[${T}] `:"";o.push({role:"system",timestamp:_,content:`${I}${S}`.trim()})}let m=cr(n.startTime,s.createdAt),p=cr(n.lastUpdated,s.modifiedAt),h=um(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(cm(m.type)){d++;let p=lm(m.content).trim();p&&(l||(l=G(ce(p),80)),c=G(ce(p),80))}else Va(m.type)&&(d++,m.model&&(u=m.model));let f=um(s);return{provider:"gemini",sessionId:o,cwd:a,createdAt:cr(r.startTime,n.createdAt),modifiedAt:cr(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 am(e,"utf-8");if(vn(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 Gs(r)}catch{return null}}extractSessionIdFromFilename(e){let r=jv(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 In(this.geminiTmpDir)}catch{return e}for(let n of r){let s=Ue(this.geminiTmpDir,n,"chats");if(!(await Vs(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await In(s)}catch{continue}for(let a of i)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||e.push(Ue(s,a)))}return e}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await xv(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:cr(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;$n(e,Rv());for(let n of this.extraWorkspacePaths)$n(e,n);for(let n of await this.collectGeminiProjectPaths())$n(e,n);for(let n of await this.collectCodexCwds())$n(e,n);for(let n of await this.collectClaudeCwds())$n(e,n);let r=new Map;for(let n of e)r.set(Cv(n),n);return this.workspaceHashMap=r,r}async collectGeminiProjectPaths(){let e;try{e=await am(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 In(this.claudeProjectsDir)}catch{return[]}for(let n of r){let s=Ue(this.claudeProjectsDir,n);if(!(await Vs(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await In(s)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=Ue(s,a),u=(await Ae(l,1).catch(()=>[]))[0]?.cwd;u&&e.add(u)}}return[...e]}async findJsonlFiles(e){let r=[];if(!(await Vs(e).catch(()=>null))?.isDirectory())return r;let s;try{s=await In(e)}catch{return r}for(let o of s){let i=Ue(e,o),a=await Vs(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 Mv,writeFileSync as Dv,mkdirSync as Pv}from"node:fs";import{join as Fv,dirname as Uv}from"node:path";import{randomUUID as Wv}from"node:crypto";function Ya(t){return new Ka(t)}var Ka,za=E(()=>{"use strict";dm();Dt();lr();yt();Ga();Ka=class extends je{constructor(e){super({provider:new Ys(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)=>Lr(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
970
  `)}manualSeedHint(e){return{launchCommand:`cd ${e} && gemini --skip-trust`,postLaunchNote:Ds,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=Mv(n,"utf-8"),o=vn(s),i=Gs(s),a=Wv();i.sessionId=a,i.kind="main";let l=Uv(n),c=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),u=o==="jsonl"?".jsonl":".json",d=`session-${c}-${a.slice(0,8)}${u}`,f=Fv(l,d);return Pv(l,{recursive:!0}),Dv(f,im(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 fm,readFile as Bv,rm as qv,stat as Cr}from"node:fs/promises";import{basename as Hv,join as et}from"node:path";function Jv(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 cr(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}async function Xv(t){let e=0;for await(let r of De(t))(r.type==="user.message"||r.type==="assistant.message"&&(r.data?.content||"").trim())&&e++;return e}var zs,mm=E(()=>{"use strict";Mt();zs=class{name="copilot";sessionStateDir;constructor(e={}){let r=e.copilotDir||et(be,".copilot");this.sessionStateDir=et(r,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await fm(this.sessionStateDir)}catch{return e}for(let n of r){let s=et(this.sessionStateDir,n);if((await Cr(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=et(r,"events.jsonl"),o=await Cr(s).catch(()=>null),i=o?s:et(r,"workspace.yaml"),a=await ve(o?s:r),l=[],c=n?.cwd||"(unknown workspace)",u,d,f,m,p,h,g=n?.id||Hv(r)||e;if(o)for await(let _ of De(s)){let T=cr(_.timestamp)||a.modifiedAt;if(_.type==="session.start"&&_.data){_.data.sessionId&&(g=_.data.sessionId),_.data.copilotVersion&&(d=_.data.copilotVersion),_.data.startTime&&(h=cr(_.data.startTime)),_.data.selectedModel&&(u=_.data.selectedModel),_.data.context&&(_.data.context.cwd&&(c=_.data.context.cwd),_.data.context.branch&&(f=_.data.context.branch));continue}if(_.type==="session.model_change"&&_.data?.newModel){u=_.data.newModel;continue}if(_.type==="user.message"&&_.data){let S=_.data.content||"",I=S.trim();I&&(m||(m=G(I,80)),p=G(I,80)),l.push({role:"user",timestamp:T,content:ce(I||S)});continue}if(_.type==="assistant.message"&&_.data){let S=(_.data.content||"").trim();if(S&&l.push({role:"assistant",timestamp:T,content:ce(S),model:u}),_.data.toolRequests)for(let I of _.data.toolRequests)l.push({role:"tool_use",timestamp:T,content:I.name||"unknown tool",toolName:I.name,toolInput:I.arguments?JSON.stringify(I.arguments,null,2):void 0,toolCallId:I.toolCallId});continue}if(_.type==="tool.execution_complete"&&_.data){let S=_.data.result?.content||"",I=_.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:T,content:ce(S),toolDetailedContent:I?ce(I):void 0,toolCallId:_.data.toolCallId});continue}if(_.type==="assistant.reasoning"&&_.data?.content){l.push({role:"thinking",timestamp:T,content:ce(_.data.content)});continue}if(_.type==="session.error"||_.type==="session.warning"||_.type==="session.info"||_.type==="system.message"){let S=_.data?.message||"";S.trim()&&l.push({role:"system",timestamp:T,content:ce(S)});continue}}if(!m){let _=(n?.summary||"").trim();_&&(m=G(_,80))}return{provider:"copilot",sessionId:g,cwd:c,createdAt:h??cr(n?.created_at)??a.createdAt,modifiedAt:cr(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=et(e,"events.jsonl"),o=await Cr(s).catch(()=>null),i=o?s:et(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=cr(_.data.startTime)),_.data.selectedModel&&(d=_.data.selectedModel),_.data.context?.cwd&&(u=_.data.context.cwd)),_.type==="session.model_change"&&_.data?.newModel&&(d||(d=_.data.newModel)),_.type==="user.message"&&_.data){let T=(_.data.content||"").trim();T&&(p||(p=G(T,80)),h=G(T,80))}if(!p){let _=(n?.summary||"").trim();_&&(p=G(_,80))}let g=o?await Xv(s):0;return{provider:"copilot",sessionId:c,cwd:u,createdAt:m??cr(n?.created_at)??a.createdAt,modifiedAt:cr(n?.updated_at)??a.modifiedAt,model:d,cliVersion:f,startCommand:"copilot",firstUserMessage:p,lastUserMessage:h,messageCount:g,filePath:i}}async readWorkspaceYaml(e){let r=et(e,"workspace.yaml");try{let n=await Bv(r,"utf-8");return Jv(n)}catch{return null}}async resolveSessionPath(e){return this.resolveSessionDir(e)}async deleteSession(e){let r=await this.resolveSessionDir(e);return r?(await qv(r,{recursive:!0}),!0):!1}async resolveSessionDir(e){let r;try{r=await fm(this.sessionStateDir)}catch{return null}if(r.includes(e)){let s=et(this.sessionStateDir,e);if((await Cr(s).catch(()=>null))?.isDirectory())return s}let n=[];for(let s of r)if(s.startsWith(e)){let o=et(this.sessionStateDir,s);(await Cr(o).catch(()=>null))?.isDirectory()&&n.push(o)}if(n.length===1)return n[0];for(let s of r){let o=et(this.sessionStateDir,s);if(!(await Cr(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 za(t){return new je({provider:new zs(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)=>Lr(e,{...r,acpTool:"copilot"})})}var Za=E(()=>{"use strict";mm();Dt();ar();yt()});import{existsSync as pm}from"node:fs";import{join as Zs}from"node:path";import{createRequire as Gv}from"node:module";function hm(){return Qa===null&&(Qa=Gv(import.meta.url)("node:sqlite").DatabaseSync),Qa}function Vv(){let t=process.env.XDG_DATA_HOME||Zs(be,".local","share"),e=process.env.XDG_CONFIG_HOME||Zs(be,".config");return[Zs(t,"opencode","opencode.db"),Zs(e,"opencode","opencode.db")]}var Qa,Qs,_m=E(()=>{"use strict";Mt();Qa=null;Qs=class{name="opencode";dbPath;constructor(e){e?.dbPath?this.dbPath=e.dbPath:this.dbPath=Vv().find(r=>pm(r))??null}openDb(){return!this.dbPath||!pm(this.dbPath)?null:new(hm())(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,
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 ur(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}async function Xv(t){let e=0;for await(let r of De(t))(r.type==="user.message"||r.type==="assistant.message"&&(r.data?.content||"").trim())&&e++;return e}var zs,mm=E(()=>{"use strict";Mt();zs=class{name="copilot";sessionStateDir;constructor(e={}){let r=e.copilotDir||et(be,".copilot");this.sessionStateDir=et(r,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await fm(this.sessionStateDir)}catch{return e}for(let n of r){let s=et(this.sessionStateDir,n);if((await Cr(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=et(r,"events.jsonl"),o=await Cr(s).catch(()=>null),i=o?s:et(r,"workspace.yaml"),a=await ve(o?s:r),l=[],c=n?.cwd||"(unknown workspace)",u,d,f,m,p,h,g=n?.id||Hv(r)||e;if(o)for await(let _ of De(s)){let T=ur(_.timestamp)||a.modifiedAt;if(_.type==="session.start"&&_.data){_.data.sessionId&&(g=_.data.sessionId),_.data.copilotVersion&&(d=_.data.copilotVersion),_.data.startTime&&(h=ur(_.data.startTime)),_.data.selectedModel&&(u=_.data.selectedModel),_.data.context&&(_.data.context.cwd&&(c=_.data.context.cwd),_.data.context.branch&&(f=_.data.context.branch));continue}if(_.type==="session.model_change"&&_.data?.newModel){u=_.data.newModel;continue}if(_.type==="user.message"&&_.data){let S=_.data.content||"",I=S.trim();I&&(m||(m=G(I,80)),p=G(I,80)),l.push({role:"user",timestamp:T,content:ce(I||S)});continue}if(_.type==="assistant.message"&&_.data){let S=(_.data.content||"").trim();if(S&&l.push({role:"assistant",timestamp:T,content:ce(S),model:u}),_.data.toolRequests)for(let I of _.data.toolRequests)l.push({role:"tool_use",timestamp:T,content:I.name||"unknown tool",toolName:I.name,toolInput:I.arguments?JSON.stringify(I.arguments,null,2):void 0,toolCallId:I.toolCallId});continue}if(_.type==="tool.execution_complete"&&_.data){let S=_.data.result?.content||"",I=_.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:T,content:ce(S),toolDetailedContent:I?ce(I):void 0,toolCallId:_.data.toolCallId});continue}if(_.type==="assistant.reasoning"&&_.data?.content){l.push({role:"thinking",timestamp:T,content:ce(_.data.content)});continue}if(_.type==="session.error"||_.type==="session.warning"||_.type==="session.info"||_.type==="system.message"){let S=_.data?.message||"";S.trim()&&l.push({role:"system",timestamp:T,content:ce(S)});continue}}if(!m){let _=(n?.summary||"").trim();_&&(m=G(_,80))}return{provider:"copilot",sessionId:g,cwd:c,createdAt:h??ur(n?.created_at)??a.createdAt,modifiedAt:ur(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=et(e,"events.jsonl"),o=await Cr(s).catch(()=>null),i=o?s:et(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=ur(_.data.startTime)),_.data.selectedModel&&(d=_.data.selectedModel),_.data.context?.cwd&&(u=_.data.context.cwd)),_.type==="session.model_change"&&_.data?.newModel&&(d||(d=_.data.newModel)),_.type==="user.message"&&_.data){let T=(_.data.content||"").trim();T&&(p||(p=G(T,80)),h=G(T,80))}if(!p){let _=(n?.summary||"").trim();_&&(p=G(_,80))}let g=o?await Xv(s):0;return{provider:"copilot",sessionId:c,cwd:u,createdAt:m??ur(n?.created_at)??a.createdAt,modifiedAt:ur(n?.updated_at)??a.modifiedAt,model:d,cliVersion:f,startCommand:"copilot",firstUserMessage:p,lastUserMessage:h,messageCount:g,filePath:i}}async readWorkspaceYaml(e){let r=et(e,"workspace.yaml");try{let n=await Bv(r,"utf-8");return Jv(n)}catch{return null}}async resolveSessionPath(e){return this.resolveSessionDir(e)}async deleteSession(e){let r=await this.resolveSessionDir(e);return r?(await qv(r,{recursive:!0}),!0):!1}async resolveSessionDir(e){let r;try{r=await fm(this.sessionStateDir)}catch{return null}if(r.includes(e)){let s=et(this.sessionStateDir,e);if((await Cr(s).catch(()=>null))?.isDirectory())return s}let n=[];for(let s of r)if(s.startsWith(e)){let o=et(this.sessionStateDir,s);(await Cr(o).catch(()=>null))?.isDirectory()&&n.push(o)}if(n.length===1)return n[0];for(let s of r){let o=et(this.sessionStateDir,s);if(!(await Cr(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 Za(t){return new je({provider:new zs(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)=>Lr(e,{...r,acpTool:"copilot"})})}var Qa=E(()=>{"use strict";mm();Dt();lr();yt()});import{existsSync as pm}from"node:fs";import{join as Zs}from"node:path";import{createRequire as Gv}from"node:module";function hm(){return el===null&&(el=Gv(import.meta.url)("node:sqlite").DatabaseSync),el}function Vv(){let t=process.env.XDG_DATA_HOME||Zs(be,".local","share"),e=process.env.XDG_CONFIG_HOME||Zs(be,".config");return[Zs(t,"opencode","opencode.db"),Zs(e,"opencode","opencode.db")]}var el,Qs,_m=E(()=>{"use strict";Mt();el=null;Qs=class{name="opencode";dbPath;constructor(e){e?.dbPath?this.dbPath=e.dbPath:this.dbPath=Vv().find(r=>pm(r))??null}openDb(){return!this.dbPath||!pm(this.dbPath)?null:new(hm())(this.dbPath,{open:!0,readOnly:!0})}async discoverSessions(){let e=this.openDb();if(!e)return[];try{let r=new Map,n=e.prepare("SELECT id, worktree, name FROM project").all();for(let i of n)r.set(i.id,i);let s=e.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
972
972
  s.time_created, s.time_updated
973
973
  FROM session s
974
974
  ORDER BY s.time_updated DESC`).all(),o=[];for(let i of s){let a=r.get(i.project_id),l=i.directory||a?.worktree||"(unknown)",c=e.prepare(`SELECT m.id, m.data, m.time_created FROM message m
@@ -981,9 +981,9 @@ ${r}`:r}function pv(t){let e=[...t.matchAll(cv)];if(e.length>0){let r=e[e.length
981
981
  FROM session s
982
982
  WHERE s.id LIKE ?
983
983
  ORDER BY s.time_updated DESC
984
- LIMIT 2`).all(`${r}%`);return s.length!==1?null:s[0]}}});function tl(){return new el}var el,rl=E(()=>{"use strict";_m();Dt();ar();yt();el=class extends je{constructor(){super({provider:new Qs,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)=>Lr(e,{...r,acpTool:"opencode"})})}}});import{readdir as eo,readFile as Kv,rm as Yv}from"node:fs/promises";import{basename as gm,join as Wt}from"node:path";function wm(t){return t.type==="user"||t.message?.role==="user"}function ym(t){return t.type==="assistant"||t.message?.role==="assistant"||t.message?.role==="model"}function Em(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 rl(){return new tl}var tl,nl=E(()=>{"use strict";_m();Dt();lr();yt();tl=class extends je{constructor(){super({provider:new Qs,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)=>Lr(e,{...r,acpTool:"opencode"})})}}});import{readdir as eo,readFile as Kv,rm as Yv}from"node:fs/promises";import{basename as gm,join as Wt}from"node:path";function wm(t){return t.type==="user"||t.message?.role==="user"}function ym(t){return t.type==="assistant"||t.message?.role==="assistant"||t.message?.role==="model"}function Em(t){let e=t.message;return e?typeof e.content=="string"?e.content:Array.isArray(e.content)?e.content.filter(r=>r.type==="text").map(r=>r.text||"").join(`
985
985
  `):Array.isArray(e.parts)?e.parts.filter(r=>!r.thought&&r.type!=="thinking").map(r=>r.text||"").join(`
986
- `):"":""}function bm(t){return t.model||t.message?.model}var to,Tm=E(()=>{"use strict";Mt();to=class{name="qwen";baseDir;constructor(e){this.baseDir=e?.qwenDir||Wt(be,".qwen")}async discoverSessions(){let e=Wt(this.baseDir,"projects"),r;try{r=await eo(e)}catch{return[]}let n=[];for(let s of r){let o=Wt(e,s,"chats"),i;try{i=await eo(o)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=Wt(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)),wm(d)){let f=Em(d).trim();f&&(l||(l=G(f,80)),c=G(f,80)),u++}if(ym(d)){let f=bm(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=gm(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 De(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(wm(f)){let h=Em(f);h.trim()&&(c||(c=G(h.trim(),80)),u=G(h.trim(),80)),d.push({role:"user",timestamp:p,content:h})}else if(ym(f)){let h=bm(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=Wt(this.baseDir,"projects");try{let n=await eo(r),s=[];for(let o of n){let i=Wt(r,o,"chats",`${e}.jsonl`);try{return await Kv(i,{flag:"r"}),i}catch{continue}}for(let o of n){let i=Wt(r,o,"chats"),a;try{a=await eo(i)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;gm(l,".jsonl").startsWith(e)&&s.push(Wt(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 sl(){return new nl}var nl,ol=E(()=>{"use strict";Tm();Dt();ar();yt();nl=class extends je{constructor(){super({provider:new to,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:Hs})}}});import{readdir as Sm,readFile as zv,rm as km,stat as vm}from"node:fs/promises";import{basename as il,join as St}from"node:path";async function Zv(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 Qv(t,e){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function Im(t){return t.type==="USER_INPUT"}function $m(t){return t.source==="MODEL"&&t.type==="PLANNER_RESPONSE"}function e0(t){return t.source==="MODEL"&&t.type!=="PLANNER_RESPONSE"}function Nm(t){if(!t)return"";let e=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(t);return e?e[1]:t}function xm(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 t0(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}async function r0(t){for await(let e of De(t)){let r=e.tool_calls?.map(s=>s.args)??[];for(let s of r){let o=n0(s);if(o)return o}let n=s0(e.content);if(n)return n}return null}function n0(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 s0(t){return t?/"Cwd":"([^"]+)"/.exec(t)?.[1]??null:null}function jm(t){if(t.endsWith(".db"))return il(t,".db");let e="/brain/",r=t.indexOf(e);return r===-1?null:t.slice(r+e.length).split("/")[0]||null}var ro,Am=E(()=>{"use strict";Mt();ro=class{name="agy";baseDir;constructor(e={}){this.baseDir=e.agyDir||St(be,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:St(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let e=St(this.baseDir,"conversations"),r;try{r=await Sm(e)}catch{return[]}let n=[];for(let s of r){if(!s.endsWith(".db"))continue;let o=il(s,".db");try{let i=await this.extractSummary(o);i&&n.push(i)}catch{}}return n}conversationPath(e){return St(this.baseDir,"conversations",`${e}.db`)}transcriptPath(e){return St(this.baseDir,"brain",e,".system_generated","logs","transcript.jsonl")}async existingTranscriptPath(e){let r=this.transcriptPath(e);try{return await vm(r),r}catch{return null}}async extractSummary(e){let r=this.conversationPath(e),n=await this.existingTranscriptPath(e),s=n??r,o=await Zv([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=xm(f.content);if(m&&(a=m),Im(f)){let p=Nm(f.content).trim();p&&(l||(l=G(p,80)),c=G(p,80)),u++}else $m(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=jm(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 De(o)){let d=Qv(u.created_at,s.modifiedAt),f=xm(u.content);if(f&&(a=f),Im(u)){let m=Nm(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:t0(m.args),toolName:m.name||"tool"});$m(u)&&u.content?i.push({role:"assistant",timestamp:d,content:u.content,model:a}):e0(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 vm(r),r}catch{}let n=St(this.baseDir,"conversations");try{let s=[];for(let o of await Sm(n)){if(!o.endsWith(".db"))continue;il(o,".db").startsWith(e)&&s.push(St(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=jm(r);return n?(await km(this.conversationPath(n),{force:!0}),await km(St(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 r0(r);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(e){let r=St(this.baseDir,"cache","last_conversations.json");try{let n=JSON.parse(await zv(r,"utf8"));for(let[s,o]of Object.entries(n))if(o===e)return s}catch{}return null}}});import{spawn as o0}from"node:child_process";function ll(t){return new al(t)}async function i0(t,e){let r=Date.now(),n=["--conversation",e.sessionId,"-p",t,"--dangerously-skip-permissions","--print-timeout",l0(e.timeoutMs)];e.model&&n.push("--model",e.model),Ft("agy",n,e.permissionMode??"yolo"),e.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await a0(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 a0(t,e,r){return new Promise((n,s)=>{let o;try{o=o0(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 l0(t){return!t||t<=0?"8h":`${Math.max(1,Math.ceil(t/1e3))}s`}var al,cl=E(()=>{"use strict";Am();Dt();yt();bn();al=class extends je{constructor(e){super({provider:new ro(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:i0})}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 c0}from"node:crypto";import{join as u0}from"node:path";function d0(t){return c0("sha256").update(t).digest("hex").slice(0,8)}function f0(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"session"}function m0(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 p0(t){return t.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function no(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 fl(){return new dl}var ur,ul,dl,ml=E(()=>{"use strict";ur=new Map;ul=class{name="ClaudeMock";async discoverSessions(){return[...ur.values()].map(Rm)}async loadSession(e){let r=ur.get(e);return r===void 0?null:{...Rm(r),messages:r.messages.slice()}}async resolveSessionPath(e){return ur.get(e)?.filePath??null}async deleteSession(e){return ur.delete(e)}},dl=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new ul;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=f0(m0(e,r)),s=`mock-${n}-${d0(`${e}:${n}`)}`,o=new Date,i=ur.get(s),a=r?.prompt??"ClaudeMock seed",l=no(a),c={sessionId:s,cwd:e,filePath:u0(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+=no("ACK: ClaudeMock seeded"),ur.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=ur.get(r.sessionId);if(s===void 0)throw new Error(`ClaudeMock session not found: ${r.sessionId}`);let o=new Date,i=`ClaudeMock ack: ${p0(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+=no(e),s.totalOutputTokens+=no(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=[Wa({claudeDir:t?.claudeDir}),Ha({codexDir:t?.codexDir,codeDir:t?.codeDir}),Ka({geminiDir:t?.geminiDir,claudeDir:t?.claudeDir,codexDir:t?.codexDir,codeDir:t?.codeDir}),za({copilotDir:t?.copilotDir}),tl(),sl(),ll({agyDir:t?.agyDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&e.push(fl()),e}var pl=E(()=>{"use strict";Ba();Ja();Ya();Za();rl();ol();cl();ml();Ba();Ja();Ya();Za();rl();ol();cl();ml()});var wl={};ie(wl,{ProviderRegistry:()=>En,TransportConnectionError:()=>ye,TransportError:()=>Je,TransportJsonError:()=>Ps,TransportProcessError:()=>Et,TransportRpcError:()=>bt,_resetDefaultRegistryForTests:()=>h0,chat:()=>dr,countTokens:()=>gl,createAdapterRegistry:()=>at,createAllAdapters:()=>ct,listSessions:()=>_l,seed:()=>hl});function oo(){return so===null&&(so=at(ct())),so}function h0(){so=null}function Lm(t,e){let r=t.getAdapter(e);if(!r)throw new Error(`provider "${e}" is not registered in this registry`);return r}async function dr(t){let e=t.registry??oo(),r=Lm(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 hl(t){let e=t.registry??oo(),r=Lm(e,t.provider),n=await Om(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 Om(e,t.provider,t.cwd),i=_0(n,o);return i?{success:!0,sessionId:i}:{success:!0}}async function Om(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 _0(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 _l(t={}){return(t.registry??oo()).listAll({provider:t.provider,workspace:t.workspace,limit:t.limit,from:t.from,to:t.to})}async function gl(t){let r=await(t.registry??oo()).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 so,kt=E(()=>{"use strict";Ra();pl();Ra();pl();Ar();so=null});function g0(){return yl===null&&(yl=at(ct())),yl}async function Dr(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 y0(t)}catch(i){throw s=!0,o=i,i}finally{if(n)if(!s)Mr.delete(r),e.setMemberState(r,"idle");else{let i=w0(o,r);e.setMemberState(r,i!==null?"attention_needed":"idle",i)}}}function w0(t,e){if(!(t instanceof Ee))return Mr.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=(Mr.get(e)??0)+1;return r>=3?(Mr.delete(e),"consecutive_timeouts"):(Mr.set(e,r),null)}return Mr.delete(e),null}async function y0(t){let e=t.timeoutMs,r=typeof e=="number"&&e>0,n=g0(),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`,El(t.sessionid,t.sessiondir,"unresolved")));s=u.provider.name}catch(u){return Promise.reject(new Ee("other",null,`library: session resolution failed: ${Cm(u)}`,El(t.sessionid,t.sessiondir,"unresolved")))}let o=El(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 dr({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):E0(u,o)}finally{a!==null&&clearTimeout(a)}}function El(t,e,r){return["<library>","chat",t,e,"--provider",r]}function Cm(t){return t instanceof Error?t.message:String(t)}function E0(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 Et?new Ee("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof bt?new Ee("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof Je?new Ee("other",null,t.message,e):new Ee("other",null,Cm(t),e)}var Ee,yl,Mr,Nn=E(()=>{"use strict";kt();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"}},yl=null;Mr=new Map});function Mm(){return bl===null&&(bl=at(ct())),bl}function T0(t,e){if(!b0.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 Pr(t){let e=T0(t.member.provider,t.dal),r=e===t.member.provider?t.member:{...t.member,provider:e},n=await S0({member:r});return t.dal.setMemberProviderResolved(t.member.id,e),{sessionid:n.sessionid,provider_resolved:e}}async function S0(t){let e=t.member.provider,r=t.member.sessiondir,n=Tl("seed",r,e);try{let s=await hl({provider:e,cwd:r,registry:Mm()});if(!s.success)throw v0(s.error,n);if(!s.sessionId)throw new Te("parse",0,"",n);return{sessionid:s.sessionId}}catch(s){throw s instanceof Te?s:Sl(s,n)}}async function Dm(t){return k0(t)}async function k0(t){let e=Mm(),r=Tl("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:Sl(o,r)}let s=Tl("tokens",t.sessionid,n);try{let o=await gl({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:Sl(o,s)}}function Tl(t,e,r){return["<library>",t,e,"--provider",r]}function v0(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 Sl(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 Et?new Te("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof bt?new Te("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof Je?new Te("other",null,t.message,e):new Te("other",null,t instanceof Error?t.message:String(t),e)}var Te,bl,b0,io=E(()=>{"use strict";kt();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"}},bl=null;b0=/^provider[123]$/});function ao(t){return Buffer.from(t,"utf8").toString("base64url")}function jn(t){return Buffer.from(t,"base64url").toString("utf8")}async function Pm(t,e=r=>Dm({sessionid:r})){if(process.env.LMCTL_SESSION_SIZE_DISABLED==="1")return{recorded:0,failed:0};let r=0,n=0;for(let s of I0(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 Fm(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 xn(r,n.member.state);t.setMemberState(n.member.id,"in_chat","compacting");try{return await Dr({sessionid:n.member.sessionid,sessiondir:n.member.sessiondir,prompt:"/compact"}),t.setMemberState(n.member.id,"idle",null),{ok:!0,row:Wm(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 kl(t,e,r){let n=Um(t,e,r);if(n===null)throw new Error("session member not found");let s=await Pr({member:n.member,dal:t});return t.updateTeamMemberSession(n.member.id,s.sessionid),{ok:!0,sessionid:s.sessionid,row:Wm(t,e,r)}}function I0(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 Wm(t,e,r){return t.sessionSizeHistory(e,r,1)[0]??null}var xn,lo=E(()=>{"use strict";Nn();io();xn=class extends Error{constructor(e,r){super(`member ${e} is currently ${r}; cannot compact while busy`),this.name="MemberBusyError"}}});async function vl(t){let e=t.dal,r=t.nowMs??Date.now(),n=t.thresholdMs??N0(e),s=r-n,o=e.query(`
986
+ `):"":""}function bm(t){return t.model||t.message?.model}var to,Tm=E(()=>{"use strict";Mt();to=class{name="qwen";baseDir;constructor(e){this.baseDir=e?.qwenDir||Wt(be,".qwen")}async discoverSessions(){let e=Wt(this.baseDir,"projects"),r;try{r=await eo(e)}catch{return[]}let n=[];for(let s of r){let o=Wt(e,s,"chats"),i;try{i=await eo(o)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=Wt(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)),wm(d)){let f=Em(d).trim();f&&(l||(l=G(f,80)),c=G(f,80)),u++}if(ym(d)){let f=bm(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=gm(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 De(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(wm(f)){let h=Em(f);h.trim()&&(c||(c=G(h.trim(),80)),u=G(h.trim(),80)),d.push({role:"user",timestamp:p,content:h})}else if(ym(f)){let h=bm(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=Wt(this.baseDir,"projects");try{let n=await eo(r),s=[];for(let o of n){let i=Wt(r,o,"chats",`${e}.jsonl`);try{return await Kv(i,{flag:"r"}),i}catch{continue}}for(let o of n){let i=Wt(r,o,"chats"),a;try{a=await eo(i)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;gm(l,".jsonl").startsWith(e)&&s.push(Wt(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 ol(){return new sl}var sl,il=E(()=>{"use strict";Tm();Dt();lr();yt();sl=class extends je{constructor(){super({provider:new to,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:Hs})}}});import{readdir as Sm,readFile as zv,rm as km,stat as vm}from"node:fs/promises";import{basename as al,join as St}from"node:path";async function Zv(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 Qv(t,e){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function Im(t){return t.type==="USER_INPUT"}function $m(t){return t.source==="MODEL"&&t.type==="PLANNER_RESPONSE"}function e0(t){return t.source==="MODEL"&&t.type!=="PLANNER_RESPONSE"}function Nm(t){if(!t)return"";let e=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(t);return e?e[1]:t}function xm(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 t0(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}async function r0(t){for await(let e of De(t)){let r=e.tool_calls?.map(s=>s.args)??[];for(let s of r){let o=n0(s);if(o)return o}let n=s0(e.content);if(n)return n}return null}function n0(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 s0(t){return t?/"Cwd":"([^"]+)"/.exec(t)?.[1]??null:null}function jm(t){if(t.endsWith(".db"))return al(t,".db");let e="/brain/",r=t.indexOf(e);return r===-1?null:t.slice(r+e.length).split("/")[0]||null}var ro,Am=E(()=>{"use strict";Mt();ro=class{name="agy";baseDir;constructor(e={}){this.baseDir=e.agyDir||St(be,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:St(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let e=St(this.baseDir,"conversations"),r;try{r=await Sm(e)}catch{return[]}let n=[];for(let s of r){if(!s.endsWith(".db"))continue;let o=al(s,".db");try{let i=await this.extractSummary(o);i&&n.push(i)}catch{}}return n}conversationPath(e){return St(this.baseDir,"conversations",`${e}.db`)}transcriptPath(e){return St(this.baseDir,"brain",e,".system_generated","logs","transcript.jsonl")}async existingTranscriptPath(e){let r=this.transcriptPath(e);try{return await vm(r),r}catch{return null}}async extractSummary(e){let r=this.conversationPath(e),n=await this.existingTranscriptPath(e),s=n??r,o=await Zv([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=xm(f.content);if(m&&(a=m),Im(f)){let p=Nm(f.content).trim();p&&(l||(l=G(p,80)),c=G(p,80)),u++}else $m(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=jm(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 De(o)){let d=Qv(u.created_at,s.modifiedAt),f=xm(u.content);if(f&&(a=f),Im(u)){let m=Nm(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:t0(m.args),toolName:m.name||"tool"});$m(u)&&u.content?i.push({role:"assistant",timestamp:d,content:u.content,model:a}):e0(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 vm(r),r}catch{}let n=St(this.baseDir,"conversations");try{let s=[];for(let o of await Sm(n)){if(!o.endsWith(".db"))continue;al(o,".db").startsWith(e)&&s.push(St(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=jm(r);return n?(await km(this.conversationPath(n),{force:!0}),await km(St(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 r0(r);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(e){let r=St(this.baseDir,"cache","last_conversations.json");try{let n=JSON.parse(await zv(r,"utf8"));for(let[s,o]of Object.entries(n))if(o===e)return s}catch{}return null}}});import{spawn as o0}from"node:child_process";function cl(t){return new ll(t)}async function i0(t,e){let r=Date.now(),n=["--conversation",e.sessionId,"-p",t,"--dangerously-skip-permissions","--print-timeout",l0(e.timeoutMs)];e.model&&n.push("--model",e.model),Ft("agy",n,e.permissionMode??"yolo"),e.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await a0(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 a0(t,e,r){return new Promise((n,s)=>{let o;try{o=o0(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 l0(t){return!t||t<=0?"8h":`${Math.max(1,Math.ceil(t/1e3))}s`}var ll,ul=E(()=>{"use strict";Am();Dt();yt();bn();ll=class extends je{constructor(e){super({provider:new ro(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:i0})}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 c0}from"node:crypto";import{join as u0}from"node:path";function d0(t){return c0("sha256").update(t).digest("hex").slice(0,8)}function f0(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"session"}function m0(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 p0(t){return t.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function no(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 ml(){return new fl}var dr,dl,fl,pl=E(()=>{"use strict";dr=new Map;dl=class{name="ClaudeMock";async discoverSessions(){return[...dr.values()].map(Rm)}async loadSession(e){let r=dr.get(e);return r===void 0?null:{...Rm(r),messages:r.messages.slice()}}async resolveSessionPath(e){return dr.get(e)?.filePath??null}async deleteSession(e){return dr.delete(e)}},fl=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new dl;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=f0(m0(e,r)),s=`mock-${n}-${d0(`${e}:${n}`)}`,o=new Date,i=dr.get(s),a=r?.prompt??"ClaudeMock seed",l=no(a),c={sessionId:s,cwd:e,filePath:u0(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+=no("ACK: ClaudeMock seeded"),dr.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=dr.get(r.sessionId);if(s===void 0)throw new Error(`ClaudeMock session not found: ${r.sessionId}`);let o=new Date,i=`ClaudeMock ack: ${p0(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+=no(e),s.totalOutputTokens+=no(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=[Ba({claudeDir:t?.claudeDir}),Ja({codexDir:t?.codexDir,codeDir:t?.codeDir}),Ya({geminiDir:t?.geminiDir,claudeDir:t?.claudeDir,codexDir:t?.codexDir,codeDir:t?.codeDir}),Za({copilotDir:t?.copilotDir}),rl(),ol(),cl({agyDir:t?.agyDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&e.push(ml()),e}var hl=E(()=>{"use strict";qa();Xa();za();Qa();nl();il();ul();pl();qa();Xa();za();Qa();nl();il();ul();pl()});var yl={};ie(yl,{ProviderRegistry:()=>En,TransportConnectionError:()=>ye,TransportError:()=>Je,TransportJsonError:()=>Ps,TransportProcessError:()=>Et,TransportRpcError:()=>bt,_resetDefaultRegistryForTests:()=>h0,chat:()=>fr,countTokens:()=>wl,createAdapterRegistry:()=>at,createAllAdapters:()=>ct,listSessions:()=>gl,seed:()=>_l});function oo(){return so===null&&(so=at(ct())),so}function h0(){so=null}function Lm(t,e){let r=t.getAdapter(e);if(!r)throw new Error(`provider "${e}" is not registered in this registry`);return r}async function fr(t){let e=t.registry??oo(),r=Lm(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 _l(t){let e=t.registry??oo(),r=Lm(e,t.provider),n=await Om(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 Om(e,t.provider,t.cwd),i=_0(n,o);return i?{success:!0,sessionId:i}:{success:!0}}async function Om(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 _0(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 gl(t={}){return(t.registry??oo()).listAll({provider:t.provider,workspace:t.workspace,limit:t.limit,from:t.from,to:t.to})}async function wl(t){let r=await(t.registry??oo()).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 so,kt=E(()=>{"use strict";Oa();hl();Oa();hl();Ar();so=null});function g0(){return El===null&&(El=at(ct())),El}async function Dr(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 y0(t)}catch(i){throw s=!0,o=i,i}finally{if(n)if(!s)Mr.delete(r),e.setMemberState(r,"idle");else{let i=w0(o,r);e.setMemberState(r,i!==null?"attention_needed":"idle",i)}}}function w0(t,e){if(!(t instanceof Ee))return Mr.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=(Mr.get(e)??0)+1;return r>=3?(Mr.delete(e),"consecutive_timeouts"):(Mr.set(e,r),null)}return Mr.delete(e),null}async function y0(t){let e=t.timeoutMs,r=typeof e=="number"&&e>0,n=g0(),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`,bl(t.sessionid,t.sessiondir,"unresolved")));s=u.provider.name}catch(u){return Promise.reject(new Ee("other",null,`library: session resolution failed: ${Cm(u)}`,bl(t.sessionid,t.sessiondir,"unresolved")))}let o=bl(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 fr({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):E0(u,o)}finally{a!==null&&clearTimeout(a)}}function bl(t,e,r){return["<library>","chat",t,e,"--provider",r]}function Cm(t){return t instanceof Error?t.message:String(t)}function E0(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 Et?new Ee("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof bt?new Ee("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof Je?new Ee("other",null,t.message,e):new Ee("other",null,Cm(t),e)}var Ee,El,Mr,Nn=E(()=>{"use strict";kt();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"}},El=null;Mr=new Map});function Mm(){return Tl===null&&(Tl=at(ct())),Tl}function T0(t,e){if(!b0.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 Pr(t){let e=T0(t.member.provider,t.dal),r=e===t.member.provider?t.member:{...t.member,provider:e},n=await S0({member:r});return t.dal.setMemberProviderResolved(t.member.id,e),{sessionid:n.sessionid,provider_resolved:e}}async function S0(t){let e=t.member.provider,r=t.member.sessiondir,n=Sl("seed",r,e);try{let s=await _l({provider:e,cwd:r,registry:Mm()});if(!s.success)throw v0(s.error,n);if(!s.sessionId)throw new Te("parse",0,"",n);return{sessionid:s.sessionId}}catch(s){throw s instanceof Te?s:kl(s,n)}}async function Dm(t){return k0(t)}async function k0(t){let e=Mm(),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:kl(o,r)}let s=Sl("tokens",t.sessionid,n);try{let o=await wl({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:kl(o,s)}}function Sl(t,e,r){return["<library>",t,e,"--provider",r]}function v0(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 kl(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 Et?new Te("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof bt?new Te("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof Je?new Te("other",null,t.message,e):new Te("other",null,t instanceof Error?t.message:String(t),e)}var Te,Tl,b0,io=E(()=>{"use strict";kt();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"}},Tl=null;b0=/^provider[123]$/});function ao(t){return Buffer.from(t,"utf8").toString("base64url")}function jn(t){return Buffer.from(t,"base64url").toString("utf8")}async function Pm(t,e=r=>Dm({sessionid:r})){if(process.env.LMCTL_SESSION_SIZE_DISABLED==="1")return{recorded:0,failed:0};let r=0,n=0;for(let s of I0(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 Fm(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 xn(r,n.member.state);t.setMemberState(n.member.id,"in_chat","compacting");try{return await Dr({sessionid:n.member.sessionid,sessiondir:n.member.sessiondir,prompt:"/compact"}),t.setMemberState(n.member.id,"idle",null),{ok:!0,row:Wm(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 vl(t,e,r){let n=Um(t,e,r);if(n===null)throw new Error("session member not found");let s=await Pr({member:n.member,dal:t});return t.updateTeamMemberSession(n.member.id,s.sessionid),{ok:!0,sessionid:s.sessionid,row:Wm(t,e,r)}}function I0(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 Wm(t,e,r){return t.sessionSizeHistory(e,r,1)[0]??null}var xn,lo=E(()=>{"use strict";Nn();io();xn=class extends Error{constructor(e,r){super(`member ${e} is currently ${r}; cannot compact while busy`),this.name="MemberBusyError"}}});async function Il(t){let e=t.dal,r=t.nowMs??Date.now(),n=t.thresholdMs??N0(e),s=r-n,o=e.query(`
987
987
  SELECT
988
988
  isess.id AS interactive_session_id,
989
989
  isess.run_id,
@@ -1009,16 +1009,16 @@ ${r}`:r}function pv(t){let e=[...t.matchAll(cv)];if(e.length>0){let r=e[e.length
1009
1009
  JOIN step s ON s.id = isess.step_id
1010
1010
  WHERE isess.status = 'waiting_agent'
1011
1011
  AND r.terminal_state IS NULL
1012
- `),i={scanned:o.length,hung_detected:0,attentions_created:0,duplicates_suppressed:0};for(let a of o){let l=A0(a.workflow_definition,a.session_state_name,a.step_state_name);if(l===null)continue;let c=x0(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,j0(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 N0(t){return Bm(t.getConfig(co),$0)*1e3}function Il(t,e){return Bm(t.getConfig(uo),e)}function Bm(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 x0(t,e,r){return t.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",e,r)[0]??null}function j0(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=A0(a.workflow_definition,a.session_state_name,a.step_state_name);if(l===null)continue;let c=x0(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,j0(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 N0(t){return Bm(t.getConfig(co),$0)*1e3}function $l(t,e){return Bm(t.getConfig(uo),e)}function Bm(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 x0(t,e,r){return t.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",e,r)[0]??null}function j0(t,e,r,n){return t.query(`SELECT * FROM attention
1013
1013
  WHERE kind = 'session_hung'
1014
1014
  AND run_id = ?
1015
- AND acknowledged_at IS NULL`,e).some(o=>{let i=qm(o.payload);return i!==null&&i.step_id===r&&i.session_id===n})}function A0(t,e,r){let n=qm(t);return n===null?null:R0(n,e,r)??O0(n,e,r)}function R0(t,e,r){if(!Array.isArray(t.steps))return null;let n=t.steps.filter(L0),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=fr(s.members)?s.members:null,i=o!==null&&fr(o.agent)?o.agent:null;return typeof i?.alias=="string"?i.alias:null}function O0(t,e,r){if(!fr(t.states))return null;let n=t.states[e]??t.states[r];if(!fr(n))return null;let s=n;if(!fr(s.agent))return null;let o=s.agent;return typeof o.alias=="string"?o.alias:null}function L0(t){return fr(t)}function qm(t){if(t===null)return null;try{let e=JSON.parse(t);return fr(e)?e:null}catch{return null}}function fr(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var co,uo,$0,$l=E(()=>{"use strict";Me();co="monitor.session_hung.elapsed_threshold_seconds",uo="monitor.session_hung.check_interval_ms",$0=600});function mo(t){let e=t.query(`
1015
+ AND acknowledged_at IS NULL`,e).some(o=>{let i=qm(o.payload);return i!==null&&i.step_id===r&&i.session_id===n})}function A0(t,e,r){let n=qm(t);return n===null?null:R0(n,e,r)??O0(n,e,r)}function R0(t,e,r){if(!Array.isArray(t.steps))return null;let n=t.steps.filter(L0),s=n.find(a=>a.id===e)??n.find(a=>a.name===e)??n.find(a=>a.name===r);if(s===void 0||s.type!=="lmctl/interactive")return null;let o=mr(s.members)?s.members:null,i=o!==null&&mr(o.agent)?o.agent:null;return typeof i?.alias=="string"?i.alias:null}function O0(t,e,r){if(!mr(t.states))return null;let n=t.states[e]??t.states[r];if(!mr(n))return null;let s=n;if(!mr(s.agent))return null;let o=s.agent;return typeof o.alias=="string"?o.alias:null}function L0(t){return mr(t)}function qm(t){if(t===null)return null;try{let e=JSON.parse(t);return mr(e)?e:null}catch{return null}}function mr(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var co,uo,$0,Nl=E(()=>{"use strict";Me();co="monitor.session_hung.elapsed_threshold_seconds",uo="monitor.session_hung.check_interval_ms",$0=600});function mo(t){let e=t.query(`
1016
1016
  SELECT status, COUNT(*) AS count FROM job GROUP BY status
1017
- `),r={queued:fo(e,"queued"),running:fo(e,"running"),done:fo(e,"done"),failed:fo(e,"failed"),total:xl(e)},n=t.query(`
1017
+ `),r={queued:fo(e,"queued"),running:fo(e,"running"),done:fo(e,"done"),failed:fo(e,"failed"),total:jl(e)},n=t.query(`
1018
1018
  SELECT terminal_state, COUNT(*) AS count FROM run GROUP BY terminal_state
1019
1019
  `),s=t.query(`
1020
1020
  SELECT acknowledged_at, COUNT(*) AS count FROM attention GROUP BY acknowledged_at IS NOT NULL
1021
- `);return{generated_at:new Date().toISOString(),jobs:r,runs:{active:n.filter(o=>o.terminal_state===null).reduce((o,i)=>o+i.count,0),terminal:n.filter(o=>o.terminal_state!==null).reduce((o,i)=>o+i.count,0),total:xl(n)},attentions:{unacked:s.filter(o=>o.acknowledged_at===null).reduce((o,i)=>o+i.count,0),total:xl(s)},projects:Nl(t,"project"),teams:Nl(t,"team"),workflows:Nl(t,"workflow")}}function po(t){return t.listProjects()}function Xm(t){return t.listTeams().map(e=>({...e,members:t.listTeamMembers(e.id)}))}function ho(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:jl(n)},attentions:{unacked:s.filter(o=>o.acknowledged_at===null).reduce((o,i)=>o+i.count,0),total:jl(s)},projects:xl(t,"project"),teams:xl(t,"team"),workflows:xl(t,"workflow")}}function po(t){return t.listProjects()}function Xm(t){return t.listTeams().map(e=>({...e,members:t.listTeamMembers(e.id)}))}function ho(t){return t.query(`
1022
1022
  SELECT w.*
1023
1023
  FROM workflow w
1024
1024
  JOIN (
@@ -1027,7 +1027,7 @@ ${r}`:r}function pv(t){let e=[...t.matchAll(cv)];if(e.length>0){let r=e[e.length
1027
1027
  GROUP BY name
1028
1028
  ) latest ON latest.name = w.name AND latest.version = w.version
1029
1029
  ORDER BY w.name ASC
1030
- `)}function 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 Vm(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 Km(t,e){return t.getSubmittedPr(e)}function _o(t,e){return t.query("SELECT * FROM job WHERE id = ?",e)[0]??null}function Fr(t,e={}){return t.query("SELECT * FROM run ORDER BY id DESC LIMIT ?",e.limit??100)}function mr(t,e){let r=t.query("SELECT * FROM run WHERE id = ?",e)[0];return r===void 0?null:{...r,job:_o(t,r.job_id),workflow:t.query("SELECT * FROM workflow WHERE id = ?",r.workflow_id)[0]??null,team:t.getTeam(r.team_id),steps:C0(t,r.id)}}function C0(t,e){return t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e).map(r=>({...r,artifacts:Ym(t,r.id)}))}function jl(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:Ym(t,n.id)}}function Ym(t,e){return t.query("SELECT * FROM step_artifact WHERE step_id = ? ORDER BY id ASC",e)}function pr(t,e,r){let n=r===void 0?"SELECT sa.*, s.state_name FROM step_artifact sa JOIN step s ON sa.step_id = s.id WHERE s.run_id = ? ORDER BY sa.id ASC":"SELECT sa.*, s.state_name FROM step_artifact sa JOIN step s ON sa.step_id = s.id WHERE s.run_id = ? AND sa.kind = ? ORDER BY sa.id ASC";return r===void 0?t.query(n,e):t.query(n,e,r)}function zm(t,e,r){let n=jl(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 Zm(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 Qm(t,e={}){return e.unhandled===!0?t.query("SELECT * FROM external_signal WHERE handled_at IS NULL ORDER BY id DESC"):t.query("SELECT * FROM external_signal ORDER BY id DESC LIMIT 100")}function qt(t,e={}){return e.unacked===!0?t.query("SELECT * FROM attention WHERE acknowledged_at IS NULL ORDER BY id DESC"):t.query("SELECT * FROM attention ORDER BY id DESC LIMIT 100")}function go(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(`${ep}
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 Vm(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 Km(t,e){return t.getSubmittedPr(e)}function _o(t,e){return t.query("SELECT * FROM job WHERE id = ?",e)[0]??null}function Fr(t,e={}){return t.query("SELECT * FROM run ORDER BY id DESC LIMIT ?",e.limit??100)}function pr(t,e){let r=t.query("SELECT * FROM run WHERE id = ?",e)[0];return r===void 0?null:{...r,job:_o(t,r.job_id),workflow:t.query("SELECT * FROM workflow WHERE id = ?",r.workflow_id)[0]??null,team:t.getTeam(r.team_id),steps:C0(t,r.id)}}function C0(t,e){return t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e).map(r=>({...r,artifacts:Ym(t,r.id)}))}function Al(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:Ym(t,n.id)}}function Ym(t,e){return t.query("SELECT * FROM step_artifact WHERE step_id = ? ORDER BY id ASC",e)}function hr(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 zm(t,e,r){let n=Al(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 Zm(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 Qm(t,e={}){return e.unhandled===!0?t.query("SELECT * FROM external_signal WHERE handled_at IS NULL ORDER BY id DESC"):t.query("SELECT * FROM external_signal ORDER BY id DESC LIMIT 100")}function qt(t,e={}){return e.unacked===!0?t.query("SELECT * FROM attention WHERE acknowledged_at IS NULL ORDER BY id DESC"):t.query("SELECT * FROM attention ORDER BY id DESC LIMIT 100")}function go(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(`${ep}
1031
1031
  WHERE ${n}
1032
1032
  ORDER BY a.created_at DESC`,...r).map(tp)}function ut(t,e){let n=t.query(`${ep}
1033
1033
  WHERE a.id = ?`,e)[0];return n===void 0?null:tp(n)}function tp(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 rp(t){return t.query(`
@@ -1036,7 +1036,7 @@ ${r}`:r}function pv(t){let e=[...t.matchAll(cv)];if(e.length>0){let r=e[e.length
1036
1036
  JOIN workflow w ON w.id = r.workflow_id
1037
1037
  GROUP BY w.name, r.terminal_state
1038
1038
  ORDER BY w.name ASC, r.terminal_state ASC
1039
- `)}function Nl(t,e){return t.query(`SELECT COUNT(*) AS count FROM ${e}`)[0]?.count??0}function fo(t,e){return t.find(r=>r.status===e)?.count??0}function xl(t){return t.reduce((e,r)=>e+r.count,0)}function Al(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 xl(t,e){return t.query(`SELECT COUNT(*) AS count FROM ${e}`)[0]?.count??0}function fo(t,e){return t.find(r=>r.status===e)?.count??0}function jl(t){return t.reduce((e,r)=>e+r.count,0)}function Rl(t,e,r){let n=r!==void 0?new Date(Date.now()-Math.trunc(r)*864e5).toISOString():null,s=[e];n!==null&&s.push(n);let o=t.query(`SELECT s.state_name, s.outcome
1040
1040
  FROM step s
1041
1041
  JOIN run r ON r.id = s.run_id
1042
1042
  JOIN job j ON j.id = r.job_id
@@ -1060,7 +1060,7 @@ ${r}`:r}function pv(t){let e=[...t.matchAll(cv)];if(e.length>0){let r=e[e.length
1060
1060
  WHERE j.project_id = ?
1061
1061
  ${n!==null?"AND r.started_at >= ?":""}
1062
1062
  GROUP BY s.run_id, s.state_name
1063
- HAVING COUNT(*) > 1`,...s),_=new Map;for(let S of g){let I=_.get(S.state_name)??{runs:0,total_attempts:0};I.runs++,I.total_attempts+=S.attempt_count,_.set(S.state_name,I)}let T=[..._.entries()].map(([S,I])=>({state_name:S,retried_runs:I.runs,avg_retries:I.runs>0?Number((I.total_attempts/I.runs).toFixed(2)):0}));return{request_changes_rate:u,step_duration_histogram:h,retry_counts:T}}function Rl(t,e={}){let r=e.since_days!==void 0?Date.now()-Math.trunc(e.since_days)*864e5:0,n=e.project_id!==void 0?t.query(`SELECT json_extract(se.payload, '$.tool') AS tool_name, COUNT(*) AS cnt
1063
+ HAVING COUNT(*) > 1`,...s),_=new Map;for(let S of g){let I=_.get(S.state_name)??{runs:0,total_attempts:0};I.runs++,I.total_attempts+=S.attempt_count,_.set(S.state_name,I)}let T=[..._.entries()].map(([S,I])=>({state_name:S,retried_runs:I.runs,avg_retries:I.runs>0?Number((I.total_attempts/I.runs).toFixed(2)):0}));return{request_changes_rate:u,step_duration_histogram:h,retry_counts:T}}function Ol(t,e={}){let r=e.since_days!==void 0?Date.now()-Math.trunc(e.since_days)*864e5:0,n=e.project_id!==void 0?t.query(`SELECT json_extract(se.payload, '$.tool') AS tool_name, COUNT(*) AS cnt
1064
1064
  FROM session_event se
1065
1065
  JOIN run r ON r.id = se.run_id
1066
1066
  JOIN job j ON j.id = r.job_id
@@ -1142,7 +1142,7 @@ ${r}`:r}function pv(t){let e=[...t.matchAll(cv)];if(e.length>0){let r=e[e.length
1142
1142
  `),2):t$(r.rest.slice(2),e);if(r.rest[0]==="run"&&r.rest[1]==="where"&&ko(r.rest.slice(2)))return e.stdout.write(`${oI}
1143
1143
  `),0;if(r.rest[0]==="run"&&r.rest[1]==="timeline"&&ko(r.rest.slice(2)))return e.stdout.write(`${iI}
1144
1144
  `),0;if(r.rest[0]==="run"&&r.rest[1]==="where")return r.present?zI(r.rest.slice(2),e):ZI(r.rest.slice(2),e);if(r.rest[0]==="run"&&r.rest[1]==="timeline")return r.present?QI(r.rest.slice(2),e):e$(r.rest.slice(2),e);if(r.present)return MI(r.rest,e);let n=lp(t);if(typeof n=="string")return e.stderr.write(`error: ${n}
1145
- `),2;let s=hr(e),o=s.baseUrl,i=Ht(n.accept,s.token),a=n.body;if(n.upload!==void 0)try{a=hI(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=_r(e),o=s.baseUrl,i=Ht(n.accept,s.token),a=n.body;if(n.upload!==void 0)try{a=hI(n.upload.filePath,n.upload.project)}catch(c){return e.stderr.write(`error: upload failed: ${c instanceof Error?c.message:String(c)}
1146
1146
  `),2}else n.body!==void 0&&n.contentType!==void 0?i["Content-Type"]=n.contentType:n.body!==void 0&&(i["Content-Type"]="application/json");let l;try{l=await fetch(new URL(n.path,o),{method:n.method,headers:i,body:a})}catch(c){return e.stderr.write(`error: network failure: ${c instanceof Error?c.message:String(c)}
1147
1147
  `),2}if(!l.ok)return e.stderr.write(`error: HTTP ${l.status}: ${await l.text()}
1148
1148
  `),l.status===400?2:1;if(n.runAfterSubmit){let c=await l.json(),u=gI(c);if(u===null)return e.stderr.write(`error: submit-job response did not include a numeric job id
@@ -1152,7 +1152,7 @@ ${r}`:r}function pv(t){let e=[...t.matchAll(cv)];if(e.length>0){let r=e[e.length
1152
1152
  `):e.stdout.write(`${JSON.stringify(f)}
1153
1153
  `)}else n.json?e.stdout.write(`${JSON.stringify(await l.json(),null,2)}
1154
1154
  `):(e.stdout.write(await l.text()),e.stdout.write(`
1155
- `));return 0}function lp(t){let e=dp(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"?So(o,"/api/status",n):s==="projects"?So(o,"/api/projects",n):s==="teams"?So(o,"/api/teams",n):s==="workflows"?o[0]==="verify"?vI(o.slice(1),e.format):So(o,"/api/workflows",n):s==="workflow"?kI(o,n):s==="upload"?TI(o,n):s==="submit-job"?SI(o,n):s==="issues"?bI(o,n):s==="jobs"?An(o,"--status","/api/jobs","status",n):s==="job"?EI(o,n):s==="project"?II(o,n):s==="artifact"?xI(o,n):s==="runs"?An(o,"--limit","/api/runs","limit",n,!0):s==="external-objects"?An(o,"--type","/api/external-objects","type",n):s==="external-signals"?op(o,"--unhandled","/api/external-signals","unhandled",n):s==="attentions"||s==="attention"?o[0]==="ack"?jI(o,n):op(o,"--unacked","/api/attentions","unacked",n):s==="stats"?AI(o,n):s==="daemon"?RI(o,n):s==="intake"?OI(o,n):s==="session"?LI(o,n):s==="run"?CI(o,e.format):s==="prs"?An(o,"--status","/api/submitted-prs","status",n):s==="pr"?wI(o,n):`unknown subcommand: ${s}`}function Ht(t,e){let r={Accept:t};return e!==null&&e.length>0&&(r.Authorization=`Bearer ${e}`),r}function hr(t){if(t.dal!==void 0)return Rn(t.dal,process.env,t);let e=pe({path:de()});try{return Rn(e,process.env,t)}finally{e.close()}}function Rn(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=Z0;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: ${tI(l)} env var read; consider \`lmctl api config set ${l} ...\` to make this DB-canonical.
1155
+ `));return 0}function lp(t){let e=dp(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"?So(o,"/api/status",n):s==="projects"?So(o,"/api/projects",n):s==="teams"?So(o,"/api/teams",n):s==="workflows"?o[0]==="verify"?vI(o.slice(1),e.format):So(o,"/api/workflows",n):s==="workflow"?kI(o,n):s==="upload"?TI(o,n):s==="submit-job"?SI(o,n):s==="issues"?bI(o,n):s==="jobs"?An(o,"--status","/api/jobs","status",n):s==="job"?EI(o,n):s==="project"?II(o,n):s==="artifact"?xI(o,n):s==="runs"?An(o,"--limit","/api/runs","limit",n,!0):s==="external-objects"?An(o,"--type","/api/external-objects","type",n):s==="external-signals"?op(o,"--unhandled","/api/external-signals","unhandled",n):s==="attentions"||s==="attention"?o[0]==="ack"?jI(o,n):op(o,"--unacked","/api/attentions","unacked",n):s==="stats"?AI(o,n):s==="daemon"?RI(o,n):s==="intake"?OI(o,n):s==="session"?LI(o,n):s==="run"?CI(o,e.format):s==="prs"?An(o,"--status","/api/submitted-prs","status",n):s==="pr"?wI(o,n):`unknown subcommand: ${s}`}function Ht(t,e){let r={Accept:t};return e!==null&&e.length>0&&(r.Authorization=`Bearer ${e}`),r}function _r(t){if(t.dal!==void 0)return Rn(t.dal,process.env,t);let e=pe({path:de()});try{return Rn(e,process.env,t)}finally{e.close()}}function Rn(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=Z0;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: ${tI(l)} env var read; consider \`lmctl api config set ${l} ...\` to make this DB-canonical.
1156
1156
  `);return{baseUrl:o,token:a}}function tI(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 rI(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`usage: lmctl api config <get|set|list>
1157
1157
  `),2;let s=e.dal===void 0,o=e.dal??pe({path:de()});try{if(r==="get"){if(n.length!==1)return e.stderr.write(`usage: lmctl api config get <key>
1158
1158
  `),2;let i=n[0];if(!To.has(i))return e.stderr.write(`error: unsupported config key: ${i} (Phase A keys: ${[...To].join(", ")})
@@ -1170,7 +1170,7 @@ ${r}`:r}function pv(t){let e=[...t.matchAll(cv)];if(e.length>0){let r=e[e.length
1170
1170
  `),0;let n=gp(t,"--direct"),s=r||n.present,o=n.rest,[i,...a]=o;return i===void 0?(e.stderr.write(`usage: lmctl api escalations <list|show|respond>
1171
1171
  `),2):s?lI(i,a,e):i==="list"?uI(a,e):i==="show"?fI(a,e):i==="respond"?mI(a,e):(e.stderr.write(`error: unknown api escalations verb: ${i}
1172
1172
  `),2)}function ko(t){return t.some(e=>e==="--help"||e==="-h")}function lI(t,e,r){let n=r.dal===void 0,s=r.dal??pe({path:de()});try{return wp(s,[t,...e],r)}finally{n&&s.close()}}function cp(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=cI(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 cI(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 uI(t,e){let r=cp(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1173
- `),2;let n=hr(e),s=Ht("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)}
1173
+ `),2;let n=_r(e),s=Ht("application/json",n.token),o=new URLSearchParams;r.project!==void 0&&o.set("project",r.project),r.all&&o.set("all","true"),r.since!==void 0&&o.set("since",r.since);let i=o.toString().length>0?`?${o.toString()}`:"",a;try{a=await fetch(new URL(`/api/escalations${i}`,n.baseUrl),{method:"GET",headers:s})}catch(c){return e.stderr.write(`error: network failure: ${c instanceof Error?c.message:String(c)}
1174
1174
  `),1}if(!a.ok)return e.stderr.write(`error: HTTP ${a.status}: ${await a.text()}
1175
1175
  `),a.status===400?2:1;let l=await a.json();return up(l,r.json,e)}function up(t,e,r){if(e)return r.stdout.write(`${JSON.stringify(t,null,2)}
1176
1176
  `),0;if(t.length===0)return r.stdout.write(`No pending escalations.
@@ -1184,18 +1184,18 @@ ${r}`:r}function pv(t){let e=[...t.matchAll(cv)];if(e.length>0){let r=e[e.length
1184
1184
  `),r.stdout.write(`
1185
1185
  `)}return 0}function dI(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 fI(t,e){let r=t.filter(a=>a!=="--json"&&a!=="--text");if(r.length!==1)return e.stderr.write(`usage: lmctl api escalations show <attention_id> [--json|--text]
1186
1186
  `),2;let n=ne(r[0],"attention_id");if(typeof n=="string")return e.stderr.write(`error: ${n}
1187
- `),2;let s=hr(e),o=Ht("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=_r(e),o=Ht("application/json",s.token),i;try{i=await fetch(new URL(`/api/escalations/${n}`,s.baseUrl),{method:"GET",headers:o})}catch(a){return e.stderr.write(`error: network failure: ${a instanceof Error?a.message:String(a)}
1188
1188
  `),1}return i.status===404?(e.stderr.write(`error: escalation not found: ${n}
1189
1189
  `),1):i.ok?(e.stdout.write(`${JSON.stringify(await i.json(),null,2)}
1190
1190
  `),0):(e.stderr.write(`error: HTTP ${i.status}: ${await i.text()}
1191
1191
  `),i.status===400?2:1)}async function mI(t,e){let r=!1,n=!1,s=[];for(let f=0;f<t.length;f+=1){let m=t[f];if(m==="--json"){r=!0;continue}if(m==="--done"){n=!0;continue}s.push(m)}if(s.length!==2)return e.stderr.write(`usage: lmctl api escalations respond <attention_id> "<answer>" [--done] [--json]
1192
1192
  `),2;let o=ne(s[0],"attention_id");if(typeof o=="string")return e.stderr.write(`error: ${o}
1193
- `),2;let i=s[1],a=hr(e),l=Ht("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=_r(e),l=Ht("application/json",a.token);l["Content-Type"]="application/json";let c={input:i};n&&(c.done=!0);let u;try{u=await fetch(new URL(`/api/escalations/${o}/respond`,a.baseUrl),{method:"POST",headers:l,body:JSON.stringify(c)})}catch(f){return e.stderr.write(`error: network failure: ${f instanceof Error?f.message:String(f)}
1194
1194
  `),1}if(u.status===404)return e.stderr.write(`error: escalation not found: ${o}
1195
1195
  `),1;if(!u.ok){let f=await u.text();return e.stderr.write(`error: HTTP ${u.status}: ${f}
1196
1196
  `),u.status===400?2:1}let d=await u.json();return r?e.stdout.write(`${JSON.stringify(d,null,2)}
1197
1197
  `):e.stdout.write(`ok: attention ${o} acknowledged; step ${d.step_id} resumed (session_status=${String(d.session_status)})
1198
- `),0}function sp(t,e,r){return t!=="api.token"||r?e:e.length<=8?"***":`${e.slice(0,8)}\u2026(masked; use --show-secrets to reveal)`}function pI(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===co||t===uo){let r=Number(e);if(!Number.isInteger(r)||r<=0)return`invalid ${t}: ${e}`}return null}function hI(t,e){let r=K0(t),n=r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength),s=new FormData;return s.append("image",new Blob([n],{type:_I(t)}),Y0(t)),e!==void 0&&s.append("project",e),s}function _I(t){switch(z0(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 gI(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 wI(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api pr <id|list|get>";if(r==="list")return An(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 dp(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 So(t,e,r){return t.length>0?re(t[0]):{method:"GET",path:e,accept:r?"application/json":"text/html",json:r}}function An(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 op(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 yI(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 EI(t,e){let[r,...n]=t;if(r!==void 0&&n.length===0&&r!=="enqueue"&&r!=="run")return yI([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=Ol(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 bI(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"?fp(n,e):r==="claim"?mp(n,e):r==="claim-next"?pp(n,e):r==="close"?hp(n,e):r==="reopen"?_p(n,e):"usage: lmctl api issues <list|show|create|claim|claim-next|close|reopen>"}function fp(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=Ol(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 mp(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 pp(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 hp(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 _p(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 TI(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 SI(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 Ol(t){try{return JSON.parse(t)}catch{return t}}function kI(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 vI(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 II(t,e){let[r,n,...s]=t;return r==="workflow"?$I([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 $I(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=NI(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 NI(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=Ol(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 xI(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 jI(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 AI(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 RI(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 OI(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 LI(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=ao(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 CI(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 gp(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 MI(t,e){let r=dp(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1198
+ `),0}function sp(t,e,r){return t!=="api.token"||r?e:e.length<=8?"***":`${e.slice(0,8)}\u2026(masked; use --show-secrets to reveal)`}function pI(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===co||t===uo){let r=Number(e);if(!Number.isInteger(r)||r<=0)return`invalid ${t}: ${e}`}return null}function hI(t,e){let r=K0(t),n=r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength),s=new FormData;return s.append("image",new Blob([n],{type:_I(t)}),Y0(t)),e!==void 0&&s.append("project",e),s}function _I(t){switch(z0(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 gI(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 wI(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api pr <id|list|get>";if(r==="list")return An(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 dp(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 So(t,e,r){return t.length>0?re(t[0]):{method:"GET",path:e,accept:r?"application/json":"text/html",json:r}}function An(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 op(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 yI(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 EI(t,e){let[r,...n]=t;if(r!==void 0&&n.length===0&&r!=="enqueue"&&r!=="run")return yI([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=Ll(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 bI(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"?fp(n,e):r==="claim"?mp(n,e):r==="claim-next"?pp(n,e):r==="close"?hp(n,e):r==="reopen"?_p(n,e):"usage: lmctl api issues <list|show|create|claim|claim-next|close|reopen>"}function fp(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=Ll(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 mp(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 pp(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 hp(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 _p(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 TI(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 SI(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 Ll(t){try{return JSON.parse(t)}catch{return t}}function kI(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 vI(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 II(t,e){let[r,n,...s]=t;return r==="workflow"?$I([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 $I(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=NI(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 NI(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=Ll(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 xI(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 jI(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 AI(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 RI(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 OI(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 LI(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=ao(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 CI(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 gp(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 MI(t,e){let r=dp(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1199
1199
  `),2;let n=r.args,s=r.format!=="text",[o,...i]=n;if(o===void 0)return e.stderr.write(`error: --direct requires a subcommand (issues|status|projects|workflows|runs|attentions)
1200
1200
  `),2;let a=e.dal===void 0,l=e.dal??pe({path:de()});try{if(o==="issues"){let[c,...u]=i;return c===void 0?(e.stderr.write(`error: --direct issues requires a subcommand (list|show|create|claim|claim-next|close|reopen)
1201
1201
  `),2):c==="create"?DI(l,u,e,s):c==="claim"?PI(l,u,e,s):c==="claim-next"?FI(l,u,e,s):c==="close"?UI(l,u,e,s):c==="reopen"?WI(l,u,e,s):c==="list"?JI(l,u,e,s):c==="show"?XI(l,u,e,s):(e.stderr.write(`error: --direct does not support: issues ${c} (supported: list, show, create, claim, claim-next, close, reopen)
@@ -1240,7 +1240,7 @@ ${r}`:r}function pv(t){let e=[...t.matchAll(cv)];if(e.length>0){let r=e[e.length
1240
1240
  `):e.stdout.write(wo(a)),0)}finally{o&&i.close()}}async function ZI(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`error: usage: lmctl api run where <run_id> [--json]
1241
1241
  `),2;if(!/^\d+$/.test(r)||Number(r)<=0)return e.stderr.write(`error: invalid run_id: ${r}
1242
1242
  `),2;let s=!1;for(let c of n){if(c==="--json"){s=!0;continue}if(c!=="--text")return e.stderr.write(`error: ${re(c)}
1243
- `),2}let o=hr(e),a=Ht(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=_r(e),a=Ht(s?"application/json":"text/plain",o.token),l;try{l=await fetch(new URL(`/api/runs/${r}/where`,o.baseUrl),{method:"GET",headers:a})}catch(c){return e.stderr.write(`error: network failure: ${c instanceof Error?c.message:String(c)}
1244
1244
  `),2}return l.ok?(s?e.stdout.write(`${JSON.stringify(await l.json(),null,2)}
1245
1245
  `):(e.stdout.write(await l.text()),l.headers.get("content-type")?.includes("text/plain")||e.stdout.write(`
1246
1246
  `)),0):(e.stderr.write(`error: HTTP ${l.status}: ${await l.text()}
@@ -1252,12 +1252,12 @@ ${r}`:r}function pv(t){let e=[...t.matchAll(cv)];if(e.length>0){let r=e[e.length
1252
1252
  `):e.stdout.write(Eo(a)),0)}finally{o&&i.close()}}async function e$(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`error: usage: lmctl api run timeline <run_id> [--json]
1253
1253
  `),2;if(!/^\d+$/.test(r)||Number(r)<=0)return e.stderr.write(`error: invalid run_id: ${r}
1254
1254
  `),2;let s=!1;for(let c of n){if(c==="--json"){s=!0;continue}if(c!=="--text")return e.stderr.write(`error: ${re(c)}
1255
- `),2}let o=hr(e),a=Ht(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=_r(e),a=Ht(s?"application/json":"text/plain",o.token),l;try{l=await fetch(new URL(`/api/runs/${r}/timeline`,o.baseUrl),{method:"GET",headers:a})}catch(c){return e.stderr.write(`error: network failure: ${c instanceof Error?c.message:String(c)}
1256
1256
  `),2}return l.ok?(s?e.stdout.write(`${JSON.stringify(await l.json(),null,2)}
1257
1257
  `):(e.stdout.write(await l.text()),l.headers.get("content-type")?.includes("text/plain")||e.stdout.write(`
1258
1258
  `)),0):(e.stderr.write(`error: HTTP ${l.status}: ${await l.text()}
1259
1259
  `),l.status===404?1:l.status===400?2:1)}async function t$(t,e){let r=!1;for(let a of t){if(a==="--json"){r=!0;continue}if(a!=="--text")return e.stderr.write(`error: ${re(a)}
1260
- `),2}let n=hr(e),o=Ht(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=_r(e),o=Ht(r?"application/json":"text/plain",n.token),i;try{i=await fetch(new URL("/api/workflows/verify",n.baseUrl),{method:"GET",headers:o})}catch(a){return e.stderr.write(`error: network failure: ${a instanceof Error?a.message:String(a)}
1261
1261
  `),2}return i.ok?(r?e.stdout.write(`${JSON.stringify(await i.json(),null,2)}
1262
1262
  `):(e.stdout.write(await i.text()),i.headers.get("content-type")?.includes("text/plain")||e.stdout.write(`
1263
1263
  `)),0):(e.stderr.write(`error: HTTP ${i.status}: ${await i.text()}
@@ -1282,7 +1282,7 @@ ${r}`:r}function pv(t){let e=[...t.matchAll(cv)];if(e.length>0){let r=e[e.length
1282
1282
  `),2;let u=t.resumeInteractive(l.step_id,a,s);if(!u.resumed)return r.stderr.write(`error: interactive respond failed: ${u.reason} (step_id=${l.step_id})
1283
1283
  `),2;let d=t.acknowledgeAttention(i),f={ok:!0,attention_id:i,step_id:l.step_id,session_status:u.session.status,acknowledged_at:d?.acknowledged_at??null};return n?r.stdout.write(`${JSON.stringify(f,null,2)}
1284
1284
  `):r.stdout.write(`ok: attention ${i} acknowledged; step ${l.step_id} resumed (session_status=${f.session_status})
1285
- `),0}function ip(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 Z0,Q0,ap,To,sI,oI,iI,aI,HI,Ll=E(()=>{"use strict";Me();He();lo();$l();vt();Z0="http://127.0.0.1:8787",Q0=`usage: lmctl api [--direct] <subcommand> ...
1285
+ `),0}function ip(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 Z0,Q0,ap,To,sI,oI,iI,aI,HI,Cl=E(()=>{"use strict";Me();He();lo();Nl();vt();Z0="http://127.0.0.1:8787",Q0=`usage: lmctl api [--direct] <subcommand> ...
1286
1286
 
1287
1287
  Call the lmctl HTTP API using the configured daemon URL/token. Some
1288
1288
  workflow shellstep-safe commands also support --direct to use the local DAL
@@ -1312,7 +1312,7 @@ without an HTTP round trip.
1312
1312
 
1313
1313
  Verify every workflows/*.compound.json file: load/validate the workflow graph
1314
1314
  and report the first step that would be started. Default output is the TTY
1315
- table; --json emits the structured WorkflowVerifyReport payload.`;HI=["open","assigned","closed","reopened"]});import{existsSync as Ep,mkdirSync as s$,readdirSync as o$,readFileSync as bp,writeFileSync as i$}from"node:fs";import{join as Wr}from"node:path";import{fileURLToPath as a$}from"node:url";function On(t){try{return l$.some(e=>Ep(Wr(t,e)))}catch{return!1}}function c$(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 vo(t,e){t.durable_memory_mode!=="db"?u$(t):d$(t,e)}function Tp(t){let e=On(t),r;try{r=o$(Cl).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 u$(t){let e=t.local_path;if(!e){console.warn("[bootstrap] skipping: project has no local_path");return}let r=Wr(e,"durable-memory");try{s$(r,{recursive:!0})}catch(o){console.error("[bootstrap] failed to create durable-memory directory:",o);return}let n=Tp(e),s=[];for(let o of n){let i=o.replace(/\.template$/,""),a=Wr(r,i);if(!Ep(a))try{let l=bp(Wr(Cl,o),"utf8");i$(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 d$(t,e){let r=t.local_path??"",n=Tp(r),s=[];for(let o of n){let i=Wr(Cl,o),a;try{a=bp(i,"utf8")}catch(c){console.error(`[bootstrap] failed to read ${o}:`,c);continue}let l=c$(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 Cl,l$,Ln=E(()=>{"use strict";Cl=Wr(a$(import.meta.url),"../../config/durable_memory_templates"),l$=[".git","package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","composer.json","Pipfile"]});import{existsSync as f$,mkdirSync as m$,readdirSync as p$,readFileSync as h$,writeFileSync as _$}from"node:fs";import{join as Io}from"node:path";import{fileURLToPath as g$}from"node:url";function $o(t){let e=t.local_path;if(!e){console.warn("[bootstrap] skipping ai-test: project has no local_path");return}if(!On(e))return;let r=Io(e,"ai-test");try{m$(r,{recursive:!0})}catch(s){console.error("[bootstrap] failed to create ai-test directory:",s);return}let n=[];for(let s of w$()){let o=s.replace(/\.template$/,""),i=Io(r,o);if(!f$(i))try{_$(i,y$(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 w$(){try{return p$(Sp).filter(t=>t.endsWith(".template")).sort()}catch{return["example-test.md.template","index.md.template"]}}function y$(t){try{return h$(Io(Sp,t),"utf8")}catch{return E$(t)}}function E$(t){let e=t.replace(/\.template$/,"");return e==="index.md"?`# AI Test Suite - index
1315
+ table; --json emits the structured WorkflowVerifyReport payload.`;HI=["open","assigned","closed","reopened"]});import{existsSync as Ep,mkdirSync as s$,readdirSync as o$,readFileSync as bp,writeFileSync as i$}from"node:fs";import{join as Wr}from"node:path";import{fileURLToPath as a$}from"node:url";function On(t){try{return l$.some(e=>Ep(Wr(t,e)))}catch{return!1}}function c$(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 vo(t,e){t.durable_memory_mode!=="db"?u$(t):d$(t,e)}function Tp(t){let e=On(t),r;try{r=o$(Ml).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 u$(t){let e=t.local_path;if(!e){console.warn("[bootstrap] skipping: project has no local_path");return}let r=Wr(e,"durable-memory");try{s$(r,{recursive:!0})}catch(o){console.error("[bootstrap] failed to create durable-memory directory:",o);return}let n=Tp(e),s=[];for(let o of n){let i=o.replace(/\.template$/,""),a=Wr(r,i);if(!Ep(a))try{let l=bp(Wr(Ml,o),"utf8");i$(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 d$(t,e){let r=t.local_path??"",n=Tp(r),s=[];for(let o of n){let i=Wr(Ml,o),a;try{a=bp(i,"utf8")}catch(c){console.error(`[bootstrap] failed to read ${o}:`,c);continue}let l=c$(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 Ml,l$,Ln=E(()=>{"use strict";Ml=Wr(a$(import.meta.url),"../../config/durable_memory_templates"),l$=[".git","package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","composer.json","Pipfile"]});import{existsSync as f$,mkdirSync as m$,readdirSync as p$,readFileSync as h$,writeFileSync as _$}from"node:fs";import{join as Io}from"node:path";import{fileURLToPath as g$}from"node:url";function $o(t){let e=t.local_path;if(!e){console.warn("[bootstrap] skipping ai-test: project has no local_path");return}if(!On(e))return;let r=Io(e,"ai-test");try{m$(r,{recursive:!0})}catch(s){console.error("[bootstrap] failed to create ai-test directory:",s);return}let n=[];for(let s of w$()){let o=s.replace(/\.template$/,""),i=Io(r,o);if(!f$(i))try{_$(i,y$(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 w$(){try{return p$(Sp).filter(t=>t.endsWith(".template")).sort()}catch{return["example-test.md.template","index.md.template"]}}function y$(t){try{return h$(Io(Sp,t),"utf8")}catch{return E$(t)}}function E$(t){let e=t.replace(/\.template$/,"");return e==="index.md"?`# AI Test Suite - index
1316
1316
 
1317
1317
  Add test chapters in this directory.
1318
1318
  `:`---
@@ -1334,7 +1334,7 @@ last_run_id: 0
1334
1334
  ## Expected
1335
1335
 
1336
1336
  ## Cleanup
1337
- `}var Sp,Ml=E(()=>{"use strict";Ln();Sp=Io(g$(import.meta.url),"../../config/ai_test_templates")});var Br,Dl=E(()=>{"use strict";Br=`---
1337
+ `}var Sp,Dl=E(()=>{"use strict";Ln();Sp=Io(g$(import.meta.url),"../../config/ai_test_templates")});var Br,Pl=E(()=>{"use strict";Br=`---
1338
1338
 
1339
1339
  # Durable memory \u2014 how to use it
1340
1340
 
@@ -1345,13 +1345,13 @@ ON EVERY NEW TASK:
1345
1345
  2. Pull only the chapters relevant to your current task. Don't load everything.
1346
1346
  3. If you learn something durable (a project convention, a decision, a fact worth preserving), write it back: create/update \`<project>/durable-memory/<descriptive-name>.md\` with YAML frontmatter (name/description/type) + body. The engine syncs the write automatically.
1347
1347
 
1348
- Don't dump all of durable-memory into your context. The pattern is index-first, chapter-on-demand.`});function No(t){return b$.has(t)}function Fl(){return Pl===null&&(Pl=at(ct())),Pl}function Ul(t,e){if(!No(t))return null;try{let r=Fl().getAdapter?.(t);if(r===void 0)return null;let n=r.resumeCommand(e).trim();return n.length===0?null:[...n.split(/\s+/),...kp[t]??[]]}catch{return null}}function qr(t,e){let r=Ul(t,e);return r===null?null:r.join(" ")}function _r(t,e){return Fl().getSession(t,e)}async function xo(t){return(await Fl().resolveSessions(t)).map(r=>r.provider.name)}var kp,b$,vp,Pl,Hr=E(()=>{"use strict";kt();kp={claude:["--dangerously-skip-permissions"],codex:["--dangerously-bypass-approvals-and-sandbox"],gemini:["-y"],copilot:["--yolo"],opencode:[],qwen:["--approval-mode","yolo"],agy:[]},b$=new Set(Object.keys(kp)),vp=/^[\w.:-]+$/;Pl=null});import{createHash as T$}from"node:crypto";import{existsSync as Ao,mkdirSync as $p,readFileSync as Wl,readdirSync as S$,renameSync as k$,statSync as v$,writeFileSync as jo}from"node:fs";import{homedir as I$}from"node:os";import{dirname as Np,join as Ge,resolve as Ro}from"node:path";import{fileURLToPath as $$}from"node:url";function jp(t){let e=Ro(t);for(;;){let r=Ge(e,Bl);try{if(v$(r).isDirectory())return r}catch{}let n=Np(e);if(n===e)return null;e=n}}function Oo(t=process.cwd()){let e=process.env.LMCTL_HOME;if(e!==void 0&&e.trim().length>0)return Ro(e);let r=jp(t);return r!==null?r:Ge(xp(),Bl)}function Ap(t){return Ge(Oo(t),"templates","workflows")}function Rp(){return Ro(Np($$(import.meta.url)),"..","..","workflows")}function N$(t){let e=Ge(t,Op);try{let r=JSON.parse(Wl(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 x$(t,e){$p(t,{recursive:!0});let r=Ge(t,Op),n=`${r}.tmp-${process.pid}`;jo(n,`${JSON.stringify(e,null,2)}
1349
- `,"utf8"),k$(n,r)}function Lo(t={}){let e=Oo(t.cwd),r=Ge(e,"templates","workflows"),n=Rp(),s={basedir:e,copied:[],refreshed:[],preserved:[],shadowed:[]};try{let o=Ao(n)?S$(n).filter(l=>l.endsWith(".compound.json")||l.endsWith(".lmctl")||l==="index.jsonl"):[];if(o.length===0)return s;$p(r,{recursive:!0});let i=N$(e),a=ir();for(let l of o){let c=`workflows/${l}`,u=Wl(Ge(n,l)),d=Ip(u),f=Ge(r,l);if(!Ao(f)){try{jo(f,u,{flag:"wx"}),s.copied.push(l)}catch{}i.files[c]=d;continue}let m=Ip(Wl(f));if(m===d){i.files[c]=d;continue}let p=i.files[c];if(p!==void 0&&m===p)jo(f,u),i.files[c]=d,s.refreshed.push(l);else{let h=Ge(r,`${l}.dist-${a}`);jo(h,u),s.preserved.push(l),s.shadowed.push(`${l}.dist-${a}`)}}x$(e,{version:a,files:i.files})}catch(o){if(t.swallow!==!0)throw o}return s}function ql(t){let e=[],r=process.env.LMCTL_HOME;r!==void 0&&r.trim().length>0&&e.push(Ro(r));let n=jp(t??process.cwd());return n!==null&&e.push(n),e.push(Ge(xp(),Bl)),e}function Co(t,e){let r=ql(e),n=[`${t}.compound.json`,`${t}.lmctl`];for(let s of r)for(let o of n){let i=Ge(s,"templates","workflows",o);if(Ao(i))return i}for(let s of n){let o=Ge(Rp(),s);if(Ao(o))return o}return null}var Bl,xp,Ip,Op,Mo=E(()=>{"use strict";As();Bl=".lmctl",xp=()=>process.env.HOME??I$(),Ip=t=>T$("sha256").update(t).digest("hex");Op=".dist-manifest.json"});import{createHash as j$}from"node:crypto";import{existsSync as A$,mkdirSync as R$,writeFileSync as O$}from"node:fs";import{dirname as L$,join as Jr}from"node:path";function gr(t){return typeof t=="string"&&t.startsWith(Lp)}function U$(t){if(!gr(t))throw new tt(`not an lmctl:// URI: ${t}`,"malformed");let e=t.slice(Lp.length),r=e.indexOf("/");if(r<=0)throw new tt(`malformed lmctl:// URI (expected lmctl://<workflow|mcp|skill>/<name>): ${t}`,"malformed");let n=e.slice(0,r);if(!P$.has(n))throw new tt(`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 tt(`empty name in lmctl:// URI: ${t}`,"malformed");if(/[\\/]|\.\./.test(a))throw new tt(`invalid name in lmctl:// URI (no path separators): ${t}`,"malformed");return{kind:n,name:a,...o!==void 0&&o.length>0?{ref:o}:{}}}function W$(t,e,r){if(t==="workflow")return Co(e,r);let n=t==="mcp"?Jr("templates","mcp",`${e}.json`):Jr("templates","skills",e,"SKILL.md");for(let s of ql(r)){let o=Jr(s,n);if(A$(o))return o}return null}function B$(t,e,r){let n=Jr(Oo(r),M$,t);return t==="skill"?Jr(n,e,"SKILL.md"):Jr(n,`${e}${t==="workflow"?".compound.json":".json"}`)}function q$(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 Cn(t,e){let{kind:r,name:n,ref:s}=U$(t),o=W$(r,n,e);if(o!==null)return o;let i=`${C$}${r}/${n}`,a;try{a=await fetch(i,{signal:AbortSignal.timeout(D$)})}catch(u){throw new tt(`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 tt(`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=F$.exec(s);if(u!==null){let d=j$("sha256").update(l).digest("hex");if(d.toLowerCase()!==u[1].toLowerCase())throw new tt(`lmctl:// '${t}' remote artifact FAILED integrity pin (expected sha256 ${u[1]}, got ${d}) \u2014 discarded, NOT cached.`,"validation-failure")}}if(!q$(r,l))throw new tt(`lmctl:// '${t}' remote artifact failed shape validation for ${r} \u2014 discarded, NOT cached.`,"validation-failure");let c=B$(r,n,e);return R$(L$(c),{recursive:!0}),O$(c,l,"utf8"),c}var Lp,C$,M$,D$,P$,tt,F$,Hl=E(()=>{"use strict";Mo();Lp="lmctl://",C$="https://lmctl.com/templates/",M$=".cache",D$=8e3,P$=new Set(["workflow","mcp","skill"]),tt=class extends Error{reason;constructor(e,r="malformed"){super(e),this.reason=r,this.name="LmctlUriError"}},F$=/^(?:sha256[:-])?([0-9a-f]{64})$/i});import{spawnSync as Up}from"node:child_process";import{cpSync as Cp,existsSync as Gl,mkdirSync as Wp,mkdtempSync as H$,readFileSync as Bp,statSync as J$,writeFileSync as Jl}from"node:fs";import{homedir as X$,tmpdir as G$}from"node:os";import{basename as Mp,join as Ve}from"node:path";function It(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Xl(t,e,r){if(Array.isArray(t)){for(let n of t)Xl(n,e,r);return}if(It(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))Xl(n,e,r)}}function z$(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(!(!It(a)||!Array.isArray(a.steps)))for(let l of a.steps)It(l)&&l.members!==void 0&&Xl(l.members,e.alias,r)}let s=o=>{let i=new Map;for(let a of o)i.set(Y$(a),a);return[...i.values()]};return{mcp:s(r.mcp),skills:s(r.skills)}}async function qp(t,e){let r;try{r=await fetch(t,{signal:AbortSignal.timeout(V$)})}catch(s){throw new rt(e,`fetch ${t} failed: ${s.message}`)}if(!r.ok)throw new rt(e,`fetch ${t} \u2192 HTTP ${r.status}`);let n=await r.text();if(n.length>Dp)throw new rt(e,`fetched ${t} exceeds ${Dp} bytes`);return n}async function Z$(t,e){if(typeof t!="string")return[t];gr(t)&&(t=await Cn(t));let r;if(Vl.test(t))r=await qp(t,e);else{if(!Gl(t))throw new rt(e,`mcp file not found: ${t}`);r=Bp(t,"utf8")}let n;try{n=JSON.parse(r)}catch{throw new rt(e,`mcp source is not JSON: ${t}`)}if(It(n)&&It(n.mcpServers))return Object.entries(n.mcpServers).map(([s,o])=>({name:s,...It(o)?o:{}}));if(It(n)&&typeof n.name=="string")return[n];throw new rt(e,`mcp source ${t} is neither {mcpServers:{\u2026}} nor a {name,\u2026} server`)}function Do(t){return t.type==="http"||t.type==="sse"||t.url!==void 0&&t.command===void 0}function Mn(t,e,r,n){let s=Up(t,e,{cwd:r,encoding:"utf8",timeout:6e4});if(s.error)throw new rt(n,`spawn ${t} failed: ${s.error.message}`);if(s.status!==0)throw new rt(n,`${t} ${e.slice(0,3).join(" ")} exited ${s.status}: ${(s.stderr??"").trim().slice(0,200)}`)}function Q$(t,e,r){Up(t,e,{cwd:r,encoding:"utf8",timeout:6e4})}function eN(t,e){return t==="claude"?["mcp","remove",e,"--scope","user"]:["mcp","remove",e]}function tN(t){let e=["mcp","add"];if(Do(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 rN(t){if(Do(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 nN(t){if(Do(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 sN(t){let e=Ve(process.env.XDG_CONFIG_HOME??Ve(Dn(),".config"),"opencode"),r=Ve(e,"opencode.json"),n={};if(Gl(r))try{let o=JSON.parse(Bp(r,"utf8"));It(o)&&(n=o)}catch{}let s=It(n.mcp)?{...n.mcp}:{};for(let o of t){let{name:i,...a}=o;s[i]=Do(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"),Wp(e,{recursive:!0}),Jl(r,`${JSON.stringify(n,null,2)}
1350
- `,"utf8")}function oN(t){if(typeof t!="string")return t.name;let e=Mp(t.replace(/\/+$/,""));return e.toLowerCase()==="skill.md"?Mp(t.replace(/\/skill\.md$/i,"")):e}async function Pp(t,e,r){let n=oN(t),s=Ve(e,n);if(Wp(s,{recursive:!0}),typeof t!="string")return Jl(Ve(s,"SKILL.md"),t.content,"utf8"),{name:n,dir:s};if(gr(t)&&(t=await Cn(t)),Vl.test(t))return Jl(Ve(s,"SKILL.md"),await qp(t,r),"utf8"),{name:n,dir:s};if(!Gl(t))throw new rt(r,`skill path not found: ${t}`);return J$(t).isDirectory()?(Cp(t,s,{recursive:!0}),{name:n,dir:s}):(Cp(t,Ve(s,"SKILL.md")),{name:n,dir:s})}async function Po(t){let{dal:e,member:r,stderr:n}=t,s=z$(e,r);if(s.mcp.length===0&&s.skills.length===0)return;let o=ke(r),i=r.sessiondir||process.cwd(),a=l=>{n.write(`[seed:${r.alias}] ${l}
1351
- `)};if(s.mcp.length>0){let l=[];for(let c of s.mcp)l.push(...await Z$(c,r.alias));if(o==="opencode")sN(l);else if(o==="claude"||o==="gemini"||o==="qwen"||o==="agy"||o==="codex"||o==="copilot")for(let c of l)if(Q$(o,eN(o,c.name),i),o==="claude"){let{name:u,...d}=c;Mn("claude",["mcp","add-json",u,JSON.stringify(d),"--scope","user"],i,r.alias)}else o==="codex"?Mn("codex",rN(c),i,r.alias):o==="copilot"?Mn("copilot",nN(c),i,r.alias):Mn(o,tN(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(K$.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=H$(Ve(G$(),`lmctl-skill-${r.alias}-`));for(let c of s.skills){let u=typeof c=="string"&&!Vl.test(c)?c:(await Pp(c,l,r.alias)).dir;Mn(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(Fp[o]!==void 0){let l=Fp[o]();for(let c of s.skills)await Pp(c,l,r.alias);a(`installed ${s.skills.length} skill(s) \u2192 ${l}/<name>/SKILL.md (idempotent overwrite).`)}else a(`provider ${o} has no verified skills mechanism \u2014 ${s.skills.length} declared skill(s) NOT installed.`)}var rt,Vl,V$,Dp,K$,Y$,Dn,Fp,Kl=E(()=>{"use strict";Me();Hl();rt=class extends Error{alias;constructor(e,r){super(`capability install failed for ${e}: ${r}`),this.alias=e,this.name="CapabilityInstallError"}},Vl=/^https?:\/\//i,V$=8e3,Dp=1e6,K$=new Set(["opencode"]),Y$=t=>JSON.stringify(t),Dn=()=>process.env.HOME??X$();Fp={claude:()=>Ve(Dn(),".claude","skills"),qwen:()=>Ve(Dn(),".qwen","skills"),codex:()=>Ve(Dn(),".codex","skills"),copilot:()=>Ve(Dn(),".copilot","skills")}});async function J(t,e){if(t.dal!==void 0)return e(t.dal);let r=pe({path:de()});try{return await e(r)}finally{r.close()}}function P(t,e,r=["--json"]){let n=new Set(e),s=new Set(r),o=[],i={};for(let a=0;a<t.length;a+=1){let l=t[a];if(!l.startsWith("--")){o.push(l);continue}if(s.has(l)){i[l]=!0;continue}if(!n.has(l))return{positionals:o,flags:i,error:`unknown flag: ${l}`};let c=t[a+1];if(c===void 0||c.startsWith("--"))return{positionals:o,flags:i,error:`missing value for ${l}`};i[l]=c,a+=1}return{positionals:o,flags:i}}function j(t,e){let r=t.flags[e];return typeof r=="string"?r:void 0}function M(t,e){return t.flags[e]===!0}function W(t,e){t.stdout.write(`${JSON.stringify(e,null,2)}
1348
+ Don't dump all of durable-memory into your context. The pattern is index-first, chapter-on-demand.`});function No(t){return b$.has(t)}function Ul(){return Fl===null&&(Fl=at(ct())),Fl}function Wl(t,e){if(!No(t))return null;try{let r=Ul().getAdapter?.(t);if(r===void 0)return null;let n=r.resumeCommand(e).trim();return n.length===0?null:[...n.split(/\s+/),...kp[t]??[]]}catch{return null}}function qr(t,e){let r=Wl(t,e);return r===null?null:r.join(" ")}function gr(t,e){return Ul().getSession(t,e)}async function xo(t){return(await Ul().resolveSessions(t)).map(r=>r.provider.name)}var kp,b$,vp,Fl,Hr=E(()=>{"use strict";kt();kp={claude:["--dangerously-skip-permissions"],codex:["--dangerously-bypass-approvals-and-sandbox"],gemini:["-y"],copilot:["--yolo"],opencode:[],qwen:["--approval-mode","yolo"],agy:[]},b$=new Set(Object.keys(kp)),vp=/^[\w.:-]+$/;Fl=null});import{createHash as T$}from"node:crypto";import{existsSync as Ao,mkdirSync as $p,readFileSync as Bl,readdirSync as S$,renameSync as k$,statSync as v$,writeFileSync as jo}from"node:fs";import{homedir as I$}from"node:os";import{dirname as Np,join as Ge,resolve as Ro}from"node:path";import{fileURLToPath as $$}from"node:url";function jp(t){let e=Ro(t);for(;;){let r=Ge(e,ql);try{if(v$(r).isDirectory())return r}catch{}let n=Np(e);if(n===e)return null;e=n}}function Oo(t=process.cwd()){let e=process.env.LMCTL_HOME;if(e!==void 0&&e.trim().length>0)return Ro(e);let r=jp(t);return r!==null?r:Ge(xp(),ql)}function Ap(t){return Ge(Oo(t),"templates","workflows")}function Rp(){return Ro(Np($$(import.meta.url)),"..","..","workflows")}function N$(t){let e=Ge(t,Op);try{let r=JSON.parse(Bl(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 x$(t,e){$p(t,{recursive:!0});let r=Ge(t,Op),n=`${r}.tmp-${process.pid}`;jo(n,`${JSON.stringify(e,null,2)}
1349
+ `,"utf8"),k$(n,r)}function Lo(t={}){let e=Oo(t.cwd),r=Ge(e,"templates","workflows"),n=Rp(),s={basedir:e,copied:[],refreshed:[],preserved:[],shadowed:[]};try{let o=Ao(n)?S$(n).filter(l=>l.endsWith(".compound.json")||l.endsWith(".lmctl")||l==="index.jsonl"):[];if(o.length===0)return s;$p(r,{recursive:!0});let i=N$(e),a=ar();for(let l of o){let c=`workflows/${l}`,u=Bl(Ge(n,l)),d=Ip(u),f=Ge(r,l);if(!Ao(f)){try{jo(f,u,{flag:"wx"}),s.copied.push(l)}catch{}i.files[c]=d;continue}let m=Ip(Bl(f));if(m===d){i.files[c]=d;continue}let p=i.files[c];if(p!==void 0&&m===p)jo(f,u),i.files[c]=d,s.refreshed.push(l);else{let h=Ge(r,`${l}.dist-${a}`);jo(h,u),s.preserved.push(l),s.shadowed.push(`${l}.dist-${a}`)}}x$(e,{version:a,files:i.files})}catch(o){if(t.swallow!==!0)throw o}return s}function Hl(t){let e=[],r=process.env.LMCTL_HOME;r!==void 0&&r.trim().length>0&&e.push(Ro(r));let n=jp(t??process.cwd());return n!==null&&e.push(n),e.push(Ge(xp(),ql)),e}function Co(t,e){let r=Hl(e),n=[`${t}.compound.json`,`${t}.lmctl`];for(let s of r)for(let o of n){let i=Ge(s,"templates","workflows",o);if(Ao(i))return i}for(let s of n){let o=Ge(Rp(),s);if(Ao(o))return o}return null}var ql,xp,Ip,Op,Mo=E(()=>{"use strict";As();ql=".lmctl",xp=()=>process.env.HOME??I$(),Ip=t=>T$("sha256").update(t).digest("hex");Op=".dist-manifest.json"});import{createHash as j$}from"node:crypto";import{existsSync as A$,mkdirSync as R$,writeFileSync as O$}from"node:fs";import{dirname as L$,join as Jr}from"node:path";function Jt(t){return typeof t=="string"&&t.startsWith(Lp)}function U$(t){if(!Jt(t))throw new tt(`not an lmctl:// URI: ${t}`,"malformed");let e=t.slice(Lp.length),r=e.indexOf("/");if(r<=0)throw new tt(`malformed lmctl:// URI (expected lmctl://<workflow|mcp|skill>/<name>): ${t}`,"malformed");let n=e.slice(0,r);if(!P$.has(n))throw new tt(`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 tt(`empty name in lmctl:// URI: ${t}`,"malformed");if(/[\\/]|\.\./.test(a))throw new tt(`invalid name in lmctl:// URI (no path separators): ${t}`,"malformed");return{kind:n,name:a,...o!==void 0&&o.length>0?{ref:o}:{}}}function W$(t,e,r){if(t==="workflow")return Co(e,r);let n=t==="mcp"?Jr("templates","mcp",`${e}.json`):Jr("templates","skills",e,"SKILL.md");for(let s of Hl(r)){let o=Jr(s,n);if(A$(o))return o}return null}function B$(t,e,r){let n=Jr(Oo(r),M$,t);return t==="skill"?Jr(n,e,"SKILL.md"):Jr(n,`${e}${t==="workflow"?".compound.json":".json"}`)}function q$(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 Cn(t,e){let{kind:r,name:n,ref:s}=U$(t),o=W$(r,n,e);if(o!==null)return o;let i=`${C$}${r}/${n}`,a;try{a=await fetch(i,{signal:AbortSignal.timeout(D$)})}catch(u){throw new tt(`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 tt(`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=F$.exec(s);if(u!==null){let d=j$("sha256").update(l).digest("hex");if(d.toLowerCase()!==u[1].toLowerCase())throw new tt(`lmctl:// '${t}' remote artifact FAILED integrity pin (expected sha256 ${u[1]}, got ${d}) \u2014 discarded, NOT cached.`,"validation-failure")}}if(!q$(r,l))throw new tt(`lmctl:// '${t}' remote artifact failed shape validation for ${r} \u2014 discarded, NOT cached.`,"validation-failure");let c=B$(r,n,e);return R$(L$(c),{recursive:!0}),O$(c,l,"utf8"),c}var Lp,C$,M$,D$,P$,tt,F$,Jl=E(()=>{"use strict";Mo();Lp="lmctl://",C$="https://lmctl.com/templates/",M$=".cache",D$=8e3,P$=new Set(["workflow","mcp","skill"]),tt=class extends Error{reason;constructor(e,r="malformed"){super(e),this.reason=r,this.name="LmctlUriError"}},F$=/^(?:sha256[:-])?([0-9a-f]{64})$/i});import{spawnSync as Up}from"node:child_process";import{cpSync as Cp,existsSync as Vl,mkdirSync as Wp,mkdtempSync as H$,readFileSync as Bp,statSync as J$,writeFileSync as Xl}from"node:fs";import{homedir as X$,tmpdir as G$}from"node:os";import{basename as Mp,join as Ve}from"node:path";function It(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Gl(t,e,r){if(Array.isArray(t)){for(let n of t)Gl(n,e,r);return}if(It(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))Gl(n,e,r)}}function z$(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(!(!It(a)||!Array.isArray(a.steps)))for(let l of a.steps)It(l)&&l.members!==void 0&&Gl(l.members,e.alias,r)}let s=o=>{let i=new Map;for(let a of o)i.set(Y$(a),a);return[...i.values()]};return{mcp:s(r.mcp),skills:s(r.skills)}}async function qp(t,e){let r;try{r=await fetch(t,{signal:AbortSignal.timeout(V$)})}catch(s){throw new rt(e,`fetch ${t} failed: ${s.message}`)}if(!r.ok)throw new rt(e,`fetch ${t} \u2192 HTTP ${r.status}`);let n=await r.text();if(n.length>Dp)throw new rt(e,`fetched ${t} exceeds ${Dp} bytes`);return n}async function Z$(t,e){if(typeof t!="string")return[t];Jt(t)&&(t=await Cn(t));let r;if(Kl.test(t))r=await qp(t,e);else{if(!Vl(t))throw new rt(e,`mcp file not found: ${t}`);r=Bp(t,"utf8")}let n;try{n=JSON.parse(r)}catch{throw new rt(e,`mcp source is not JSON: ${t}`)}if(It(n)&&It(n.mcpServers))return Object.entries(n.mcpServers).map(([s,o])=>({name:s,...It(o)?o:{}}));if(It(n)&&typeof n.name=="string")return[n];throw new rt(e,`mcp source ${t} is neither {mcpServers:{\u2026}} nor a {name,\u2026} server`)}function Do(t){return t.type==="http"||t.type==="sse"||t.url!==void 0&&t.command===void 0}function Mn(t,e,r,n){let s=Up(t,e,{cwd:r,encoding:"utf8",timeout:6e4});if(s.error)throw new rt(n,`spawn ${t} failed: ${s.error.message}`);if(s.status!==0)throw new rt(n,`${t} ${e.slice(0,3).join(" ")} exited ${s.status}: ${(s.stderr??"").trim().slice(0,200)}`)}function Q$(t,e,r){Up(t,e,{cwd:r,encoding:"utf8",timeout:6e4})}function eN(t,e){return t==="claude"?["mcp","remove",e,"--scope","user"]:["mcp","remove",e]}function tN(t){let e=["mcp","add"];if(Do(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 rN(t){if(Do(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 nN(t){if(Do(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 sN(t){let e=Ve(process.env.XDG_CONFIG_HOME??Ve(Dn(),".config"),"opencode"),r=Ve(e,"opencode.json"),n={};if(Vl(r))try{let o=JSON.parse(Bp(r,"utf8"));It(o)&&(n=o)}catch{}let s=It(n.mcp)?{...n.mcp}:{};for(let o of t){let{name:i,...a}=o;s[i]=Do(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"),Wp(e,{recursive:!0}),Xl(r,`${JSON.stringify(n,null,2)}
1350
+ `,"utf8")}function oN(t){if(typeof t!="string")return t.name;let e=Mp(t.replace(/\/+$/,""));return e.toLowerCase()==="skill.md"?Mp(t.replace(/\/skill\.md$/i,"")):e}async function Pp(t,e,r){let n=oN(t),s=Ve(e,n);if(Wp(s,{recursive:!0}),typeof t!="string")return Xl(Ve(s,"SKILL.md"),t.content,"utf8"),{name:n,dir:s};if(Jt(t)&&(t=await Cn(t)),Kl.test(t))return Xl(Ve(s,"SKILL.md"),await qp(t,r),"utf8"),{name:n,dir:s};if(!Vl(t))throw new rt(r,`skill path not found: ${t}`);return J$(t).isDirectory()?(Cp(t,s,{recursive:!0}),{name:n,dir:s}):(Cp(t,Ve(s,"SKILL.md")),{name:n,dir:s})}async function Po(t){let{dal:e,member:r,stderr:n}=t,s=z$(e,r);if(s.mcp.length===0&&s.skills.length===0)return;let o=ke(r),i=r.sessiondir||process.cwd(),a=l=>{n.write(`[seed:${r.alias}] ${l}
1351
+ `)};if(s.mcp.length>0){let l=[];for(let c of s.mcp)l.push(...await Z$(c,r.alias));if(o==="opencode")sN(l);else if(o==="claude"||o==="gemini"||o==="qwen"||o==="agy"||o==="codex"||o==="copilot")for(let c of l)if(Q$(o,eN(o,c.name),i),o==="claude"){let{name:u,...d}=c;Mn("claude",["mcp","add-json",u,JSON.stringify(d),"--scope","user"],i,r.alias)}else o==="codex"?Mn("codex",rN(c),i,r.alias):o==="copilot"?Mn("copilot",nN(c),i,r.alias):Mn(o,tN(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(K$.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=H$(Ve(G$(),`lmctl-skill-${r.alias}-`));for(let c of s.skills){let u=typeof c=="string"&&!Kl.test(c)?c:(await Pp(c,l,r.alias)).dir;Mn(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(Fp[o]!==void 0){let l=Fp[o]();for(let c of s.skills)await Pp(c,l,r.alias);a(`installed ${s.skills.length} skill(s) \u2192 ${l}/<name>/SKILL.md (idempotent overwrite).`)}else a(`provider ${o} has no verified skills mechanism \u2014 ${s.skills.length} declared skill(s) NOT installed.`)}var rt,Kl,V$,Dp,K$,Y$,Dn,Fp,Yl=E(()=>{"use strict";Me();Jl();rt=class extends Error{alias;constructor(e,r){super(`capability install failed for ${e}: ${r}`),this.alias=e,this.name="CapabilityInstallError"}},Kl=/^https?:\/\//i,V$=8e3,Dp=1e6,K$=new Set(["opencode"]),Y$=t=>JSON.stringify(t),Dn=()=>process.env.HOME??X$();Fp={claude:()=>Ve(Dn(),".claude","skills"),qwen:()=>Ve(Dn(),".qwen","skills"),codex:()=>Ve(Dn(),".codex","skills"),copilot:()=>Ve(Dn(),".copilot","skills")}});async function J(t,e){if(t.dal!==void 0)return e(t.dal);let r=pe({path:de()});try{return await e(r)}finally{r.close()}}function P(t,e,r=["--json"]){let n=new Set(e),s=new Set(r),o=[],i={};for(let a=0;a<t.length;a+=1){let l=t[a];if(!l.startsWith("--")){o.push(l);continue}if(s.has(l)){i[l]=!0;continue}if(!n.has(l))return{positionals:o,flags:i,error:`unknown flag: ${l}`};let c=t[a+1];if(c===void 0||c.startsWith("--"))return{positionals:o,flags:i,error:`missing value for ${l}`};i[l]=c,a+=1}return{positionals:o,flags:i}}function j(t,e){let r=t.flags[e];return typeof r=="string"?r:void 0}function M(t,e){return t.flags[e]===!0}function W(t,e){t.stdout.write(`${JSON.stringify(e,null,2)}
1352
1352
  `)}function w(t,e){return t.stderr.write(`error: ${e}
1353
1353
  `),1}function fe(t,e){let r=e instanceof Error?e.message:String(e);return t.stderr.write(`internal error: ${r}
1354
- `),2}var Se=E(()=>{"use strict";Me();He()});var Vp={};ie(Vp,{defaultTeamNameForProject:()=>kN,resolveAlias:()=>Wo,resolveProject:()=>Fo,resolveTeam:()=>Uo,runCode:()=>lN});import{execFileSync as iN}from"node:child_process";import{basename as aN,resolve as Hp}from"node:path";import*as zl from"node:readline";import{setTimeout as Yl}from"node:timers/promises";async function lN(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r===void 0)return cN(e);if(r==="chat"&&(n.includes("--help")||n.includes("-h")))return Xp(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 uN(n,e,s);case"chat":return hN(n,e,s);case"spec":return _N(n,e,s);default:return w(e,"usage: lmctl code <team|chat|spec> ...")}})}catch(s){return fe(e,s)}}function cN(t){return t.stdout.write(["usage: lmctl code <team|chat> ..."," lmctl code spec <task-description> [options]","","Manage the active project code team, chat with a code agent, or start","spec-driven code work.","","subcommands:"," team add <alias> --provider P [--model M] [--role R]"," team list"," team show <alias>"," team rm <alias>"," chat [--alias A]"," spec <task-description> [--slug S] [--template W]",""].join(`
1354
+ `),2}var Se=E(()=>{"use strict";Me();He()});var Vp={};ie(Vp,{defaultTeamNameForProject:()=>kN,resolveAlias:()=>Wo,resolveProject:()=>Fo,resolveTeam:()=>Uo,runCode:()=>lN});import{execFileSync as iN}from"node:child_process";import{basename as aN,resolve as Hp}from"node:path";import*as Zl from"node:readline";import{setTimeout as zl}from"node:timers/promises";async function lN(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r===void 0)return cN(e);if(r==="chat"&&(n.includes("--help")||n.includes("-h")))return Xp(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 uN(n,e,s);case"chat":return hN(n,e,s);case"spec":return _N(n,e,s);default:return w(e,"usage: lmctl code <team|chat|spec> ...")}})}catch(s){return fe(e,s)}}function cN(t){return t.stdout.write(["usage: lmctl code <team|chat> ..."," lmctl code spec <task-description> [options]","","Manage the active project code team, chat with a code agent, or start","spec-driven code work.","","subcommands:"," team add <alias> --provider P [--model M] [--role R]"," team list"," team show <alias>"," team rm <alias>"," chat [--alias A]"," spec <task-description> [--slug S] [--template W]",""].join(`
1355
1355
  `)),0}function uN(t,e,r){let[n,...s]=t;switch(n){case"add":return dN(s,e,r);case"list":return fN(s,e,r);case"show":return mN(s,e,r);case"rm":return pN(s,e,r);default:return w(e,"usage: lmctl code team <add|list|show|rm>")}}function dN(t,e,r){let n=P(t,["--project","--team","--provider","--model","--role","--sessiondir"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: code team add <alias> --provider P [--model M] [--role R]");let o=j(n,"--provider");if(o===void 0)return w(e,"code team add requires --provider");let i=Xr(e,r,j(n,"--project"),j(n,"--team"));if(typeof i=="number")return i;let a=r.insertTeamMember({team_id:i.team.id,alias:s,provider:o,model:j(n,"--model")??null,role:j(n,"--role")??"agent",sessiondir:j(n,"--sessiondir")??i.project.local_path});return M(n,"--json")?W(e,a):e.stdout.write(`added member ${a.alias} to ${i.team.name}
1356
1356
  `),0}function fN(t,e,r){let n=P(t,["--project","--team"]);if(n.error!==void 0)return w(e,n.error);let s=Xr(e,r,j(n,"--project"),j(n,"--team"));if(typeof s=="number")return s;let o=Gp(r.listTeamMembers(s.team.id));if(M(n,"--json"))W(e,o);else for(let i of o)e.stdout.write(`${i.alias} ${i.role} ${ke(i)} ${i.sessionid??"(unseeded)"}
1357
1357
  `);return 0}function 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=Xr(e,r,j(n,"--project"),j(n,"--team"));if(typeof o=="number")return o;let i=r.findTeamMemberByAlias(o.team.id,s);return i===null||i.state==="retired"?w(e,`member not found: ${s}`):(M(n,"--json")?W(e,i):(e.stdout.write(`member ${i.alias}
@@ -1362,7 +1362,7 @@ Don't dump all of durable-memory into your context. The pattern is index-first,
1362
1362
  `),e.stdout.write(`sessiondir: ${i.sessiondir}
1363
1363
  `)),0)}function pN(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=Xr(e,r,j(n,"--project"),j(n,"--team"));if(typeof o=="number")return o;let i=r.findTeamMemberByAlias(o.team.id,s);if(i===null||i.state==="retired")return w(e,`member not found: ${s}`);let a=r.setMemberState(i.id,"retired","removed via code team rm");return M(n,"--json")?W(e,a):e.stdout.write(`retired member ${i.alias}
1364
1364
  `),0}async function hN(t,e,r){if(t.includes("--help")||t.includes("-h"))return Xp(e);let n=P(t,["--project","--team","--alias"]);if(n.error!==void 0)return w(e,n.error);let s=Xr(e,r,j(n,"--project"),j(n,"--team"));if(typeof s=="number")return s;let o=Wo(e,r,s.team,j(n,"--alias"));if(typeof o=="number")return o;let i=await SN(e,r,s.project,o);e.stdout.write(`[${i.alias}@${s.project.name}] type /help for commands
1365
- `);let a=e.stdin??process.stdin,l=zl.createInterface({input:a,terminal:!1}),c=i;Pn(e,c,s.project);try{for await(let u of l){let d=u.trim();if(d.length===0){Pn(e,c,s.project);continue}if(d==="/exit")return e.stdout.write(`[bye]
1365
+ `);let a=e.stdin??process.stdin,l=Zl.createInterface({input:a,terminal:!1}),c=i;Pn(e,c,s.project);try{for await(let u of l){let d=u.trim();if(d.length===0){Pn(e,c,s.project);continue}if(d==="/exit")return e.stdout.write(`[bye]
1366
1366
  `),0;if(d==="/help"){TN(e),Pn(e,c,s.project);continue}if(d.startsWith("/")){e.stderr.write(`unknown command: ${d}
1367
1367
  `),Pn(e,c,s.project);continue}e.stdout.write(`[${c.alias}@${s.project.name}] (thinking...)
1368
1368
  `);let f=await Dr({sessionid:c.sessionid,sessiondir:c.sessiondir,prompt:d,dal:r,team_member_id:c.id});e.stdout.write(`${f.text.trimEnd()}
@@ -1370,11 +1370,11 @@ Don't dump all of durable-memory into your context. The pattern is index-first,
1370
1370
  `),yN(e,m,p.id)}function gN(t,e){let r=Rn(t,process.env,e);return process.env.LMCTL_API_URL=r.baseUrl,r.token!==null&&r.token.length>0&&(process.env.LMCTL_API_TOKEN=r.token),r}function wN(t){return t.stdout.write(["usage: lmctl code spec <task-description> [options]","","options:"," --slug S default: slugified task description",` --template W default: ${Jp}`," --from-requirement PATH skip requirement stage"," --from-plan PATH skip plan stage"," --from-design PATH skip design stage"," --project NAME override cwd project resolution"," --team NAME override project team","","interactive commands while paused:"," /done mark current Interactive stage done"," /exit leave the run paused and exit",""].join(`
1371
1371
  `)),0}async function yN(t,e,r){let n=null;for(let s=0;s<1e3;s+=1){let o=await Fn(e,`/api/jobs/${r}/run`,"POST");if(o.run_id!==null&&(n=o.run_id),o.status==="done")return t.stdout.write(`code spec complete: run ${o.run_id??n??"(unknown)"} terminal=${o.terminal_state??"(none)"}
1372
1372
  `),o.terminal_state==="done"?0:1;if(o.status==="failed")return t.stderr.write(`code spec failed: run ${o.run_id??n??"(unknown)"} terminal=${o.terminal_state??"(none)"}
1373
- `),1;if(o.status==="paused"&&o.run_id!==null){n=o.run_id;let i=await EN(t,e,r,n);if(i!=="continue")return i;continue}await Yl(1e3)}return t.stderr.write(`error: code spec polling exceeded step limit for job ${r}
1373
+ `),1;if(o.status==="paused"&&o.run_id!==null){n=o.run_id;let i=await EN(t,e,r,n);if(i!=="continue")return i;continue}await zl(1e3)}return t.stderr.write(`error: code spec polling exceeded step limit for job ${r}
1374
1374
  `),1}async function EN(t,e,r,n){let s=await Fn(e,`/api/runs/${n}`,"GET"),o=typeof s.current_state=="string"&&s.current_state.startsWith("__paused__:")?s.current_state.slice(11):null;if(o===null)return t.stderr.write(`[code spec] run ${n} paused without an Interactive state; polling will continue
1375
- `),await Yl(1e3),"continue";let i=[...s.steps].reverse().find(l=>l.state_name===o);if(i===void 0)return t.stderr.write(`[code spec] paused state ${o} has no step; polling will continue
1376
- `),await Yl(1e3),"continue";t.stderr.write(`[code spec] interactive stage ${o}; type /done to advance or /exit to leave paused
1377
- `);let a=zl.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}
1375
+ `),await zl(1e3),"continue";let i=[...s.steps].reverse().find(l=>l.state_name===o);if(i===void 0)return t.stderr.write(`[code spec] paused state ${o} has no step; polling will continue
1376
+ `),await zl(1e3),"continue";t.stderr.write(`[code spec] interactive stage ${o}; type /done to advance or /exit to leave paused
1377
+ `);let a=Zl.createInterface({input:t.stdin??process.stdin,terminal:!1});try{for await(let l of a){let c=l.trim();if(c==="/exit")return t.stdout.write(`code spec paused: job ${r}, run ${n}, stage ${o}
1378
1378
  `),0;if(c==="/done")return await Fn(e,`/api/interactive/${i.id}/respond`,"POST",{input:"",done:!0}),"continue";if(c.length!==0)return await Fn(e,`/api/interactive/${i.id}/respond`,"POST",{input:c,done:!1}),"continue"}}finally{a.close()}return 0}async function Fn(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 bN(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,60);return e.length>0?e:"spec-task"}function Xp(t){return t.stdout.write(["usage: lmctl code chat [--project P] [--team T] [--alias A]","","slash commands:"," /help show this help"," /exit exit the REPL",""].join(`
1379
1379
  `)),0}function TN(t){t.stderr.write(`commands: /help, /exit
1380
1380
  `)}function Pn(t,e,r){t.stdout.write(`[${e.alias}@${r.name}] > `)}function Fo(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=iN("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=Hp(s),i=e.listProjects().find(a=>Hp(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 Uo(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 Wo(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 Xr(t,e,r,n){let s=Fo(t,e,r);if(typeof s=="number")return s;let o=Uo(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 SN(t,e,r,n){if(n.sessionid!==null&&n.sessionid.trim().length>0)return n;t.stderr.write(`[seeding ${n.alias}...]
@@ -1382,27 +1382,27 @@ Don't dump all of durable-memory into your context. The pattern is index-first,
1382
1382
  ${i}
1383
1383
  `),await Po({dal:e,member:o,stderr:t.stderr});let a=o.role_prompt??"",l=a.length>0?`${a}
1384
1384
 
1385
- ${Br}`:Br;return e.setMemberPromptSnapshot(o.id,l)??o}function kN(t){return`${aN(t.local_path)}-code`}var Jp,Zl=E(()=>{"use strict";Nn();io();Ln();Ml();Dl();Me();Hr();Kl();Se();Ll();Jp="spec-driven-task"});import Kp from"jexl";function Jt(t){Kp.compile(Yp(t))}async function wr(t,e){return Kp.eval(Yp(t),e)}function Yp(t){return t.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var Gr=E(()=>{"use strict"});import{z as y}from"zod";function oc(t){let e=t.trim();return e.startsWith("={{")&&e.endsWith("}}")?e.slice(3,-2).trim():t}var vN,zp,Ql,ec,tc,rc,nc,sc,Zp,IN,$N,NN,Un,xN,Bo,qo,Ho,Jo,Xo,Qp,jN,AN,RN,ON,Go,Vr=E(()=>{"use strict";Gr();vN=y.object({kind:y.enum(["success","neutral","failure"])}),zp=y.enum(["string","number","boolean","object","array"]),Ql=y.object({name:y.string().min(1),type:zp,required:y.boolean().optional(),default:y.unknown().optional(),description:y.string().optional()}),ec=y.object({name:y.string().min(1),type:zp,source_step_id:y.string().min(1),source_field:y.string().min(1),description:y.string().optional()}),tc=y.object({id:y.string().min(1),type:y.string().min(1),parameters:y.record(y.string(),y.unknown()).default({})}),rc="__failure__",nc=y.object({tools:y.array(y.string().min(1)).optional(),auth:y.array(y.string().min(1)).optional()}).strict().optional(),sc=y.object({on_unhandled_failure:y.object({attention_kind:y.string().min(1).default("workflow_failed"),severity:y.enum(["warn","error","critical"]).default("warn"),capture_evidence:y.boolean().default(!0),recommend_recovery:y.string().min(1).optional()}).optional(),on_unhandled_failure_state:y.string().min(1).optional()}).optional(),Zp=y.object({type:y.literal("AssertRepoClean"),fail_message:y.string().min(1).optional(),next:y.string().min(1)}),IN=y.object({name:y.string().min(1),command:y.string().min(1).optional(),args:y.array(y.string()).optional(),env:y.record(y.string(),y.string()).optional(),type:y.enum(["stdio","http","sse"]).optional(),url:y.string().min(1).optional(),headers:y.record(y.string(),y.string()).optional()}).strict(),$N=y.union([y.string().min(1),IN]),NN=y.union([y.string().min(1),y.object({name:y.string().min(1),content:y.string().min(1)}).strict()]),Un=y.object({team:y.string().min(1),alias:y.string().min(1),prompt_template:y.string().optional(),mcp:y.array($N).optional(),skills:y.array(NN).optional()}),xN=y.object({kind:y.literal("shell"),command:y.string().min(1),description:y.string().optional()}),Bo=y.object({type:y.literal("Review"),state_name:y.string().min(1),coder:Un,pre_checks:y.array(xN).optional(),reviewers:y.array(Un.extend({rubric_artifact:y.string().optional()})).optional(),outcomes:y.object({approve:y.string().min(1),request_changes:y.string().optional(),fail_pre_check:y.string().optional(),max_loops_exceeded:y.string().optional()}),writes_to_project_path:y.boolean().optional(),durable_memory_tags:y.array(y.string().min(1)).optional(),write_back_durable_memory:y.union([y.boolean(),y.string().min(1)]).optional(),max_loops:y.number().int().positive().default(5),loop_feedback_artifact:y.string().optional(),outcomes_from_stance:y.record(y.string(),y.string().min(1)).optional()}).superRefine((t,e)=>{(t.reviewers??[]).length>0&&t.outcomes_from_stance!==void 0&&e.addIssue({code:"custom",path:["outcomes_from_stance"],message:"outcomes_from_stance cannot be used when reviewers is non-empty"})}),qo=y.object({type:y.literal("Consolidate"),state_name:y.string().min(1),researchers:y.array(Un.extend({topic:y.string().min(1)})).optional(),consolidator:Un,outcomes:y.object({ok:y.string().min(1),error:y.string().optional()}),research_artifact_prefix:y.string().optional(),durable_memory_tags:y.array(y.string().min(1)).optional(),write_back_durable_memory:y.union([y.boolean(),y.string().min(1)]).optional()}),Ho=y.object({type:y.literal("Interactive"),state_name:y.string().min(1),agent:Un.extend({initial_prompt_template:y.string().min(1)}),termination:y.object({operator_signal:y.boolean().default(!0),agent_signal:y.string().optional(),max_turns:y.number().int().positive().default(20),timeout_seconds:y.number().int().positive().optional()}),outcomes:y.object({done:y.string().min(1),timeout:y.string().optional()}),artifact_name:y.string().optional(),durable_memory_tags:y.array(y.string().min(1)).optional(),write_back_durable_memory:y.union([y.boolean(),y.string().min(1)]).optional()}),Jo=y.object({type:y.literal("Loop"),state_name:y.string().min(1),over:y.string().min(1),item_var:y.string().min(1),body:y.string().min(1),outcomes:y.object({ok:y.string().min(1),error:y.string().optional()}),stop_on_error:y.boolean().default(!0),max_items:y.number().int().positive().default(1e3)}),Xo=y.object({type:y.literal("ShellStep"),state_name:y.string().min(1),command:y.string().min(1),outcomes_from_exit:y.record(y.string(),y.string().min(1)),timeout_ms:y.number().int().nonnegative().optional(),capture_output_to:y.string().optional(),writes_to_project_path:y.boolean().optional()}),Qp=y.object({type:y.literal("Choice"),state_name:y.string().min(1),branches:y.array(y.object({when:y.string().min(1),next:y.string().min(1)})).default([]),default_next:y.string().min(1).optional()}).superRefine((t,e)=>{for(let[r,n]of t.branches.entries())try{Jt(oc(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}`})}}),jN=y.discriminatedUnion("type",[Zp,Bo,qo,Ho,Jo,Xo,Qp]),AN=y.object({type:y.literal("ForEach"),state_name:y.string().min(1),items_from:y.string().min(1),mode:y.enum(["sequential","parallel"]).default("sequential"),max_concurrency:y.number().int().positive().default(1),on_item_failure:y.enum(["continue","stop"]).default("stop"),body:jN,outcomes:y.object({all_ok:y.string().min(1),any_failed:y.string().optional()})}).superRefine((t,e)=>{try{Jt(oc(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}`})}}),RN=y.object({type:y.literal("Subflow"),state_name:y.string().min(1),workflow_name:y.string().min(1),inputs:y.record(y.string(),y.string().min(1)).optional(),outcomes:y.record(y.string(),y.string().min(1))}).superRefine((t,e)=>{for(let[r,n]of Object.entries(t.inputs??{}))try{Jt(oc(n))}catch(s){let o=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["inputs",r],message:`invalid jexl expression: ${o}`})}}),ON=y.discriminatedUnion("type",[Zp,Bo,qo,Ho,Jo,Xo,Qp,AN,RN]),Go=y.object({name:y.string().min(1),version:y.number().int().positive(),definition_schema_version:y.union([y.literal(1),y.literal(2)]),description:y.string().optional(),estimated_duration_ms:y.number().int().nonnegative().optional(),primitive_version:y.union([y.literal(1),y.literal(2)]).default(1),start_at:y.string().min(1),states:y.record(y.string().min(1),ON),terminals:y.record(y.string().min(1),vN),errors:sc,concurrency_key:y.string().min(1).optional(),concurrent_limit:y.number().int().positive().optional(),default_task_timeout_ms:y.number().int().positive().max(216e5).optional(),inputs:y.array(Ql).optional(),outputs:y.array(ec).optional(),triggers:y.array(tc).optional(),read_only:y.boolean().optional(),requires:nc}).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 LN,Vo,CN,MN,DN,dt,Kr=E(()=>{"use strict";Vr();LN=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,Vo=Y.string().regex(LN),CN=Y.object({step_id:Vo,type:Y.literal("main"),index:Y.number().int().min(0)}),MN=Y.record(Vo,Y.record(Y.string().min(1),Y.array(Y.array(CN)))),DN=Y.object({id:Vo,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:sc,inputs:Y.array(Ql).optional(),outputs:Y.array(ec).optional(),steps:Y.array(DN).min(1),connections:MN.default({}),entry_step_id:Vo,triggers:Y.array(tc).optional(),read_only:Y.boolean().optional(),requires:nc}).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 Ko(t){return ac(t)}function ac(t){if(Array.isArray(t))return t.map(ac);if(t===null||typeof t!="object")return t;let e=t,r={};for(let n of Object.keys(e))r[n]=ac(e[n]);if(typeof r.type=="string"){let n=FN[r.type];n!==void 0&&(r.type=n)}return r}var ic,PN,FN,lc=E(()=>{"use strict";ic="lmctl.builtin.",PN={Review:`${ic}Review`,Research:`${ic}Research`,Consolidate:`${ic}Consolidate`},FN=Object.fromEntries(Object.entries(PN).map(([t,e])=>[e,t]))});import{readFileSync as UN}from"node:fs";function rh(t){return WN(t)}function WN(t){let e=Ko(HN(t));if(qN(e),nh(e)===3)return BN(e);let r=Go.safeParse(e);if(!r.success)throw new $t({errors:r.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message}))});let n=JN(r.data);if(n.errors.length>0||n.unresolvedRefs.length>0)throw new $t(n);return r.data}function BN(t){let e=dt.safeParse(t);if(!e.success)throw new $t({errors:e.error.issues.map(r=>({path:r.path.length===0?"$":r.path.map(String).join("."),message:r.message}))});return e.data}function qN(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return;let e=nh(t);if(!(e===null||eh.includes(e)))throw new $t({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${e}; supported versions: ${eh.join(", ")}`}]})}function nh(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 HN(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
1386
- `)||e.startsWith("{")||e.startsWith("[")?th(t,"$"):e.endsWith(".json")?th(UN(e,"utf8"),e):t}function th(t,e){try{return JSON.parse(t)}catch(r){let n=r instanceof Error?r.message:"invalid JSON";throw new $t({errors:[{path:e,message:`invalid JSON: ${n}`}]})}}function JN(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"}),XN(t,n,r);for(let[s,o]of Object.entries(t.states))new Set(Object.keys(t.terminals));return{errors:e,unresolvedRefs:r}}function XN(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 eh,$t,sh=E(()=>{"use strict";Vr();Kr();lc();eh=[1,2,3],$t=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 GN}from"node:crypto";function oh(t,e){let r=VN(e),n=GN("sha1").update(`${t}:${e}`).digest("hex").slice(0,4);return`s-${r}-${n}`}function VN(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"step"}var ih=E(()=>{"use strict";Kr()});function zN(t,e){let r=YN[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 uh(t){let e=[],r=($,N)=>{throw new Yr([{line:$,message:N}])},n=t.split(`
1387
- `),s=[];for(let $=0;$<n.length;$+=1){let O=ex(n[$]).trim();O.length>0&&s.push({n:$+1,text:O})}s.length===0&&r(1,"empty composition: expected a `workflow <name> v<version>` header");let o=/^workflow\s+(\S+)\s+v(\d+)$/.exec(s[0].text)??r(s[0].n,`expected header \`workflow <name> v<version>\`, got: ${s[0].text}`),i=o[1],a=Number.parseInt(o[2],10),l=new Map,c=[],u=[],d=[],f,m={},p=new Map,h=new Map,g=new Map,_=($,N,O,q,F,C)=>{l.has($)&&r(q,`duplicate step/terminal id: ${$}`),/^[A-Za-z][\w-]*$/.test($)||r(q,`invalid id (must start with a letter): ${$}`),l.set($,{declId:$,type:N,params:O,line:q,isTerminal:F,...C?{members:C}:{}}),u.push($)},T=$=>{let N=[],O=$+1;for(;O<s.length;O+=1){let q=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[O].text);if(q===null)break;N.push({label:q[1],dst:q[2]})}return{branches:N,nextIdx:O-1}};for(let $=1;$<s.length;$+=1){let{n:N,text:O}=s[$],q=O.split(/\s+/,1)[0];if(/^meta\s*\(/.test(O)){$!==1&&r(N,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let F=/^meta\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${O}`),C=Xt(F[1],N,r);for(let Z of Object.keys(C))lh.has(Z)||r(N,`unknown \`meta\` key \`${Z}\` \u2014 only workflow-level runtime metadata is allowed: ${[...lh].join(", ")} (no grammar inflation; bounded)`);m=C;continue}if(q==="step"){let F=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${O}`),C=F[1],Z=F[2],_e=F[3],oe=ah[Z];oe===void 0&&r(N,`unknown step type: ${Z} (supported \`step\` archetypes: ${Object.keys(ah).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:we,members:_t}=zN(oe,Xt(_e,N,r));_(C,oe,we,N,!1,Object.keys(_t).length>0?_t:void 0);continue}if(q==="trigger"){let F=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${O}`),C=F[1],Z=F[2],_e=F[3],oe=ch[Z];oe===void 0&&r(N,`unknown trigger type: ${Z} (registered trigger archetypes: ${Object.keys(ch).join(", ")})`),p.has(C)&&r(N,`duplicate trigger id: ${C}`),p.set(C,{id:C,type:oe,parameters:Xt(_e,N,r)});continue}if(q==="mcp"||q==="skill"){let F=new RegExp(`^${q}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(O)??r(N,`malformed \`${q}\` decl (expected \`${q} <name> = {json} | ${q} <name> = "<file|url>"\`): ${O}`),C=F[1],Z=F[2].trim(),_e=q==="mcp"?h:g;_e.has(C)&&r(N,`duplicate ${q} declaration: ${C}`);let oe;if(Z.startsWith("{")){let we=Xt(Z,N,r);q==="mcp"?oe={...we,name:C}:((typeof we.content!="string"||we.content.length===0)&&r(N,`\`skill ${C}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),oe={name:C,content:we.content})}else{let we=dh(Z);(typeof we!="string"||we.length===0)&&r(N,`\`${q} ${C}\`: string form must be a non-empty file path or http(s) URL`),oe=we}_e.set(C,oe);continue}if(q==="terminal"){let F=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(O)??r(N,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${O}`);_(F[1],"lmctl/terminal",{name:F[2],kind:F[3]??"neutral"},N,!0);continue}if(q==="seq"){let C=O.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(Z=>Z.trim()).filter(Z=>Z.length>0);(C.length<3||C.length%2===0)&&r(N,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${O}`);for(let Z=0;Z+2<C.length+1&&!(Z+2>C.length-1);Z+=2){let _e=C[Z],oe=C[Z+1],we=C[Z+2],_t=oe==="->"?"main":oe.slice(1,-2);c.push({srcDeclId:_e,port:_t,dstDeclId:we,line:N})}continue}if(q==="choice"){let C=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(O)??r(N,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${O}`))[1],Z=[],_e,oe=$+1;for(;oe<s.length;oe+=1){let we=s[oe].text,_t=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(we);if(_t!==null){_e!==void 0&&r(s[oe].n,`\`choice ${C}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let mn=_t[2];Z.push({when:_t[1].trim(),next:`@terminal:${mn}`}),c.push({srcDeclId:C,port:mn,dstDeclId:_t[3],line:s[oe].n});continue}let wa=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(we);if(wa!==null){_e!==void 0&&r(s[oe].n,`\`choice ${C}\` has more than one \`default\``);let mn=wa[1];_e=`@terminal:${mn}`,c.push({srcDeclId:C,port:mn,dstDeclId:wa[2],line:s[oe].n});continue}break}Z.length===0&&r(N,`\`choice ${C}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),_(C,"lmctl/choice",{branches:Z,..._e!==void 0?{default_next:_e}:{}},N,!1),$=oe-1;continue}if(q==="loop"){let F=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${O}`);_(F[1],"lmctl/loop",Xt(F[2],N,r),N,!1);continue}if(q==="foreach"){let F=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${O}`),C=Xt(F[2],N,r);"mode"in C&&r(N,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),_(F[1],"lmctl/foreach",C,N,!1);continue}if(q==="call"){let F=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${O}`),C=F[1],Z=Xt(F[2],N,r),_e=Z.workflow;(typeof _e!="string"||_e.length===0)&&r(N,`\`call ${C}\` requires a \`workflow=<name>\` argument`);let{workflow:oe,...we}=Z;_(C,"lmctl/subflow",{workflow_name:_e,...we},N,!1),d.push({declId:C,target:_e,line:N});continue}if(q==="decide"){let F=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(O)??r(N,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${O}`),C=F[1],Z=Xt(F[2],N,r),{branches:_e,nextIdx:oe}=T($);_e.length===0&&r(N,`\`decide ${C}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),_(C,"lmctl/interactive",{termination:{operator_signal:!0}},N,!1,{agent:Z});for(let we of _e)c.push({srcDeclId:C,port:we.label,dstDeclId:we.dst,line:N});$=oe;continue}if(q==="entry"){let F=/^entry\s+([A-Za-z][\w-]*)$/.exec(O)??r(N,`malformed \`entry\` (expected \`entry <id>\`): ${O}`);f!==void 0&&r(N,`duplicate \`entry\` (already set to ${f})`),f=F[1];continue}r(N,`unknown statement \`${q}\` (grammar: workflow / meta / trigger / mcp / skill / step / terminal / seq / choice / loop / foreach / call / decide / entry)`)}u.length===0&&r(s[0].n,"composition declares no steps"),f===void 0&&(f=u[0]),l.has(f)||r(s[0].n,`entry references undeclared step: ${f}`);let S=$=>{if(Array.isArray($)){for(let O of $)S(O);return}if(typeof $!="object"||$===null)return;let N=$;if(typeof N.alias=="string")for(let[O,q]of[["mcp",h],["skills",g]]){let F=N[O];Array.isArray(F)&&(N[O]=F.map(C=>typeof C=="string"&&q.has(C)?structuredClone(q.get(C)):C))}for(let O of Object.values(N))S(O)};for(let $ of u){let N=l.get($);N.members!==void 0&&S(N.members)}let I=$=>oh(i,$),v=u.map($=>{let N=l.get($);return{id:I($),name:$,type:N.type,typeVersion:1,parameters:N.params,...N.members?{members:N.members}:{}}}),k={};for(let $ of c){l.has($.srcDeclId)||r($.line,`edge source references undeclared step: ${$.srcDeclId}`),l.has($.dstDeclId)||r($.line,`dangling edge target: ${$.dstDeclId} is not declared`),l.get($.srcDeclId).isTerminal&&r($.line,`terminal \`${$.srcDeclId}\` cannot have an outgoing edge`);let N=I($.srcDeclId);k[N]??={},k[N][$.port]!==void 0&&r($.line,`duplicate edge port \`${$.port}\` on step \`${$.srcDeclId}\``),k[N][$.port]=[[{step_id:I($.dstDeclId),type:"main",index:0}]]}for(let $ of u){let N=l.get($);ZN.has(N.type)||r(N.line,`unknown archetype \`${N.type}\` for step \`${$}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let $ of d)$.target===i&&r($.line,`subflow cycle: \`call ${$.declId}\` invokes this workflow (\`${i}\`) \u2014 direct recursion is not allowed (cross-workflow A\u2192B\u2192A cycle detection is deferred to the M3 compile.ts seam)`);let R=new Map;for(let $ of c){let N=R.get($.srcDeclId);N===void 0?R.set($.srcDeclId,[$.dstDeclId]):N.push($.dstDeclId)}for(let $ of u){let N=l.get($);if(N.type!=="lmctl/loop")continue;let O=N.params.body;if(typeof O=="string"&&l.has(O)){let q=R.get($);q===void 0?R.set($,[O]):q.push(O)}}let L=new Set([f]),B=[f];for(;B.length>0;){let $=B.shift();for(let N of R.get($)??[])L.has(N)||(L.add(N),B.push(N))}for(let $ of u)L.has($)||r(l.get($).line,`step \`${$}\` is unreachable from entry \`${f}\``);let ee=new Map;for(let $ of c){let N=ee.get($.srcDeclId);N===void 0&&(N=new Set,ee.set($.srcDeclId,N)),N.add($.port)}let x=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let $ of u){let N=l.get($);if(N.isTerminal)continue;let O=ee.get($)??new Set;if(N.type==="lmctl/review"){let F=[...O].some(C=>!x.has(C));!O.has("approve")&&!F&&r(N.line,`uncovered outcome: review step \`${$}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${$} -approve-> <target>\`) or a stance port (run.ts:423-438 synthesizes outcomes_from_stance; review.ts:88-102 routes a stance before default approve)`);continue}let q=QN[N.type];if(q!==void 0)for(let F of q)O.has(F)||r(N.line,`uncovered outcome: required outcome \`${F}\` of step \`${$}\` (\`${N.type}\`) has no connection \u2014 route it (\`seq ${$} -${F}-> <target|terminal>\`)`);else O.size===0&&r(N.line,`uncovered outcome: non-terminal step \`${$}\` (\`${N.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let $ of u){let N=l.get($),O=KN[N.type];if(O===void 0)continue;let q={...N.params,...N.members??{},type:O.v2type,state_name:$,...Object.keys(O.outcomes).length>0?{outcomes:O.outcomes}:{}},F=O.schema.safeParse(q);if(!F.success){let C=F.error.issues[0],Z=C.path.length===0?"$":C.path.map(String).join(".");r(N.line,`step \`${$}\` (\`${N.type}\`) has invalid params for archetype \`${O.v2type}\` at \`${Z}\`: ${C.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${$} = ${N.type.replace("lmctl/","")}({ ... })\``)}}let H={schema_version:"lmctl/v3",definition_schema_version:3,name:i,version:a,...m,...p.size>0?{triggers:[...p.values()]}:{},steps:v,connections:k,entry_step_id:I(f)},me=dt.safeParse(H);if(!me.success)throw new Yr(me.error.issues.map($=>({line:s[0].n,message:`emitted V3 invalid at ${$.path.length===0?"$":$.path.map(String).join(".")}: ${$.message}`})));return me.data}function ex(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 Xt(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 tx(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]=dh(l)}return s}function tx(t){return t.split(",").map(e=>e.trim()).filter(e=>e.length>0)}function dh(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 KN,YN,ah,Yr,ZN,QN,lh,ch,fh=E(()=>{"use strict";Kr();ih();Vr();KN={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:Bo},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:qo},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:Ho},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:Jo},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:Xo}},YN={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};ah={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"},Yr=class extends Error{issues;constructor(e){super(`composition DSL compile failed:
1385
+ ${Br}`:Br;return e.setMemberPromptSnapshot(o.id,l)??o}function kN(t){return`${aN(t.local_path)}-code`}var Jp,Ql=E(()=>{"use strict";Nn();io();Ln();Dl();Pl();Me();Hr();Yl();Se();Cl();Jp="spec-driven-task"});import Kp from"jexl";function Xt(t){Kp.compile(Yp(t))}async function wr(t,e){return Kp.eval(Yp(t),e)}function Yp(t){return t.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var Gr=E(()=>{"use strict"});import{z as y}from"zod";function ic(t){let e=t.trim();return e.startsWith("={{")&&e.endsWith("}}")?e.slice(3,-2).trim():t}var vN,zp,ec,tc,rc,nc,sc,oc,Zp,IN,$N,NN,Un,xN,Bo,qo,Ho,Jo,Xo,Qp,jN,AN,RN,ON,Go,Vr=E(()=>{"use strict";Gr();vN=y.object({kind:y.enum(["success","neutral","failure"])}),zp=y.enum(["string","number","boolean","object","array"]),ec=y.object({name:y.string().min(1),type:zp,required:y.boolean().optional(),default:y.unknown().optional(),description:y.string().optional()}),tc=y.object({name:y.string().min(1),type:zp,source_step_id:y.string().min(1),source_field:y.string().min(1),description:y.string().optional()}),rc=y.object({id:y.string().min(1),type:y.string().min(1),parameters:y.record(y.string(),y.unknown()).default({})}),nc="__failure__",sc=y.object({tools:y.array(y.string().min(1)).optional(),auth:y.array(y.string().min(1)).optional()}).strict().optional(),oc=y.object({on_unhandled_failure:y.object({attention_kind:y.string().min(1).default("workflow_failed"),severity:y.enum(["warn","error","critical"]).default("warn"),capture_evidence:y.boolean().default(!0),recommend_recovery:y.string().min(1).optional()}).optional(),on_unhandled_failure_state:y.string().min(1).optional()}).optional(),Zp=y.object({type:y.literal("AssertRepoClean"),fail_message:y.string().min(1).optional(),next:y.string().min(1)}),IN=y.object({name:y.string().min(1),command:y.string().min(1).optional(),args:y.array(y.string()).optional(),env:y.record(y.string(),y.string()).optional(),type:y.enum(["stdio","http","sse"]).optional(),url:y.string().min(1).optional(),headers:y.record(y.string(),y.string()).optional()}).strict(),$N=y.union([y.string().min(1),IN]),NN=y.union([y.string().min(1),y.object({name:y.string().min(1),content:y.string().min(1)}).strict()]),Un=y.object({team:y.string().min(1),alias:y.string().min(1),prompt_template:y.string().optional(),mcp:y.array($N).optional(),skills:y.array(NN).optional()}),xN=y.object({kind:y.literal("shell"),command:y.string().min(1),description:y.string().optional()}),Bo=y.object({type:y.literal("Review"),state_name:y.string().min(1),coder:Un,pre_checks:y.array(xN).optional(),reviewers:y.array(Un.extend({rubric_artifact:y.string().optional()})).optional(),outcomes:y.object({approve:y.string().min(1),request_changes:y.string().optional(),fail_pre_check:y.string().optional(),max_loops_exceeded:y.string().optional()}),writes_to_project_path:y.boolean().optional(),durable_memory_tags:y.array(y.string().min(1)).optional(),write_back_durable_memory:y.union([y.boolean(),y.string().min(1)]).optional(),max_loops:y.number().int().positive().default(5),loop_feedback_artifact:y.string().optional(),outcomes_from_stance:y.record(y.string(),y.string().min(1)).optional()}).superRefine((t,e)=>{(t.reviewers??[]).length>0&&t.outcomes_from_stance!==void 0&&e.addIssue({code:"custom",path:["outcomes_from_stance"],message:"outcomes_from_stance cannot be used when reviewers is non-empty"})}),qo=y.object({type:y.literal("Consolidate"),state_name:y.string().min(1),researchers:y.array(Un.extend({topic:y.string().min(1)})).optional(),consolidator:Un,outcomes:y.object({ok:y.string().min(1),error:y.string().optional()}),research_artifact_prefix:y.string().optional(),durable_memory_tags:y.array(y.string().min(1)).optional(),write_back_durable_memory:y.union([y.boolean(),y.string().min(1)]).optional()}),Ho=y.object({type:y.literal("Interactive"),state_name:y.string().min(1),agent:Un.extend({initial_prompt_template:y.string().min(1)}),termination:y.object({operator_signal:y.boolean().default(!0),agent_signal:y.string().optional(),max_turns:y.number().int().positive().default(20),timeout_seconds:y.number().int().positive().optional()}),outcomes:y.object({done:y.string().min(1),timeout:y.string().optional()}),artifact_name:y.string().optional(),durable_memory_tags:y.array(y.string().min(1)).optional(),write_back_durable_memory:y.union([y.boolean(),y.string().min(1)]).optional()}),Jo=y.object({type:y.literal("Loop"),state_name:y.string().min(1),over:y.string().min(1),item_var:y.string().min(1),body:y.string().min(1),outcomes:y.object({ok:y.string().min(1),error:y.string().optional()}),stop_on_error:y.boolean().default(!0),max_items:y.number().int().positive().default(1e3)}),Xo=y.object({type:y.literal("ShellStep"),state_name:y.string().min(1),command:y.string().min(1),outcomes_from_exit:y.record(y.string(),y.string().min(1)),timeout_ms:y.number().int().nonnegative().optional(),capture_output_to:y.string().optional(),writes_to_project_path:y.boolean().optional()}),Qp=y.object({type:y.literal("Choice"),state_name:y.string().min(1),branches:y.array(y.object({when:y.string().min(1),next:y.string().min(1)})).default([]),default_next:y.string().min(1).optional()}).superRefine((t,e)=>{for(let[r,n]of t.branches.entries())try{Xt(ic(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}`})}}),jN=y.discriminatedUnion("type",[Zp,Bo,qo,Ho,Jo,Xo,Qp]),AN=y.object({type:y.literal("ForEach"),state_name:y.string().min(1),items_from:y.string().min(1),mode:y.enum(["sequential","parallel"]).default("sequential"),max_concurrency:y.number().int().positive().default(1),on_item_failure:y.enum(["continue","stop"]).default("stop"),body:jN,outcomes:y.object({all_ok:y.string().min(1),any_failed:y.string().optional()})}).superRefine((t,e)=>{try{Xt(ic(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}`})}}),RN=y.object({type:y.literal("Subflow"),state_name:y.string().min(1),workflow_name:y.string().min(1),inputs:y.record(y.string(),y.string().min(1)).optional(),outcomes:y.record(y.string(),y.string().min(1))}).superRefine((t,e)=>{for(let[r,n]of Object.entries(t.inputs??{}))try{Xt(ic(n))}catch(s){let o=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["inputs",r],message:`invalid jexl expression: ${o}`})}}),ON=y.discriminatedUnion("type",[Zp,Bo,qo,Ho,Jo,Xo,Qp,AN,RN]),Go=y.object({name:y.string().min(1),version:y.number().int().positive(),definition_schema_version:y.union([y.literal(1),y.literal(2)]),description:y.string().optional(),estimated_duration_ms:y.number().int().nonnegative().optional(),primitive_version:y.union([y.literal(1),y.literal(2)]).default(1),start_at:y.string().min(1),states:y.record(y.string().min(1),ON),terminals:y.record(y.string().min(1),vN),errors:oc,concurrency_key:y.string().min(1).optional(),concurrent_limit:y.number().int().positive().optional(),default_task_timeout_ms:y.number().int().positive().max(216e5).optional(),inputs:y.array(ec).optional(),outputs:y.array(tc).optional(),triggers:y.array(rc).optional(),read_only:y.boolean().optional(),requires:sc}).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 LN,Vo,CN,MN,DN,dt,Kr=E(()=>{"use strict";Vr();LN=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,Vo=Y.string().regex(LN),CN=Y.object({step_id:Vo,type:Y.literal("main"),index:Y.number().int().min(0)}),MN=Y.record(Vo,Y.record(Y.string().min(1),Y.array(Y.array(CN)))),DN=Y.object({id:Vo,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:oc,inputs:Y.array(ec).optional(),outputs:Y.array(tc).optional(),steps:Y.array(DN).min(1),connections:MN.default({}),entry_step_id:Vo,triggers:Y.array(rc).optional(),read_only:Y.boolean().optional(),requires:sc}).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 Ko(t){return lc(t)}function lc(t){if(Array.isArray(t))return t.map(lc);if(t===null||typeof t!="object")return t;let e=t,r={};for(let n of Object.keys(e))r[n]=lc(e[n]);if(typeof r.type=="string"){let n=FN[r.type];n!==void 0&&(r.type=n)}return r}var ac,PN,FN,cc=E(()=>{"use strict";ac="lmctl.builtin.",PN={Review:`${ac}Review`,Research:`${ac}Research`,Consolidate:`${ac}Consolidate`},FN=Object.fromEntries(Object.entries(PN).map(([t,e])=>[e,t]))});import{readFileSync as UN}from"node:fs";function rh(t){return WN(t)}function WN(t){let e=Ko(HN(t));if(qN(e),nh(e)===3)return BN(e);let r=Go.safeParse(e);if(!r.success)throw new $t({errors:r.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message}))});let n=JN(r.data);if(n.errors.length>0||n.unresolvedRefs.length>0)throw new $t(n);return r.data}function BN(t){let e=dt.safeParse(t);if(!e.success)throw new $t({errors:e.error.issues.map(r=>({path:r.path.length===0?"$":r.path.map(String).join("."),message:r.message}))});return e.data}function qN(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return;let e=nh(t);if(!(e===null||eh.includes(e)))throw new $t({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${e}; supported versions: ${eh.join(", ")}`}]})}function nh(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 HN(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
1386
+ `)||e.startsWith("{")||e.startsWith("[")?th(t,"$"):e.endsWith(".json")?th(UN(e,"utf8"),e):t}function th(t,e){try{return JSON.parse(t)}catch(r){let n=r instanceof Error?r.message:"invalid JSON";throw new $t({errors:[{path:e,message:`invalid JSON: ${n}`}]})}}function JN(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"}),XN(t,n,r);for(let[s,o]of Object.entries(t.states))new Set(Object.keys(t.terminals));return{errors:e,unresolvedRefs:r}}function XN(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 eh,$t,sh=E(()=>{"use strict";Vr();Kr();cc();eh=[1,2,3],$t=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 GN}from"node:crypto";function oh(t,e){let r=VN(e),n=GN("sha1").update(`${t}:${e}`).digest("hex").slice(0,4);return`s-${r}-${n}`}function VN(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"step"}var ih=E(()=>{"use strict";Kr()});function zN(t,e){let r=YN[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 uh(t){let e=[],r=($,N)=>{throw new Yr([{line:$,message:N}])},n=t.split(`
1387
+ `),s=[];for(let $=0;$<n.length;$+=1){let O=ex(n[$]).trim();O.length>0&&s.push({n:$+1,text:O})}s.length===0&&r(1,"empty composition: expected a `workflow <name> v<version>` header");let o=/^workflow\s+(\S+)\s+v(\d+)$/.exec(s[0].text)??r(s[0].n,`expected header \`workflow <name> v<version>\`, got: ${s[0].text}`),i=o[1],a=Number.parseInt(o[2],10),l=new Map,c=[],u=[],d=[],f,m={},p=new Map,h=new Map,g=new Map,_=($,N,O,q,F,C)=>{l.has($)&&r(q,`duplicate step/terminal id: ${$}`),/^[A-Za-z][\w-]*$/.test($)||r(q,`invalid id (must start with a letter): ${$}`),l.set($,{declId:$,type:N,params:O,line:q,isTerminal:F,...C?{members:C}:{}}),u.push($)},T=$=>{let N=[],O=$+1;for(;O<s.length;O+=1){let q=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[O].text);if(q===null)break;N.push({label:q[1],dst:q[2]})}return{branches:N,nextIdx:O-1}};for(let $=1;$<s.length;$+=1){let{n:N,text:O}=s[$],q=O.split(/\s+/,1)[0];if(/^meta\s*\(/.test(O)){$!==1&&r(N,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let F=/^meta\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${O}`),C=Gt(F[1],N,r);for(let Z of Object.keys(C))lh.has(Z)||r(N,`unknown \`meta\` key \`${Z}\` \u2014 only workflow-level runtime metadata is allowed: ${[...lh].join(", ")} (no grammar inflation; bounded)`);m=C;continue}if(q==="step"){let F=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${O}`),C=F[1],Z=F[2],_e=F[3],oe=ah[Z];oe===void 0&&r(N,`unknown step type: ${Z} (supported \`step\` archetypes: ${Object.keys(ah).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:we,members:_t}=zN(oe,Gt(_e,N,r));_(C,oe,we,N,!1,Object.keys(_t).length>0?_t:void 0);continue}if(q==="trigger"){let F=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${O}`),C=F[1],Z=F[2],_e=F[3],oe=ch[Z];oe===void 0&&r(N,`unknown trigger type: ${Z} (registered trigger archetypes: ${Object.keys(ch).join(", ")})`),p.has(C)&&r(N,`duplicate trigger id: ${C}`),p.set(C,{id:C,type:oe,parameters:Gt(_e,N,r)});continue}if(q==="mcp"||q==="skill"){let F=new RegExp(`^${q}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(O)??r(N,`malformed \`${q}\` decl (expected \`${q} <name> = {json} | ${q} <name> = "<file|url>"\`): ${O}`),C=F[1],Z=F[2].trim(),_e=q==="mcp"?h:g;_e.has(C)&&r(N,`duplicate ${q} declaration: ${C}`);let oe;if(Z.startsWith("{")){let we=Gt(Z,N,r);q==="mcp"?oe={...we,name:C}:((typeof we.content!="string"||we.content.length===0)&&r(N,`\`skill ${C}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),oe={name:C,content:we.content})}else{let we=dh(Z);(typeof we!="string"||we.length===0)&&r(N,`\`${q} ${C}\`: string form must be a non-empty file path or http(s) URL`),oe=we}_e.set(C,oe);continue}if(q==="terminal"){let F=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(O)??r(N,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${O}`);_(F[1],"lmctl/terminal",{name:F[2],kind:F[3]??"neutral"},N,!0);continue}if(q==="seq"){let C=O.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(Z=>Z.trim()).filter(Z=>Z.length>0);(C.length<3||C.length%2===0)&&r(N,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${O}`);for(let Z=0;Z+2<C.length+1&&!(Z+2>C.length-1);Z+=2){let _e=C[Z],oe=C[Z+1],we=C[Z+2],_t=oe==="->"?"main":oe.slice(1,-2);c.push({srcDeclId:_e,port:_t,dstDeclId:we,line:N})}continue}if(q==="choice"){let C=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(O)??r(N,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${O}`))[1],Z=[],_e,oe=$+1;for(;oe<s.length;oe+=1){let we=s[oe].text,_t=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(we);if(_t!==null){_e!==void 0&&r(s[oe].n,`\`choice ${C}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let mn=_t[2];Z.push({when:_t[1].trim(),next:`@terminal:${mn}`}),c.push({srcDeclId:C,port:mn,dstDeclId:_t[3],line:s[oe].n});continue}let ya=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(we);if(ya!==null){_e!==void 0&&r(s[oe].n,`\`choice ${C}\` has more than one \`default\``);let mn=ya[1];_e=`@terminal:${mn}`,c.push({srcDeclId:C,port:mn,dstDeclId:ya[2],line:s[oe].n});continue}break}Z.length===0&&r(N,`\`choice ${C}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),_(C,"lmctl/choice",{branches:Z,..._e!==void 0?{default_next:_e}:{}},N,!1),$=oe-1;continue}if(q==="loop"){let F=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${O}`);_(F[1],"lmctl/loop",Gt(F[2],N,r),N,!1);continue}if(q==="foreach"){let F=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${O}`),C=Gt(F[2],N,r);"mode"in C&&r(N,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),_(F[1],"lmctl/foreach",C,N,!1);continue}if(q==="call"){let F=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${O}`),C=F[1],Z=Gt(F[2],N,r),_e=Z.workflow;(typeof _e!="string"||_e.length===0)&&r(N,`\`call ${C}\` requires a \`workflow=<name>\` argument`);let{workflow:oe,...we}=Z;_(C,"lmctl/subflow",{workflow_name:_e,...we},N,!1),d.push({declId:C,target:_e,line:N});continue}if(q==="decide"){let F=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(O)??r(N,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${O}`),C=F[1],Z=Gt(F[2],N,r),{branches:_e,nextIdx:oe}=T($);_e.length===0&&r(N,`\`decide ${C}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),_(C,"lmctl/interactive",{termination:{operator_signal:!0}},N,!1,{agent:Z});for(let we of _e)c.push({srcDeclId:C,port:we.label,dstDeclId:we.dst,line:N});$=oe;continue}if(q==="entry"){let F=/^entry\s+([A-Za-z][\w-]*)$/.exec(O)??r(N,`malformed \`entry\` (expected \`entry <id>\`): ${O}`);f!==void 0&&r(N,`duplicate \`entry\` (already set to ${f})`),f=F[1];continue}r(N,`unknown statement \`${q}\` (grammar: workflow / meta / trigger / mcp / skill / step / terminal / seq / choice / loop / foreach / call / decide / entry)`)}u.length===0&&r(s[0].n,"composition declares no steps"),f===void 0&&(f=u[0]),l.has(f)||r(s[0].n,`entry references undeclared step: ${f}`);let S=$=>{if(Array.isArray($)){for(let O of $)S(O);return}if(typeof $!="object"||$===null)return;let N=$;if(typeof N.alias=="string")for(let[O,q]of[["mcp",h],["skills",g]]){let F=N[O];Array.isArray(F)&&(N[O]=F.map(C=>typeof C=="string"&&q.has(C)?structuredClone(q.get(C)):C))}for(let O of Object.values(N))S(O)};for(let $ of u){let N=l.get($);N.members!==void 0&&S(N.members)}let I=$=>oh(i,$),v=u.map($=>{let N=l.get($);return{id:I($),name:$,type:N.type,typeVersion:1,parameters:N.params,...N.members?{members:N.members}:{}}}),k={};for(let $ of c){l.has($.srcDeclId)||r($.line,`edge source references undeclared step: ${$.srcDeclId}`),l.has($.dstDeclId)||r($.line,`dangling edge target: ${$.dstDeclId} is not declared`),l.get($.srcDeclId).isTerminal&&r($.line,`terminal \`${$.srcDeclId}\` cannot have an outgoing edge`);let N=I($.srcDeclId);k[N]??={},k[N][$.port]!==void 0&&r($.line,`duplicate edge port \`${$.port}\` on step \`${$.srcDeclId}\``),k[N][$.port]=[[{step_id:I($.dstDeclId),type:"main",index:0}]]}for(let $ of u){let N=l.get($);ZN.has(N.type)||r(N.line,`unknown archetype \`${N.type}\` for step \`${$}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let $ of d)$.target===i&&r($.line,`subflow cycle: \`call ${$.declId}\` invokes this workflow (\`${i}\`) \u2014 direct recursion is not allowed (cross-workflow A\u2192B\u2192A cycle detection is deferred to the M3 compile.ts seam)`);let R=new Map;for(let $ of c){let N=R.get($.srcDeclId);N===void 0?R.set($.srcDeclId,[$.dstDeclId]):N.push($.dstDeclId)}for(let $ of u){let N=l.get($);if(N.type!=="lmctl/loop")continue;let O=N.params.body;if(typeof O=="string"&&l.has(O)){let q=R.get($);q===void 0?R.set($,[O]):q.push(O)}}let L=new Set([f]),B=[f];for(;B.length>0;){let $=B.shift();for(let N of R.get($)??[])L.has(N)||(L.add(N),B.push(N))}for(let $ of u)L.has($)||r(l.get($).line,`step \`${$}\` is unreachable from entry \`${f}\``);let ee=new Map;for(let $ of c){let N=ee.get($.srcDeclId);N===void 0&&(N=new Set,ee.set($.srcDeclId,N)),N.add($.port)}let x=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let $ of u){let N=l.get($);if(N.isTerminal)continue;let O=ee.get($)??new Set;if(N.type==="lmctl/review"){let F=[...O].some(C=>!x.has(C));!O.has("approve")&&!F&&r(N.line,`uncovered outcome: review step \`${$}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${$} -approve-> <target>\`) or a stance port (run.ts:423-438 synthesizes outcomes_from_stance; review.ts:88-102 routes a stance before default approve)`);continue}let q=QN[N.type];if(q!==void 0)for(let F of q)O.has(F)||r(N.line,`uncovered outcome: required outcome \`${F}\` of step \`${$}\` (\`${N.type}\`) has no connection \u2014 route it (\`seq ${$} -${F}-> <target|terminal>\`)`);else O.size===0&&r(N.line,`uncovered outcome: non-terminal step \`${$}\` (\`${N.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let $ of u){let N=l.get($),O=KN[N.type];if(O===void 0)continue;let q={...N.params,...N.members??{},type:O.v2type,state_name:$,...Object.keys(O.outcomes).length>0?{outcomes:O.outcomes}:{}},F=O.schema.safeParse(q);if(!F.success){let C=F.error.issues[0],Z=C.path.length===0?"$":C.path.map(String).join(".");r(N.line,`step \`${$}\` (\`${N.type}\`) has invalid params for archetype \`${O.v2type}\` at \`${Z}\`: ${C.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${$} = ${N.type.replace("lmctl/","")}({ ... })\``)}}let H={schema_version:"lmctl/v3",definition_schema_version:3,name:i,version:a,...m,...p.size>0?{triggers:[...p.values()]}:{},steps:v,connections:k,entry_step_id:I(f)},me=dt.safeParse(H);if(!me.success)throw new Yr(me.error.issues.map($=>({line:s[0].n,message:`emitted V3 invalid at ${$.path.length===0?"$":$.path.map(String).join(".")}: ${$.message}`})));return me.data}function ex(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 Gt(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 tx(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]=dh(l)}return s}function tx(t){return t.split(",").map(e=>e.trim()).filter(e=>e.length>0)}function dh(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 KN,YN,ah,Yr,ZN,QN,lh,ch,fh=E(()=>{"use strict";Kr();ih();Vr();KN={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:Bo},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:qo},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:Ho},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:Jo},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:Xo}},YN={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};ah={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"},Yr=class extends Error{issues;constructor(e){super(`composition DSL compile failed:
1388
1388
  ${e.map(r=>` line ${r.line}: ${r.message}`).join(`
1389
1389
  `)}`),this.issues=e,this.name="DslCompileError"}},ZN=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"]),QN={"lmctl/consolidate":["ok"],"lmctl/interactive":["done"],"lmctl/loop":["ok"],"lmctl/foreach":["all_ok"]},lh=new Set(["requires","default_task_timeout_ms","errors","concurrency_key","concurrent_limit"]),ch={"trigger-schedule":"lmctl/trigger-schedule","trigger-gh-issue":"lmctl/trigger-gh-issue"}});import{readFileSync as rx}from"node:fs";function nx(){let t=process.env.LMCTL_DSL;return t===void 0?!0:!["0","false","off"].includes(t.trim().toLowerCase())}function sx(t){for(let e of t.split(`
1390
- `)){let r=e.replace(/#.*/,"").trim();if(r.length!==0)return/^workflow\s+\S+\s+v\d+\s*$/.test(r)}return!1}function Re(t){if(typeof t=="string"&&nx()&&sx(t)){let r;try{r=uh(t)}catch(s){throw s instanceof Yr?new Nt(s.issues.map(o=>({path:`dsl:${o.line}`,message:o.message}))):s}let n=dt.safeParse(r);if(!n.success)throw new Nt(n.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));return n.data}let e=Ko(ix(t));if(ax(e)&&e.definition_schema_version===3){let r=dt.safeParse(e);if(!r.success)throw new Nt(r.error.issues.map(n=>({path:n.path.length===0?"$":n.path.map(String).join("."),message:n.message})));return r.data}return ox(e)}function ox(t){let e=Go.safeParse(t);if(!e.success)throw new Nt(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 Nt([{path:`states.${s}`,message:`v2 workflows (primitive_version: 2) may not use v1 primitive type: ${o.type}`}]);try{return rh(r)}catch(s){throw s instanceof $t?new cc(s):s}}function ix(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
1391
- `)||e.startsWith("{")||e.startsWith("[")?mh(t):e.endsWith(".json")?mh(rx(e,"utf8")):t}function mh(t){return JSON.parse(t)}function ax(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var cc,Nt,zr=E(()=>{"use strict";Vr();sh();lc();Kr();fh();cc=class extends Error{causeError;constructor(e){super("compiler emitted invalid atomic workflow"),this.causeError=e,this.name="CompilerInvariantError"}},Nt=class extends Error{issues;constructor(e){super("compound workflow validation failed"),this.issues=e,this.name="CompilerValidationError"}}});function Yo(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:lx(r,{job:{id:t.job.id,kind:t.job.source,source:t.job.source,source_ref:t.job.source_ref,payload:ux(t.job.payload)},project:t.project===null?null:{id:t.project.id,name:t.project.name}}),concurrent_limit:e}}function lx(t,e){return t.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(r,n)=>{let s=cx(e,n.trim());return s==null?"":typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):JSON.stringify(s)})}function cx(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 ux(t){if(t===null||t.trim().length===0)return null;try{return JSON.parse(t)}catch{return t}}var uc=E(()=>{"use strict"});var ph={};ie(ph,{enqueueFromAgentOutput:()=>fx,enqueueFromGitHubIssue:()=>dc,enqueueManual:()=>dx,enqueueScheduled:()=>mx});function dc(t,e){return Zo(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:zo(e.payload),concurrency_key:e.concurrency_key,priority:e.priority})}function dx(t,e){return Zo(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:zo(e.payload),concurrency_key:e.concurrency_key})}function fx(t,e){let r=e.sequence===void 0?`run:${e.parent_run_id}`:`run:${e.parent_run_id}:${e.sequence}`;return Zo(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:zo(e.payload),concurrency_key:e.concurrency_key})}function mx(t,e){return Zo(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:zo(e.payload),concurrency_key:e.concurrency_key})}function zo(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function Zo(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=Yo({workflow:o,job:i,project:n});return t.enqueueJob({...e,concurrency_key:a.concurrency_key})}catch{return t.enqueueJob(e)}}var fc=E(()=>{"use strict";zr();uc()});async function _h(t){let e=t.dal.listProjectWorkflows(t.project.id,{enabled_only:!0});if(e.length===0)return hh(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 px(o.condition,r))continue;let i=`${t.issue.url}#workflow:${o.workflow_id}`,a={issue:t.issue,...hx(o.parameters_override)},l=hh(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 hh(t,e,r,n,s,o,i){let a=t.findJobBySourceAndDedupe("gh_issue",n);return{jobs:[dc(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 px(t,e){if(t===null||t.trim().length===0)return!0;try{return await wr(t,e)===!0}catch{return!1}}function hx(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 gh=E(()=>{"use strict";Gr();fc()});import{spawnSync as _x}from"node:child_process";async function pc(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=_x(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(!wx(o))throw new Error("gh issue list returned unexpected JSON shape");let i=0;for(let a of o){let l=await _h({dal:t.dal,project:t.project,issue:yx(a)});i+=l.new_jobs}return{scanned:o.length,new_jobs:i}}async function Zr(t){if(process.env.LMCTL_INTAKE_DISABLED==="1")return[];let e=[];for(let r of t.listProjectsWithIntakeEnabled()){let n=gx(r.intake_config);try{let s=await pc({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 gx(t){if(t===null)return{};try{let e=JSON.parse(t);if(!mc(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 wx(t){return Array.isArray(t)&&t.every(e=>{if(!mc(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:mc(n)&&typeof n.name=="string"))})}function yx(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 mc(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var Qo=E(()=>{"use strict";gh()});function yh(t){return async e=>bx(t.app,e,t.log!==void 0?{log:t.log}:{})}async function bx(t,e,r={}){let n=Tx(e.path),s={"content-type":"application/json",...e.headers??{},[ei]:hc},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 Sx(l);if(r.log!==void 0){let u=Date.now()-a;r.log(`[mailbox-dispatch] ${e.method} ${wh(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} ${wh(e.path)} \u2192 ERR (${c}ms)`)}throw l}}function wh(t){let e=t.startsWith("/")?t:`/${t}`,r=e.search(/[?#]/);return r===-1?e:e.slice(0,r)}function Tx(t){let e=t.startsWith("/")?t:`/${t}`;return`${Ex}${e}`}async function Sx(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()!==ei&&(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 ei,hc,Ex,_c=E(()=>{"use strict";ei="x-mailbox-channel",hc="1",Ex="http://mailbox.local"});import{createHash as Eh,createHmac as kx,timingSafeEqual as vx}from"node:crypto";function bh(){return async(t,e)=>{let r=Th();if(r===null||jx(t.req.path)){await e();return}if(t.req.path.startsWith("/mailbox/")&&t.req.header(ei)===hc){await e();return}let n=t.req.query("token");if(n!==void 0&&ti(n,r)){wc(t,r),await e();return}if(xx(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 Th(){let t=process.env.LMCTL_API_TOKEN;return t&&t.length>0?t:null}function Sh(t){let e=Th();return e!==null&&ti(t,e)}function wc(t,e,r=new Date){t.header("Set-Cookie",`${gc}=${$x(e,r)}; Path=/; HttpOnly; SameSite=Lax`)}function kh(t){t.header("Set-Cookie",`${gc}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`)}function $x(t,e=new Date){let n=`auth=ok|${new Date(e.getTime()+Ix*24*60*60*1e3).toISOString()}`;return Buffer.from(`${n}|${vh(t,n)}`,"utf8").toString("base64url")}function Nx(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:ti(s[2],vh(e,`${s[0]}|${s[1]}`))}function ti(t,e){return vx(Eh("sha256").update(t).digest(),Eh("sha256").update(e).digest())}function xx(t,e){let r=/^Bearer\s+(.+)$/i.exec(t.req.header("authorization")??"")?.[1];if(r!==void 0&&ti(r,e))return!0;let n=Ax(t.req.header("cookie")??"")[gc];return n!==void 0&&Nx(n,e)}function jx(t){return t==="/login"||t==="/logout"}function Ax(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 vh(t,e){return kx("sha256",t).update(e).digest("hex")}var gc,Ix,Ih=E(()=>{"use strict";_c();gc="lmctl_next_session",Ix=30});import{existsSync as Qr,mkdirSync as Rx,readdirSync as Ox,readFileSync as ri,unlinkSync as Lx,writeFileSync as bc}from"node:fs";import{join as yr}from"node:path";function Ke(t){if(!Cx.test(t))throw new Error(`invalid memory name "${t}": only alphanumeric characters, underscores, and hyphens are allowed`)}function Nh(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 Fx(a)?{name:t,type:a,description:i?.[1]?.trim()??null,body:s,created_at:$h,updated_at:$h}:null}function Mx(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"&&nx()&&sx(t)){let r;try{r=uh(t)}catch(s){throw s instanceof Yr?new Nt(s.issues.map(o=>({path:`dsl:${o.line}`,message:o.message}))):s}let n=dt.safeParse(r);if(!n.success)throw new Nt(n.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));return n.data}let e=Ko(ix(t));if(ax(e)&&e.definition_schema_version===3){let r=dt.safeParse(e);if(!r.success)throw new Nt(r.error.issues.map(n=>({path:n.path.length===0?"$":n.path.map(String).join("."),message:n.message})));return r.data}return ox(e)}function ox(t){let e=Go.safeParse(t);if(!e.success)throw new Nt(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 Nt([{path:`states.${s}`,message:`v2 workflows (primitive_version: 2) may not use v1 primitive type: ${o.type}`}]);try{return rh(r)}catch(s){throw s instanceof $t?new uc(s):s}}function ix(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
1391
+ `)||e.startsWith("{")||e.startsWith("[")?mh(t):e.endsWith(".json")?mh(rx(e,"utf8")):t}function mh(t){return JSON.parse(t)}function ax(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var uc,Nt,zr=E(()=>{"use strict";Vr();sh();cc();Kr();fh();uc=class extends Error{causeError;constructor(e){super("compiler emitted invalid atomic workflow"),this.causeError=e,this.name="CompilerInvariantError"}},Nt=class extends Error{issues;constructor(e){super("compound workflow validation failed"),this.issues=e,this.name="CompilerValidationError"}}});function Yo(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:lx(r,{job:{id:t.job.id,kind:t.job.source,source:t.job.source,source_ref:t.job.source_ref,payload:ux(t.job.payload)},project:t.project===null?null:{id:t.project.id,name:t.project.name}}),concurrent_limit:e}}function lx(t,e){return t.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(r,n)=>{let s=cx(e,n.trim());return s==null?"":typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):JSON.stringify(s)})}function cx(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 ux(t){if(t===null||t.trim().length===0)return null;try{return JSON.parse(t)}catch{return t}}var dc=E(()=>{"use strict"});var ph={};ie(ph,{enqueueFromAgentOutput:()=>fx,enqueueFromGitHubIssue:()=>fc,enqueueManual:()=>dx,enqueueScheduled:()=>mx});function fc(t,e){return Zo(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:zo(e.payload),concurrency_key:e.concurrency_key,priority:e.priority})}function dx(t,e){return Zo(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:zo(e.payload),concurrency_key:e.concurrency_key})}function fx(t,e){let r=e.sequence===void 0?`run:${e.parent_run_id}`:`run:${e.parent_run_id}:${e.sequence}`;return Zo(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:zo(e.payload),concurrency_key:e.concurrency_key})}function mx(t,e){return Zo(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:zo(e.payload),concurrency_key:e.concurrency_key})}function zo(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function Zo(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=Yo({workflow:o,job:i,project:n});return t.enqueueJob({...e,concurrency_key:a.concurrency_key})}catch{return t.enqueueJob(e)}}var mc=E(()=>{"use strict";zr();dc()});async function _h(t){let e=t.dal.listProjectWorkflows(t.project.id,{enabled_only:!0});if(e.length===0)return hh(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 px(o.condition,r))continue;let i=`${t.issue.url}#workflow:${o.workflow_id}`,a={issue:t.issue,...hx(o.parameters_override)},l=hh(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 hh(t,e,r,n,s,o,i){let a=t.findJobBySourceAndDedupe("gh_issue",n);return{jobs:[fc(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 px(t,e){if(t===null||t.trim().length===0)return!0;try{return await wr(t,e)===!0}catch{return!1}}function hx(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 gh=E(()=>{"use strict";Gr();mc()});import{spawnSync as _x}from"node:child_process";async function hc(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=_x(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(!wx(o))throw new Error("gh issue list returned unexpected JSON shape");let i=0;for(let a of o){let l=await _h({dal:t.dal,project:t.project,issue:yx(a)});i+=l.new_jobs}return{scanned:o.length,new_jobs:i}}async function Zr(t){if(process.env.LMCTL_INTAKE_DISABLED==="1")return[];let e=[];for(let r of t.listProjectsWithIntakeEnabled()){let n=gx(r.intake_config);try{let s=await hc({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 gx(t){if(t===null)return{};try{let e=JSON.parse(t);if(!pc(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 wx(t){return Array.isArray(t)&&t.every(e=>{if(!pc(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:pc(n)&&typeof n.name=="string"))})}function yx(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 pc(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var Qo=E(()=>{"use strict";gh()});function yh(t){return async e=>bx(t.app,e,t.log!==void 0?{log:t.log}:{})}async function bx(t,e,r={}){let n=Tx(e.path),s={"content-type":"application/json",...e.headers??{},[ei]:_c},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 Sx(l);if(r.log!==void 0){let u=Date.now()-a;r.log(`[mailbox-dispatch] ${e.method} ${wh(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} ${wh(e.path)} \u2192 ERR (${c}ms)`)}throw l}}function wh(t){let e=t.startsWith("/")?t:`/${t}`,r=e.search(/[?#]/);return r===-1?e:e.slice(0,r)}function Tx(t){let e=t.startsWith("/")?t:`/${t}`;return`${Ex}${e}`}async function Sx(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()!==ei&&(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 ei,_c,Ex,gc=E(()=>{"use strict";ei="x-mailbox-channel",_c="1",Ex="http://mailbox.local"});import{createHash as Eh,createHmac as kx,timingSafeEqual as vx}from"node:crypto";function bh(){return async(t,e)=>{let r=Th();if(r===null||jx(t.req.path)){await e();return}if(t.req.path.startsWith("/mailbox/")&&t.req.header(ei)===_c){await e();return}let n=t.req.query("token");if(n!==void 0&&ti(n,r)){yc(t,r),await e();return}if(xx(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 Th(){let t=process.env.LMCTL_API_TOKEN;return t&&t.length>0?t:null}function Sh(t){let e=Th();return e!==null&&ti(t,e)}function yc(t,e,r=new Date){t.header("Set-Cookie",`${wc}=${$x(e,r)}; Path=/; HttpOnly; SameSite=Lax`)}function kh(t){t.header("Set-Cookie",`${wc}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`)}function $x(t,e=new Date){let n=`auth=ok|${new Date(e.getTime()+Ix*24*60*60*1e3).toISOString()}`;return Buffer.from(`${n}|${vh(t,n)}`,"utf8").toString("base64url")}function Nx(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:ti(s[2],vh(e,`${s[0]}|${s[1]}`))}function ti(t,e){return vx(Eh("sha256").update(t).digest(),Eh("sha256").update(e).digest())}function xx(t,e){let r=/^Bearer\s+(.+)$/i.exec(t.req.header("authorization")??"")?.[1];if(r!==void 0&&ti(r,e))return!0;let n=Ax(t.req.header("cookie")??"")[wc];return n!==void 0&&Nx(n,e)}function jx(t){return t==="/login"||t==="/logout"}function Ax(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 vh(t,e){return kx("sha256",t).update(e).digest("hex")}var wc,Ix,Ih=E(()=>{"use strict";gc();wc="lmctl_next_session",Ix=30});import{existsSync as Qr,mkdirSync as Rx,readdirSync as Ox,readFileSync as ri,unlinkSync as Lx,writeFileSync as Tc}from"node:fs";import{join as yr}from"node:path";function Ke(t){if(!Cx.test(t))throw new Error(`invalid memory name "${t}": only alphanumeric characters, underscores, and hyphens are allowed`)}function Nh(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 Fx(a)?{name:t,type:a,description:i?.[1]?.trim()??null,body:s,created_at:$h,updated_at:$h}:null}function Mx(t,e,r,n){let s=r!==null?`
1392
1392
  description: ${r}`:"";return`---
1393
1393
  name: ${t}${s}
1394
1394
  type: ${e}
1395
1395
  ---
1396
- ${n}`}function Dx(t,e,r,n){let s=yr(t,Tc),o=`- [${e}.md](${e}.md)${n!==null?` \u2014 ${n}`:""} (${r})`,i=Qr(s)?ri(s,"utf8"):"",a=new RegExp(`^- \\[${xh(e)}\\.md\\].*$`,"m");a.test(i)?i=i.replace(a,o):i=i.length>0&&!i.endsWith(`
1396
+ ${n}`}function Dx(t,e,r,n){let s=yr(t,Sc),o=`- [${e}.md](${e}.md)${n!==null?` \u2014 ${n}`:""} (${r})`,i=Qr(s)?ri(s,"utf8"):"",a=new RegExp(`^- \\[${xh(e)}\\.md\\].*$`,"m");a.test(i)?i=i.replace(a,o):i=i.length>0&&!i.endsWith(`
1397
1397
  `)?`${i}
1398
1398
  ${o}
1399
1399
  `:`${i}${o}
1400
- `,bc(s,i,"utf8")}function Px(t,e){let r=yr(t,Tc);if(!Qr(r))return;let n=ri(r,"utf8"),s=new RegExp(`^- \\[${xh(e)}\\.md\\].*$\\r?\\n?`,"m");s.test(n)&&bc(r,n.replace(s,""),"utf8")}function xh(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Fx(t){return t==="user"||t==="feedback"||t==="project"||t==="reference"}function nt(t,e){return t.durable_memory_mode==="db"?new Ec(e,t.id):new yc(t.local_path)}var Cx,Tc,$h,yc,Ec,Sc=E(()=>{"use strict";Cx=/^[a-zA-Z0-9_-]+$/;Tc="MEMORY.md",$h="1970-01-01T00:00:00.000Z",yc=class{dir;constructor(e){this.dir=yr(e,"durable-memory")}read(e){Ke(e);let r=yr(this.dir,`${e}.md`);if(!Qr(r))return null;let n=ri(r,"utf8");return Nh(e,n)}write(e){Ke(e.name),Rx(this.dir,{recursive:!0});let r=yr(this.dir,`${e.name}.md`),n=!Qr(r),s=Mx(e.name,e.type,e.description??null,e.body);return bc(r,s,"utf8"),Dx(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){Ke(e);let r=yr(this.dir,`${e}.md`);return Qr(r)?(Lx(r),Px(this.dir,e),!0):!1}listFiles(){if(!Qr(this.dir))return[];let e=Ox(this.dir).filter(n=>n.endsWith(".md")&&n!==Tc),r=[];for(let n of e){let s=n.slice(0,-3),o=ri(yr(this.dir,n),"utf8"),i=Nh(s,o);i!==null&&r.push(i)}return r.sort((n,s)=>n.name.localeCompare(s.name))}};Ec=class{dal;projectId;constructor(e,r){this.dal=e,this.projectId=r}read(e){Ke(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){Ke(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 Ke(e),this.dal.deleteDurableMemory(this.projectId,e)}}});function Ah(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=nt(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=nt(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||!jh.has(a))return n.json({error:`invalid type: must be one of ${[...jh].join("|")}`},400);if(l===null)return n.json({error:"missing name"},400);if(c===null)return n.json({error:"missing body"},400);let d=nt(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=nt(o,r),a=n.req.query("type");return n.json(i.list(a))})}var jh,Rh=E(()=>{"use strict";Sc();jh=new Set(["user","feedback","project","reference"])});function Wx(t){let e=4294967295;for(let r=0;r<t.length;r+=1)e=(Ux[(e^t[r])&255]^e>>>8)>>>0;return(e^4294967295)>>>0}function Bx(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 Oh(t,e=new Date){let{time:r,date:n}=Bx(e),s=[],o=[],i=0,a=new TextEncoder;for(let h of t){let g=a.encode(h.name),_=Wx(h.data),T=h.data.length,S=new Uint8Array(30+g.length),I=new DataView(S.buffer);I.setUint32(0,67324752,!0),I.setUint16(4,20,!0),I.setUint16(6,0,!0),I.setUint16(8,0,!0),I.setUint16(10,r,!0),I.setUint16(12,n,!0),I.setUint32(14,_,!0),I.setUint32(18,T,!0),I.setUint32(22,T,!0),I.setUint16(26,g.length,!0),I.setUint16(28,0,!0),S.set(g,30),s.push(S,h.data);let v=new Uint8Array(46+g.length),k=new DataView(v.buffer);k.setUint32(0,33639248,!0),k.setUint16(4,20,!0),k.setUint16(6,20,!0),k.setUint16(8,0,!0),k.setUint16(10,0,!0),k.setUint16(12,r,!0),k.setUint16(14,n,!0),k.setUint32(16,_,!0),k.setUint32(20,T,!0),k.setUint32(24,T,!0),k.setUint16(28,g.length,!0),k.setUint16(30,0,!0),k.setUint16(32,0,!0),k.setUint16(34,0,!0),k.setUint16(36,0,!0),k.setUint32(38,0,!0),k.setUint32(42,i,!0),v.set(g,46),o.push(v),i+=S.length+h.data.length}let l=i,c=0;for(let h of o)c+=h.length;let u=new Uint8Array(22),d=new DataView(u.buffer);d.setUint32(0,101010256,!0),d.setUint16(4,0,!0),d.setUint16(6,0,!0),d.setUint16(8,t.length,!0),d.setUint16(10,t.length,!0),d.setUint32(12,c,!0),d.setUint32(16,l,!0),d.setUint16(20,0,!0);let f=l+c+u.length,m=new Uint8Array(f),p=0;for(let h of s)m.set(h,p),p+=h.length;for(let h of o)m.set(h,p),p+=h.length;return m.set(u,p),m}var Ux,Lh=E(()=>{"use strict";Ux=(()=>{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 oi,mkdirSync as qx,readdirSync as Hx,readFileSync as Dh,statSync as Jx,unlinkSync as Xx,writeFileSync as Gx}from"node:fs";import{join as qn}from"node:path";function Ph(t,e){let{dal:r}=e;t.post("/api/projects",async n=>{let s=await st(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 st(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 st(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 st(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 st(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=nt(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 st(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||!ni.includes(l))return A(n,`invalid type: must be one of ${ni.join("|")}`,400);try{Ke(i)}catch(d){return A(n,d.message,400)}let c=nt(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=nt(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 st(n);if(typeof i=="string")return A(n,i,400);let a=nt(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(!ni.includes(d))return A(n,`invalid type: must be one of ${ni.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=nt(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(Kx(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 st(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||!si.has(l))return A(n,`invalid type: must be one of ${[...si].join("|")}`,400);try{Ke(i)}catch(f){return A(n,f.message,400)}let c=Wn(s.local_path),u=qn(c,`${i}.md`);if(oi(u))return A(n,`chapter already exists: ${i}`,409);qx(c,{recursive:!0}),Mh(u,i,l,ae(o,"description"),a);let d=Bn(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{Ke(n.req.param("chapter"))}catch(i){return A(n,i.message,400)}let o=Bn(Wn(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{Ke(o)}catch(m){return A(n,m.message,400)}let i=Wn(s.local_path),a=Bn(i,o);if(a===null)return A(n,"chapter not found",404);let l=await st(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(!si.has(d))return A(n,`invalid type: must be one of ${[...si].join("|")}`,400);Mh(qn(i,`${o}.md`),o,d,u,c);let f=Bn(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{Ke(o)}catch(a){return A(n,a.message,400)}let i=qn(Wn(s.local_path),`${o}.md`);return oi(i)?(Xx(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 st(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(Ch))),t.post("/api/chat/sessions",async n=>{let s=await Vx(n);if(typeof s=="string")return A(n,s,400);let o=s!==null?ae(s,"title"):null,i=r.createChatbotSession(Ch,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 st(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=pr(r,s),a=[];for(let c of i){let u=zx(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=Dh(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=Oh(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 st(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 Vx(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 Wn(t){return qn(t,"ai-test")}function Bn(t,e){let r=qn(t,`${e}.md`);if(!oi(r))return null;let n=Dh(r,"utf8"),s=Yx(n),o=Jx(r).mtime.toISOString();return{name:e,type:s.type,description:s.description,body:s.body,updated_at:o}}function Kx(t){let e=Wn(t);return oi(e)?Hx(e).filter(r=>r.endsWith(".md")&&r!=="index.md").map(r=>r.slice(0,-3)).sort().map(r=>{let n=Bn(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 Mh(t,e,r,n,s){let o=n!==null&&n.length>0?`
1400
+ `,Tc(s,i,"utf8")}function Px(t,e){let r=yr(t,Sc);if(!Qr(r))return;let n=ri(r,"utf8"),s=new RegExp(`^- \\[${xh(e)}\\.md\\].*$\\r?\\n?`,"m");s.test(n)&&Tc(r,n.replace(s,""),"utf8")}function xh(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Fx(t){return t==="user"||t==="feedback"||t==="project"||t==="reference"}function nt(t,e){return t.durable_memory_mode==="db"?new bc(e,t.id):new Ec(t.local_path)}var Cx,Sc,$h,Ec,bc,kc=E(()=>{"use strict";Cx=/^[a-zA-Z0-9_-]+$/;Sc="MEMORY.md",$h="1970-01-01T00:00:00.000Z",Ec=class{dir;constructor(e){this.dir=yr(e,"durable-memory")}read(e){Ke(e);let r=yr(this.dir,`${e}.md`);if(!Qr(r))return null;let n=ri(r,"utf8");return Nh(e,n)}write(e){Ke(e.name),Rx(this.dir,{recursive:!0});let r=yr(this.dir,`${e.name}.md`),n=!Qr(r),s=Mx(e.name,e.type,e.description??null,e.body);return Tc(r,s,"utf8"),Dx(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){Ke(e);let r=yr(this.dir,`${e}.md`);return Qr(r)?(Lx(r),Px(this.dir,e),!0):!1}listFiles(){if(!Qr(this.dir))return[];let e=Ox(this.dir).filter(n=>n.endsWith(".md")&&n!==Sc),r=[];for(let n of e){let s=n.slice(0,-3),o=ri(yr(this.dir,n),"utf8"),i=Nh(s,o);i!==null&&r.push(i)}return r.sort((n,s)=>n.name.localeCompare(s.name))}};bc=class{dal;projectId;constructor(e,r){this.dal=e,this.projectId=r}read(e){Ke(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){Ke(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 Ke(e),this.dal.deleteDurableMemory(this.projectId,e)}}});function Ah(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=nt(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=nt(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||!jh.has(a))return n.json({error:`invalid type: must be one of ${[...jh].join("|")}`},400);if(l===null)return n.json({error:"missing name"},400);if(c===null)return n.json({error:"missing body"},400);let d=nt(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=nt(o,r),a=n.req.query("type");return n.json(i.list(a))})}var jh,Rh=E(()=>{"use strict";kc();jh=new Set(["user","feedback","project","reference"])});function Wx(t){let e=4294967295;for(let r=0;r<t.length;r+=1)e=(Ux[(e^t[r])&255]^e>>>8)>>>0;return(e^4294967295)>>>0}function Bx(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 Oh(t,e=new Date){let{time:r,date:n}=Bx(e),s=[],o=[],i=0,a=new TextEncoder;for(let h of t){let g=a.encode(h.name),_=Wx(h.data),T=h.data.length,S=new Uint8Array(30+g.length),I=new DataView(S.buffer);I.setUint32(0,67324752,!0),I.setUint16(4,20,!0),I.setUint16(6,0,!0),I.setUint16(8,0,!0),I.setUint16(10,r,!0),I.setUint16(12,n,!0),I.setUint32(14,_,!0),I.setUint32(18,T,!0),I.setUint32(22,T,!0),I.setUint16(26,g.length,!0),I.setUint16(28,0,!0),S.set(g,30),s.push(S,h.data);let v=new Uint8Array(46+g.length),k=new DataView(v.buffer);k.setUint32(0,33639248,!0),k.setUint16(4,20,!0),k.setUint16(6,20,!0),k.setUint16(8,0,!0),k.setUint16(10,0,!0),k.setUint16(12,r,!0),k.setUint16(14,n,!0),k.setUint32(16,_,!0),k.setUint32(20,T,!0),k.setUint32(24,T,!0),k.setUint16(28,g.length,!0),k.setUint16(30,0,!0),k.setUint16(32,0,!0),k.setUint16(34,0,!0),k.setUint16(36,0,!0),k.setUint32(38,0,!0),k.setUint32(42,i,!0),v.set(g,46),o.push(v),i+=S.length+h.data.length}let l=i,c=0;for(let h of o)c+=h.length;let u=new Uint8Array(22),d=new DataView(u.buffer);d.setUint32(0,101010256,!0),d.setUint16(4,0,!0),d.setUint16(6,0,!0),d.setUint16(8,t.length,!0),d.setUint16(10,t.length,!0),d.setUint32(12,c,!0),d.setUint32(16,l,!0),d.setUint16(20,0,!0);let f=l+c+u.length,m=new Uint8Array(f),p=0;for(let h of s)m.set(h,p),p+=h.length;for(let h of o)m.set(h,p),p+=h.length;return m.set(u,p),m}var Ux,Lh=E(()=>{"use strict";Ux=(()=>{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 oi,mkdirSync as qx,readdirSync as Hx,readFileSync as Dh,statSync as Jx,unlinkSync as Xx,writeFileSync as Gx}from"node:fs";import{join as qn}from"node:path";function Ph(t,e){let{dal:r}=e;t.post("/api/projects",async n=>{let s=await st(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 st(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 st(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 st(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 st(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=nt(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 st(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||!ni.includes(l))return A(n,`invalid type: must be one of ${ni.join("|")}`,400);try{Ke(i)}catch(d){return A(n,d.message,400)}let c=nt(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=nt(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 st(n);if(typeof i=="string")return A(n,i,400);let a=nt(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(!ni.includes(d))return A(n,`invalid type: must be one of ${ni.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=nt(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(Kx(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 st(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||!si.has(l))return A(n,`invalid type: must be one of ${[...si].join("|")}`,400);try{Ke(i)}catch(f){return A(n,f.message,400)}let c=Wn(s.local_path),u=qn(c,`${i}.md`);if(oi(u))return A(n,`chapter already exists: ${i}`,409);qx(c,{recursive:!0}),Mh(u,i,l,ae(o,"description"),a);let d=Bn(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{Ke(n.req.param("chapter"))}catch(i){return A(n,i.message,400)}let o=Bn(Wn(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{Ke(o)}catch(m){return A(n,m.message,400)}let i=Wn(s.local_path),a=Bn(i,o);if(a===null)return A(n,"chapter not found",404);let l=await st(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(!si.has(d))return A(n,`invalid type: must be one of ${[...si].join("|")}`,400);Mh(qn(i,`${o}.md`),o,d,u,c);let f=Bn(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{Ke(o)}catch(a){return A(n,a.message,400)}let i=qn(Wn(s.local_path),`${o}.md`);return oi(i)?(Xx(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 st(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(Ch))),t.post("/api/chat/sessions",async n=>{let s=await Vx(n);if(typeof s=="string")return A(n,s,400);let o=s!==null?ae(s,"title"):null,i=r.createChatbotSession(Ch,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 st(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=hr(r,s),a=[];for(let c of i){let u=zx(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=Dh(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=Oh(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 st(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 Vx(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 Wn(t){return qn(t,"ai-test")}function Bn(t,e){let r=qn(t,`${e}.md`);if(!oi(r))return null;let n=Dh(r,"utf8"),s=Yx(n),o=Jx(r).mtime.toISOString();return{name:e,type:s.type,description:s.description,body:s.body,updated_at:o}}function Kx(t){let e=Wn(t);return oi(e)?Hx(e).filter(r=>r.endsWith(".md")&&r!=="index.md").map(r=>r.slice(0,-3)).sort().map(r=>{let n=Bn(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 Mh(t,e,r,n,s){let o=n!==null&&n.length>0?`
1401
1401
  description: ${n}`:"",i=`---
1402
1402
  name: ${e}${o}
1403
1403
  type: ${r}
1404
1404
  ---
1405
- ${s}`;Gx(t,i,"utf8")}function Yx(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 zx(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?Zx(t.path):Qx(t.kind);return`step-${t.step_id}-${e}/${t.id}-${r}${n}`}function Zx(t){let e=t.lastIndexOf(".");if(e<0)return"";let r=t.slice(e);return/^\.[A-Za-z0-9]+$/.test(r)?r:""}function Qx(t){return t.endsWith("_md")||t.includes("markdown")?".md":t.endsWith("_json")||t.includes("json")?".json":".txt"}var ni,si,Ch,Fh=E(()=>{"use strict";vt();Lh();Sc();ni=["user","feedback","project","reference"],si=new Set(["smoke","integration","vision","scenario","regression"]),Ch="operator"});function $e(t,e){return`<!doctype html>
1405
+ ${s}`;Gx(t,i,"utf8")}function Yx(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 zx(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?Zx(t.path):Qx(t.kind);return`step-${t.step_id}-${e}/${t.id}-${r}${n}`}function Zx(t){let e=t.lastIndexOf(".");if(e<0)return"";let r=t.slice(e);return/^\.[A-Za-z0-9]+$/.test(r)?r:""}function Qx(t){return t.endsWith("_md")||t.includes("markdown")?".md":t.endsWith("_json")||t.includes("json")?".json":".txt"}var ni,si,Ch,Fh=E(()=>{"use strict";vt();Lh();kc();ni=["user","feedback","project","reference"],si=new Set(["smoke","integration","vision","scenario","regression"]),Ch="operator"});function $e(t,e){return`<!doctype html>
1406
1406
  <html lang="en">
1407
1407
  <head>
1408
1408
  <meta charset="utf-8">
@@ -1463,46 +1463,46 @@ ${s}`;Gx(t,i,"utf8")}function Yx(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r
1463
1463
  </nav>
1464
1464
  <main>${e}</main>
1465
1465
  </body>
1466
- </html>`}function b(t){return String(t??"").replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&#39;")}function ue(t,e){let r=t.map(s=>`<th>${b(s)}</th>`).join(""),n=e.length===0?`<tr><td colspan="${t.length}"><span class="muted">(empty)</span></td></tr>`:e.map(s=>`<tr>${s.map(o=>`<td>${o}</td>`).join("")}</tr>`).join("");return`<table><thead><tr>${r}</tr></thead><tbody>${n}</tbody></table>`}function le(t){return`<pre>${b(JSON.stringify(t,null,2))}</pre>`}var kc=E(()=>{"use strict"});function Uh(t,e){if(e.query(`SELECT sa.id FROM step_artifact sa
1466
+ </html>`}function b(t){return String(t??"").replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&#39;")}function ue(t,e){let r=t.map(s=>`<th>${b(s)}</th>`).join(""),n=e.length===0?`<tr><td colspan="${t.length}"><span class="muted">(empty)</span></td></tr>`:e.map(s=>`<tr>${s.map(o=>`<td>${o}</td>`).join("")}</tr>`).join("");return`<table><thead><tr>${r}</tr></thead><tbody>${n}</tbody></table>`}function le(t){return`<pre>${b(JSON.stringify(t,null,2))}</pre>`}var vc=E(()=>{"use strict"});function Uh(t,e){if(e.query(`SELECT sa.id FROM step_artifact sa
1467
1467
  JOIN step s ON s.id = sa.step_id
1468
1468
  WHERE s.run_id = ? AND sa.kind = 'run_report' LIMIT 1`,t).length>0)return;let n=e.getRun(t);if(n===null)return;let s=e.query("SELECT id FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",t);if(s.length===0)return;let o=s[0].id,i=e.query("SELECT id, state_name, outcome, started_at, ended_at FROM step WHERE run_id = ? ORDER BY id ASC",t),a=e.query(`SELECT sa.id, sa.step_id, sa.kind FROM step_artifact sa
1469
1469
  JOIN step s ON s.id = sa.step_id
1470
1470
  WHERE s.run_id = ? ORDER BY sa.id ASC`,t),l=new Map;for(let x of a){let H=l.get(x.step_id)??[];H.push({kind:x.kind,id:x.id}),l.set(x.step_id,H)}let c=i.map(x=>({id:x.id,state_name:x.state_name,outcome:x.outcome,duration_ms:x.started_at!==null&&x.ended_at!==null?Math.max(0,new Date(x.ended_at).getTime()-new Date(x.started_at).getTime()):null,artifacts:l.get(x.id)??[]})),u=e.query("SELECT kind, COUNT(*) AS count FROM session_event WHERE run_id = ? GROUP BY kind",t),d=e.query("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'tool_result' AND payload_truncated = 0",t),f=0;for(let x of d)try{let H=JSON.parse(x.payload);typeof H.elapsedMs=="number"&&H.elapsedMs>0&&(f+=H.elapsedMs)}catch{}let m=u.map(x=>({kind:x.kind,count:x.count,total_elapsed_ms:x.kind==="tool_result"?f:0})),p=c.filter(x=>x.outcome==="request_changes"),h=[...new Set(p.map(x=>x.state_name))],g=new Date(n.started_at).getTime(),_=n.ended_at!==null?new Date(n.ended_at).getTime():Date.now(),S=e.query("SELECT project_id FROM job WHERE id = ?",n.job_id)[0]?.project_id??null,I=S!==null?e.query(`SELECT id, signal_kind, severity, description, detected_at FROM drift_signal
1471
1471
  WHERE project_id = ? AND detected_at >= ? AND detected_at <= ? ORDER BY detected_at ASC`,S,g,_):[],k=e.query(`SELECT SUM(input_tokens) AS input, SUM(output_tokens) AS output
1472
- FROM session_size WHERE observed_at >= ? AND observed_at <= ?`,n.started_at,n.ended_at??new Date().toISOString())[0],R=k?.input!==null&&k?.input!==void 0?`input: ${k.input}, output: ${k.output??0}`:"n/a",L=e.getWorkflow(n.workflow_id),B=n.started_at!==null&&n.ended_at!==null?Math.max(0,new Date(n.ended_at).getTime()-new Date(n.started_at).getTime()):null,ee={run_id:t,workflow_name:L?.name??null,started_at:n.started_at,ended_at:n.ended_at,terminal_state:n.terminal_state,duration_ms:B,steps:c,tool_stats:m,reviewer_interventions:{count:p.length,state_names:h},drift_signals:I,token_totals:R};e.insertStepArtifact({step_id:o,kind:"run_report",content:JSON.stringify(ee)})}var Wh=E(()=>{"use strict"});import{spawnSync as qh}from"node:child_process";function vc(t){return ej[t]??`no install hint; ensure '${t}' is on PATH`}function tj(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 Bh(t){return qh("which",[t],{encoding:"utf8"}).status===0}function Hh(t){if(t===void 0)return null;for(let e of t.tools??[])if(!Bh(e)){let r=vc(e);return{kind:"missing_tool",tool:e,install_hint:r,message:`missing dependency: ${e}; ${r}`}}for(let e of t.auth??[]){if(!Bh(e)){let s=vc(e);return{kind:"missing_tool",tool:e,install_hint:s,message:`missing dependency: ${e}; ${s}`}}let r=tj(e);if(r===null)continue;let n=qh(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:vc(e),message:`${e} not authenticated; run \`${e} login\` or equivalent`,detail:s.length>0?s:void 0}}}return null}var ej,Jh=E(()=>{"use strict";ej={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 rj,readdirSync as nj,readFileSync as sj}from"node:fs";import{join as Xh}from"node:path";function oj(t){let e=t.match(/^---\n([\s\S]*?)\n---/);if(!e)return[];let r=e[1],n=r.match(/^tags:\s*\[([^\]]*)\]/m);if(n)return n[1].split(",").map(o=>o.trim()).filter(Boolean);let s=r.match(/^tags:\s*\n((?:\s*-\s+.+\n?)*)/m);return s?s[1].split(`
1473
- `).map(o=>o.replace(/^\s*-\s+/,"").trim()).filter(Boolean):[]}function Gh(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 Vh(t,e){if(e.length===0)return null;let r=Xh(t,"durable-memory");if(!rj(r))return null;let n;try{n=nj(r).filter(o=>o.endsWith(".md")&&o!=="index.md")}catch{return null}let s=[];for(let o of n)try{let i=sj(Xh(r,o),"utf8");if(oj(i).some(l=>e.includes(l))){let l=Gh(i,"name")??o.replace(".md",""),c=Gh(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 Kh=E(()=>{"use strict"});function Nc(t){let e=t.trim().replace(ij,"").trim();for(let r=0;r<4;r+=1){let n=aj.exec(e);if(n===null)break;e=n[2].trim()}return e}function Yh(t){let e=t.trim(),r=lj.exec(e);if(r!==null)return r[2];let n=cj.exec(e);return n!==null?n[0]:null}function Hn(t,e){let r=t.split(`
1474
- `),n=null,s=-1;for(let i=0;i<r.length;i+=1){let a=Nc(r[i]),l=Ic.exec(a);if(l===null)continue;let c=l[1].trim();if($c.test(c))continue;let u=Yh(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=Nc(r[i]),l=Ic.exec(a);if(l===null)break;let c=$c.exec(l[1].trim());if(c===null)break;o[c[1]]=c[2].trim()}return{outcome:n,evidence:o}}function zh(t){let e=t.split(`
1475
- `),r=null;for(let n=0;n<e.length;n+=1){let s=Nc(e[n]),o=Ic.exec(s);if(o===null)continue;let i=o[1].trim();if($c.test(i))continue;let a=Yh(i);if(a===null||!xr(a))continue;let c=i.slice(i.indexOf(a)+a.length).replace(/^[`*_:\s\-–—]+/,"").trim();r={token:a,reason:c}}return r}var ij,aj,Ic,$c,lj,cj,xc=E(()=>{"use strict";yn();ij=/^#{1,6}\s+/,aj=/^(```|\*\*|__|`|\*|_)([\s\S]+?)\1$/,Ic=/^STANCE:\s+(.+)$/,$c=/^([A-Z][A-Z0-9_]*):\s*(.+)$/,lj=/^(```|\*\*|__|`|\*|_)([A-Za-z0-9_-]+)\1/,cj=/^[A-Za-z0-9_-]+/});function Zh(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 Qh=E(()=>{"use strict"});import{readFileSync as uj}from"node:fs";import{dirname as dj,join as fj}from"node:path";import{fileURLToPath as mj}from"node:url";function _j(t){return t.rules.map(e=>({command:e.command,subcommands:e.argv_patterns.map(r=>r.trim().split(/\s+/)),kind:e.kind}))}function Ej(t){let e=[],r=[];for(let n of t)pj.has(n)?(r.length>0&&e.push(r),r=[]):r.push(n);return r.length>0&&e.push(r),e}function bj(t,e){if(t.length===0)return{matched:!1};let r=0;for(;r<t.length&&hj.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 Tj(t,e){if(t.length===0)return{matched:!1};let r=Ej(t);for(let n of r){let s=bj(n,e);if(s.matched)return s}return{matched:!1}}function jc(t){return Tj(t,yj)}function Sj(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 Ac(t){return Sj(t).split(" ").filter(e=>e.length>0)}var pj,hj,gj,wj,yj,e_=E(()=>{"use strict";pj=new Set(["&&","||",";","|",">",">>","<","<<"]),hj=/^[A-Za-z_][A-Za-z0-9_]*=/;gj=dj(mj(import.meta.url)),wj=JSON.parse(uj(fj(gj,"side_effect_classifier.json"),"utf-8")),yj=_j(wj)});function ii(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 t_(t,e){try{return await wr(Rc(t)??t,ii(e))===!0}catch{return!1}}async function ai(t,e){try{return await wr(Rc(t)??t,ii(e))}catch{return}}async function r_(t,e){if(typeof t!="string")return t;let r=Rc(t);if(r===null)return t;try{return await wr(r,ii(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+=kj(await wr(a,ii(e)))}catch{n+=""}s=i+o[0].length}return n+=t.slice(s),n}function Rc(t){let e=t.trim();return!e.startsWith("={{")||!e.endsWith("}}")?null:e.slice(3,-2).trim()}function kj(t){return t==null?"":typeof t=="string"?t:JSON.stringify(t)}var Jn=E(()=>{"use strict";Gr()});import{existsSync as s_,readdirSync as o_,readFileSync as vj,statSync as i_}from"node:fs";import{join as ci}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 Ye(t,e,r,n,s={}){let o=D(),i=X(t,{run_id:t.run_id,state_name:e.name});t.steps_executed+=1,t.dal.finishStep(i.id,null,`escalation:${n}`.slice(0,480)),t.dal.setRunPausedState(t.run_id,`${Xn}${e.id}`,o);let a=t.dal.getRun(t.run_id),l=xr(r)?"generic":"unhandled";return t.dal.raiseAttention({kind:Os,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:Ij(s.agent_output??n),paused_at:o,created_at:o})}),t.dal.pauseJob(t.job.id),{kind:"paused"}}function Ij(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 l_(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=Gt(t.job.payload)?.[n];if(Array.isArray(o)&&o.every(i=>typeof i=="string"))return o}return null}async function Be(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=Gt(e.job.payload);return i===null?"":JSON.stringify(i)}if(o.startsWith("job_payload.")){let i=o.slice(12),l=Gt(e.job.payload)?.[i];return l==null?"":String(l)}if(o.startsWith("outcomes.")){let i=$j(e.outcomes,o.slice(9));return i==null?"":typeof i=="string"?i:JSON.stringify(i)}return""});return n_(n,e)}function $j(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 Gt(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 Gn(t){let{context:e,stateId:r,member:n,prompt:s,stepId:o,timeoutMs:i,writesToProjectPath:a}=t,l=Zh(e.dal,e.run_id,()=>o),c=Oc(e,r),u={violation:null},d=T=>{if(l(T),u.violation===null&&T.kind==="tool_use"&&T.tool==="Bash"&&T.summary){let S=Ac(T.summary),I=jc(S);I.matched&&!c&&(u.violation={summary:T.summary,kind:I.kind})}},f=new Date(Date.now()-1),m=0,p=0,h=T=>{d(T),Nj(T,(S,I)=>{m+=S,p+=I})},g=await Dr({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})}),xj(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&&Lc(e.project.local_path,f)?{kind:"g2_violation"}:{kind:"ok",text:g.text,ms:g.ms,argv:g.argv}}function Nj(t,e){let r=t.raw;if(r==null)return;let s=r.message?.usage;if(s!==void 0){let i=li(s.input_tokens),a=li(s.output_tokens);(i>0||a>0)&&e(i,a);return}let o=r.usage;if(o!==void 0){let i=li(o.input_tokens),a=li(o.output_tokens);(i>0||a>0)&&e(i,a)}}function li(t){return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:0}async function xt(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 Gn({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 en(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(ff(s)),l!=null&&l.length>0&&d.push(l);let f=r.prompt_template!==void 0?await Be(r.prompt_template,t,e):"";f.length>0&&d.push(f),n!==null&&n.length>0&&d.push(n);let m=d.join(`
1472
+ FROM session_size WHERE observed_at >= ? AND observed_at <= ?`,n.started_at,n.ended_at??new Date().toISOString())[0],R=k?.input!==null&&k?.input!==void 0?`input: ${k.input}, output: ${k.output??0}`:"n/a",L=e.getWorkflow(n.workflow_id),B=n.started_at!==null&&n.ended_at!==null?Math.max(0,new Date(n.ended_at).getTime()-new Date(n.started_at).getTime()):null,ee={run_id:t,workflow_name:L?.name??null,started_at:n.started_at,ended_at:n.ended_at,terminal_state:n.terminal_state,duration_ms:B,steps:c,tool_stats:m,reviewer_interventions:{count:p.length,state_names:h},drift_signals:I,token_totals:R};e.insertStepArtifact({step_id:o,kind:"run_report",content:JSON.stringify(ee)})}var Wh=E(()=>{"use strict"});import{spawnSync as qh}from"node:child_process";function Ic(t){return ej[t]??`no install hint; ensure '${t}' is on PATH`}function tj(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 Bh(t){return qh("which",[t],{encoding:"utf8"}).status===0}function Hh(t){if(t===void 0)return null;for(let e of t.tools??[])if(!Bh(e)){let r=Ic(e);return{kind:"missing_tool",tool:e,install_hint:r,message:`missing dependency: ${e}; ${r}`}}for(let e of t.auth??[]){if(!Bh(e)){let s=Ic(e);return{kind:"missing_tool",tool:e,install_hint:s,message:`missing dependency: ${e}; ${s}`}}let r=tj(e);if(r===null)continue;let n=qh(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:Ic(e),message:`${e} not authenticated; run \`${e} login\` or equivalent`,detail:s.length>0?s:void 0}}}return null}var ej,Jh=E(()=>{"use strict";ej={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 rj,readdirSync as nj,readFileSync as sj}from"node:fs";import{join as Xh}from"node:path";function oj(t){let e=t.match(/^---\n([\s\S]*?)\n---/);if(!e)return[];let r=e[1],n=r.match(/^tags:\s*\[([^\]]*)\]/m);if(n)return n[1].split(",").map(o=>o.trim()).filter(Boolean);let s=r.match(/^tags:\s*\n((?:\s*-\s+.+\n?)*)/m);return s?s[1].split(`
1473
+ `).map(o=>o.replace(/^\s*-\s+/,"").trim()).filter(Boolean):[]}function Gh(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 Vh(t,e){if(e.length===0)return null;let r=Xh(t,"durable-memory");if(!rj(r))return null;let n;try{n=nj(r).filter(o=>o.endsWith(".md")&&o!=="index.md")}catch{return null}let s=[];for(let o of n)try{let i=sj(Xh(r,o),"utf8");if(oj(i).some(l=>e.includes(l))){let l=Gh(i,"name")??o.replace(".md",""),c=Gh(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 Kh=E(()=>{"use strict"});function xc(t){let e=t.trim().replace(ij,"").trim();for(let r=0;r<4;r+=1){let n=aj.exec(e);if(n===null)break;e=n[2].trim()}return e}function Yh(t){let e=t.trim(),r=lj.exec(e);if(r!==null)return r[2];let n=cj.exec(e);return n!==null?n[0]:null}function Hn(t,e){let r=t.split(`
1474
+ `),n=null,s=-1;for(let i=0;i<r.length;i+=1){let a=xc(r[i]),l=$c.exec(a);if(l===null)continue;let c=l[1].trim();if(Nc.test(c))continue;let u=Yh(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=xc(r[i]),l=$c.exec(a);if(l===null)break;let c=Nc.exec(l[1].trim());if(c===null)break;o[c[1]]=c[2].trim()}return{outcome:n,evidence:o}}function zh(t){let e=t.split(`
1475
+ `),r=null;for(let n=0;n<e.length;n+=1){let s=xc(e[n]),o=$c.exec(s);if(o===null)continue;let i=o[1].trim();if(Nc.test(i))continue;let a=Yh(i);if(a===null||!xr(a))continue;let c=i.slice(i.indexOf(a)+a.length).replace(/^[`*_:\s\-–—]+/,"").trim();r={token:a,reason:c}}return r}var ij,aj,$c,Nc,lj,cj,jc=E(()=>{"use strict";yn();ij=/^#{1,6}\s+/,aj=/^(```|\*\*|__|`|\*|_)([\s\S]+?)\1$/,$c=/^STANCE:\s+(.+)$/,Nc=/^([A-Z][A-Z0-9_]*):\s*(.+)$/,lj=/^(```|\*\*|__|`|\*|_)([A-Za-z0-9_-]+)\1/,cj=/^[A-Za-z0-9_-]+/});function Zh(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 Qh=E(()=>{"use strict"});import{readFileSync as uj}from"node:fs";import{dirname as dj,join as fj}from"node:path";import{fileURLToPath as mj}from"node:url";function _j(t){return t.rules.map(e=>({command:e.command,subcommands:e.argv_patterns.map(r=>r.trim().split(/\s+/)),kind:e.kind}))}function Ej(t){let e=[],r=[];for(let n of t)pj.has(n)?(r.length>0&&e.push(r),r=[]):r.push(n);return r.length>0&&e.push(r),e}function bj(t,e){if(t.length===0)return{matched:!1};let r=0;for(;r<t.length&&hj.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 Tj(t,e){if(t.length===0)return{matched:!1};let r=Ej(t);for(let n of r){let s=bj(n,e);if(s.matched)return s}return{matched:!1}}function Ac(t){return Tj(t,yj)}function Sj(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 Rc(t){return Sj(t).split(" ").filter(e=>e.length>0)}var pj,hj,gj,wj,yj,e_=E(()=>{"use strict";pj=new Set(["&&","||",";","|",">",">>","<","<<"]),hj=/^[A-Za-z_][A-Za-z0-9_]*=/;gj=dj(mj(import.meta.url)),wj=JSON.parse(uj(fj(gj,"side_effect_classifier.json"),"utf-8")),yj=_j(wj)});function ii(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 t_(t,e){try{return await wr(Oc(t)??t,ii(e))===!0}catch{return!1}}async function ai(t,e){try{return await wr(Oc(t)??t,ii(e))}catch{return}}async function r_(t,e){if(typeof t!="string")return t;let r=Oc(t);if(r===null)return t;try{return await wr(r,ii(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+=kj(await wr(a,ii(e)))}catch{n+=""}s=i+o[0].length}return n+=t.slice(s),n}function Oc(t){let e=t.trim();return!e.startsWith("={{")||!e.endsWith("}}")?null:e.slice(3,-2).trim()}function kj(t){return t==null?"":typeof t=="string"?t:JSON.stringify(t)}var Jn=E(()=>{"use strict";Gr()});import{existsSync as s_,readdirSync as o_,readFileSync as vj,statSync as i_}from"node:fs";import{join as ci}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 Ye(t,e,r,n,s={}){let o=D(),i=X(t,{run_id:t.run_id,state_name:e.name});t.steps_executed+=1,t.dal.finishStep(i.id,null,`escalation:${n}`.slice(0,480)),t.dal.setRunPausedState(t.run_id,`${Xn}${e.id}`,o);let a=t.dal.getRun(t.run_id),l=xr(r)?"generic":"unhandled";return t.dal.raiseAttention({kind:Os,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:Ij(s.agent_output??n),paused_at:o,created_at:o})}),t.dal.pauseJob(t.job.id),{kind:"paused"}}function Ij(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 l_(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=Vt(t.job.payload)?.[n];if(Array.isArray(o)&&o.every(i=>typeof i=="string"))return o}return null}async function Be(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=Vt(e.job.payload);return i===null?"":JSON.stringify(i)}if(o.startsWith("job_payload.")){let i=o.slice(12),l=Vt(e.job.payload)?.[i];return l==null?"":String(l)}if(o.startsWith("outcomes.")){let i=$j(e.outcomes,o.slice(9));return i==null?"":typeof i=="string"?i:JSON.stringify(i)}return""});return n_(n,e)}function $j(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 Vt(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 Gn(t){let{context:e,stateId:r,member:n,prompt:s,stepId:o,timeoutMs:i,writesToProjectPath:a}=t,l=Zh(e.dal,e.run_id,()=>o),c=Lc(e,r),u={violation:null},d=T=>{if(l(T),u.violation===null&&T.kind==="tool_use"&&T.tool==="Bash"&&T.summary){let S=Rc(T.summary),I=Ac(S);I.matched&&!c&&(u.violation={summary:T.summary,kind:I.kind})}},f=new Date(Date.now()-1),m=0,p=0,h=T=>{d(T),Nj(T,(S,I)=>{m+=S,p+=I})},g=await Dr({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})}),xj(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&&Cc(e.project.local_path,f)?{kind:"g2_violation"}:{kind:"ok",text:g.text,ms:g.ms,argv:g.argv}}function Nj(t,e){let r=t.raw;if(r==null)return;let s=r.message?.usage;if(s!==void 0){let i=li(s.input_tokens),a=li(s.output_tokens);(i>0||a>0)&&e(i,a);return}let o=r.usage;if(o!==void 0){let i=li(o.input_tokens),a=li(o.output_tokens);(i>0||a>0)&&e(i,a)}}function li(t){return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:0}async function xt(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 Gn({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 en(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(ff(s)),l!=null&&l.length>0&&d.push(l);let f=r.prompt_template!==void 0?await Be(r.prompt_template,t,e):"";f.length>0&&d.push(f),n!==null&&n.length>0&&d.push(n);let m=d.join(`
1477
1477
 
1478
- `);try{let p=await Gn({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=Hn(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 tn(t,e){return(e?.length??0)>0?Vh(t.project.local_path,e):null}function c_(t){return jc(Ac(t))}function Oc(t,e){let r=t.dal.query(`SELECT state_name, outcome FROM step
1478
+ `);try{let p=await Gn({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=Hn(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 tn(t,e){return(e?.length??0)>0?Vh(t.project.local_path,e):null}function c_(t){return Ac(Rc(t))}function Lc(t,e){let r=t.dal.query(`SELECT state_name, outcome FROM step
1479
1479
  WHERE run_id = ? AND state_name != ? AND ended_at IS NOT NULL
1480
- ORDER BY started_at DESC, id DESC LIMIT 1`,t.run_id,e);if(r.length===0)return!1;let n=r[0];return t.workflow.states[n.state_name]?.type==="Interactive"&&n.outcome==="done"}function Lc(t,e){if(!s_(t))return!1;let r=ci(t,"durable-memory");function n(s){let o;try{o=o_(s,{withFileTypes:!0})}catch{return!1}for(let i of o){if(i.name===".git")continue;let a=ci(s,i.name);if(a!==r)if(i.isDirectory()){if(n(a))return!0}else try{if(i_(a).mtime>e)return!0}catch{}}return!1}return n(t)}function xj(t,e,r){let n=ci(t.local_path,"durable-memory");if(!s_(n))return;let s;try{s=o_(n)}catch{return}for(let o of s){if(!o.endsWith(".md")||o==="MEMORY.md")continue;let i=ci(n,o),a;try{a=i_(i).mtime}catch{continue}if(a<=r)continue;let l;try{l=vj(i,"utf8")}catch{continue}let c=Aj(l);if(c===null){process.stderr.write(`[durable-memory-sync] warning: ${o} has no valid frontmatter, skipping
1481
- `);continue}if(t.durable_memory_mode==="db")try{e.upsertDurableMemory({project_id:t.id,type:c.type,name:c.name,description:c.description,body:c.body})}catch{}}}function Aj(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||!jj.has(l)?null:{name:a,type:l,description:i?.[1]?.trim()??null,body:n}}var Xn,jj,Pe=E(()=>{"use strict";Me();Vr();Nn();Kh();xc();yn();Qh();e_();Jn();Xn="__paused__:";jj=new Set(["user","feedback","project","reference"])});import{spawnSync as u_}from"node:child_process";function Rj(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=u_("git",["diff","--quiet"],{cwd:o}).status!==0,a=u_("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,rc),{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 d_,f_=E(()=>{"use strict";Pe();d_={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=>Rj(t,t.state)}});async function Oj(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 t_(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 m_,p_=E(()=>{"use strict";Pe();Jn();m_={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=>Oj(t,t.state)}});async function Lj(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms,o=e.researchers??[],i=tn(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 en(t,h,m,`TOPIC: ${m.topic}`,[],!1,s,!1,i);g.text.length>0&&(a[p]=g.text)}));let l=a.map((m,p)=>m!==null?`# Research ${p+1}: ${o[p]?.topic??""}
1480
+ ORDER BY started_at DESC, id DESC LIMIT 1`,t.run_id,e);if(r.length===0)return!1;let n=r[0];return t.workflow.states[n.state_name]?.type==="Interactive"&&n.outcome==="done"}function Cc(t,e){if(!s_(t))return!1;let r=ci(t,"durable-memory");function n(s){let o;try{o=o_(s,{withFileTypes:!0})}catch{return!1}for(let i of o){if(i.name===".git")continue;let a=ci(s,i.name);if(a!==r)if(i.isDirectory()){if(n(a))return!0}else try{if(i_(a).mtime>e)return!0}catch{}}return!1}return n(t)}function xj(t,e,r){let n=ci(t.local_path,"durable-memory");if(!s_(n))return;let s;try{s=o_(n)}catch{return}for(let o of s){if(!o.endsWith(".md")||o==="MEMORY.md")continue;let i=ci(n,o),a;try{a=i_(i).mtime}catch{continue}if(a<=r)continue;let l;try{l=vj(i,"utf8")}catch{continue}let c=Aj(l);if(c===null){process.stderr.write(`[durable-memory-sync] warning: ${o} has no valid frontmatter, skipping
1481
+ `);continue}if(t.durable_memory_mode==="db")try{e.upsertDurableMemory({project_id:t.id,type:c.type,name:c.name,description:c.description,body:c.body})}catch{}}}function Aj(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||!jj.has(l)?null:{name:a,type:l,description:i?.[1]?.trim()??null,body:n}}var Xn,jj,Pe=E(()=>{"use strict";Me();Vr();Nn();Kh();jc();yn();Qh();e_();Jn();Xn="__paused__:";jj=new Set(["user","feedback","project","reference"])});import{spawnSync as u_}from"node:child_process";function Rj(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=u_("git",["diff","--quiet"],{cwd:o}).status!==0,a=u_("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,nc),{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 d_,f_=E(()=>{"use strict";Pe();d_={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=>Rj(t,t.state)}});async function Oj(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 t_(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 m_,p_=E(()=>{"use strict";Pe();Jn();m_={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=>Oj(t,t.state)}});async function Lj(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms,o=e.researchers??[],i=tn(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 en(t,h,m,`TOPIC: ${m.topic}`,[],!1,s,!1,i);g.text.length>0&&(a[p]=g.text)}));let l=a.map((m,p)=>m!==null?`# Research ${p+1}: ${o[p]?.topic??""}
1482
1482
  ${m}`:null).filter(m=>m!==null).join(`
1483
1483
 
1484
1484
  `),c=`${n}:consolidator`,u=await en(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 xt(t,n,m,e.write_back_durable_memory)}return V(t.workflow,e.outcomes.ok)}var h_,__=E(()=>{"use strict";Pe();h_={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=>Lj(t,t.state)}});async function Cj(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 ai(e.items_from,t),a=Fj(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 Dj(t,e,s.id,a,l):await Mj(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 Mj(t,e,r,n,s){let o=[];for(let i=0;i<n.length;i+=1){let a=await w_(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 Dj(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 w_(t,e,r,n[l],l,s)}});return await Promise.all(a),o}async function w_(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__":Pj(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 Pj(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function Fj(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 g_,y_=E(()=>{"use strict";Pe();Jn();g_={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=>Cj(t,t.state)}});async function Uj(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=tn(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 xt(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 Gn({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 xt(t,n,o,e.write_back_durable_memory),V(t.workflow,e.outcomes.done)):(E_({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 Be(e.agent.initial_prompt_template,t,n),d=i?`${i}
1485
1485
 
1486
- ${u}`:u;try{let f=await Gn({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 xt(t,n,o,e.write_back_durable_memory),V(t.workflow,e.outcomes.done)):(E_({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 E_(t){let{context:e,state:r,stateId:n,displayName:s,stepId:o,agentText:i}=t,a=D();e.dal.setRunPausedState(e.run_id,`${Xn}${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(Wj({context:e,stateId:s,state:r,stepId:o,agentText:i,pausedAt:a}))}),e.dal.pauseJob(e.job.id)}function Wj(t){let{context:e,stateId:r,state:n,stepId:s,agentText:o,pausedAt:i}=t,a=e.dal.getRun(e.run_id),l=Bj(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:qj(o,3),paused_at:i,created_run_inputs:Gt(e.job.payload)}}function Bj(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 qj(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 b_,T_=E(()=>{"use strict";Nn();Pe();b_={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=>Uj(t,t.state)}});async function Hj(t,e){let r=t.stateId,n=t.displayName,s=l_(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=Jj(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 Jj(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}var S_,k_=E(()=>{"use strict";Pe();S_={description:{displayName:"Loop",name:"loop",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],builtin:!0},execute:async t=>Hj(t,t.state)}});import{createHash as Xj}from"node:crypto";import{existsSync as Gj,mkdirSync as Vj,readFileSync as Kj,writeFileSync as Yj}from"node:fs";import{dirname as zj,isAbsolute as I_,normalize as Zj,resolve as Vn}from"node:path";import{Document as Qj,ExternalHyperlink as eA,HeadingLevel as rn,LevelFormat as tA,Packer as rA,Paragraph as ot,Table as nA,TableCell as sA,TableRow as oA,TextRun as it,WidthType as iA}from"docx";import{marked as aA}from"marked";async function lA(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 cA(t,e,n),i=await uA(t,e),a=await dA(t,e.title),l=await _A(o,a??t.workflow.name);if(l.length===0)throw new Error("rendered DOCX buffer was empty");return Vj(zj(i),{recursive:!0}),Yj(i,l),t.dal.insertStepArtifact({step_id:s.id,kind:"render_docx",path:i,sha:Xj("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 cA(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 Be(e.markdown_source,t,r)).trim(),o=(n.length===0?hA(t,e.markdown_source):null)??n;if(o.length===0)throw new Error("markdown_source resolved empty");let i=mA(t.project.local_path,o);if(i!==null){if(!Gj(i))throw new Error(`markdown_source file not found: ${i}`);return ui(Kj(i,"utf8"))}return ui(o)}async function uA(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let r=(await Be(e.output_path,t,t.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=fA(t.project.local_path,r);if(!n.endsWith(".docx"))throw new Error(`output_path must end with .docx: ${n}`);return n}async function dA(t,e){if(typeof e!="string"||e.trim().length===0)return null;let r=(await Be(e,t,t.stateId)).trim();return r.length===0?null:r}function fA(t,e){let r=Vn(t);return Zj(I_(e)?Vn(e):Vn(r,e))}function mA(t,e){return pA(e)?I_(e)?Vn(e):Vn(t,e):null}function pA(t){return t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function hA(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 ui(s);let o=t.dal.query(`SELECT sa.content
1486
+ ${u}`:u;try{let f=await Gn({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 xt(t,n,o,e.write_back_durable_memory),V(t.workflow,e.outcomes.done)):(E_({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 E_(t){let{context:e,state:r,stateId:n,displayName:s,stepId:o,agentText:i}=t,a=D();e.dal.setRunPausedState(e.run_id,`${Xn}${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(Wj({context:e,stateId:s,state:r,stepId:o,agentText:i,pausedAt:a}))}),e.dal.pauseJob(e.job.id)}function Wj(t){let{context:e,stateId:r,state:n,stepId:s,agentText:o,pausedAt:i}=t,a=e.dal.getRun(e.run_id),l=Bj(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:qj(o,3),paused_at:i,created_run_inputs:Vt(e.job.payload)}}function Bj(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 qj(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 b_,T_=E(()=>{"use strict";Nn();Pe();b_={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=>Uj(t,t.state)}});async function Hj(t,e){let r=t.stateId,n=t.displayName,s=l_(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=Jj(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 Jj(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}var S_,k_=E(()=>{"use strict";Pe();S_={description:{displayName:"Loop",name:"loop",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],builtin:!0},execute:async t=>Hj(t,t.state)}});import{createHash as Xj}from"node:crypto";import{existsSync as Gj,mkdirSync as Vj,readFileSync as Kj,writeFileSync as Yj}from"node:fs";import{dirname as zj,isAbsolute as I_,normalize as Zj,resolve as Vn}from"node:path";import{Document as Qj,ExternalHyperlink as eA,HeadingLevel as rn,LevelFormat as tA,Packer as rA,Paragraph as ot,Table as nA,TableCell as sA,TableRow as oA,TextRun as it,WidthType as iA}from"docx";import{marked as aA}from"marked";async function lA(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 cA(t,e,n),i=await uA(t,e),a=await dA(t,e.title),l=await _A(o,a??t.workflow.name);if(l.length===0)throw new Error("rendered DOCX buffer was empty");return Vj(zj(i),{recursive:!0}),Yj(i,l),t.dal.insertStepArtifact({step_id:s.id,kind:"render_docx",path:i,sha:Xj("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 cA(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 Be(e.markdown_source,t,r)).trim(),o=(n.length===0?hA(t,e.markdown_source):null)??n;if(o.length===0)throw new Error("markdown_source resolved empty");let i=mA(t.project.local_path,o);if(i!==null){if(!Gj(i))throw new Error(`markdown_source file not found: ${i}`);return ui(Kj(i,"utf8"))}return ui(o)}async function uA(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let r=(await Be(e.output_path,t,t.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=fA(t.project.local_path,r);if(!n.endsWith(".docx"))throw new Error(`output_path must end with .docx: ${n}`);return n}async function dA(t,e){if(typeof e!="string"||e.trim().length===0)return null;let r=(await Be(e,t,t.stateId)).trim();return r.length===0?null:r}function fA(t,e){let r=Vn(t);return Zj(I_(e)?Vn(e):Vn(r,e))}function mA(t,e){return pA(e)?I_(e)?Vn(e):Vn(t,e):null}function pA(t){return t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function hA(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 ui(s);let o=t.dal.query(`SELECT sa.content
1487
1487
  FROM step_artifact sa
1488
1488
  JOIN step s ON s.id = sa.step_id
1489
1489
  WHERE s.run_id = ?
1490
1490
  AND s.state_name LIKE ?
1491
1491
  AND sa.content IS NOT NULL
1492
1492
  ORDER BY sa.id DESC
1493
- LIMIT 1`,t.run_id,`${n}:coder[%`);return o[0]?.content===void 0?null:ui(o[0].content)}function ui(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}async function _A(t,e){let r=N_(aA.lexer(t,{gfm:!0})),n=new Qj({title:e,numbering:{config:[{reference:"ordered-list",levels:[{level:0,format:tA.DECIMAL,text:"%1."}]}]},sections:[{children:r.length===0?[new ot("")]:r}]});return rA.toBuffer(n)}function N_(t){let e=[];for(let r of t)switch(r.type){case"space":break;case"heading":e.push(new ot({heading:SA(r.depth),children:Kt(Vt(r))}));break;case"paragraph":e.push(new ot({children:Kt(Vt(r))}));break;case"text":e.push(new ot({children:Vt(r).length===0?[new it(r.text)]:Kt(Vt(r))}));break;case"blockquote":e.push(...N_(Vt(r)).map(n=>n instanceof ot?n:new ot({children:[new it(r.text)]})));break;case"list":EA(r)&&e.push(...gA(r));break;case"table":bA(r)&&e.push(wA(r));break;case"code":TA(r)&&e.push(...yA(r));break;case"hr":e.push(new ot(""));break;case"html":r.text.trim().length>0&&e.push(new ot({children:[new it(r.text)]}));break;default:break}return e}function Kt(t,e){let r=[];for(let n of t)switch(n.type){case"text":case"escape":r.push(new it({text:n.text,...Cc(e)}));break;case"strong":r.push(...Kt(Vt(n),{...e,bold:!0}));break;case"em":r.push(...Kt(Vt(n),{...e,italics:!0}));break;case"codespan":r.push(new it({text:n.text,...Cc({...e,code:!0})}));break;case"link":r.push(new eA({link:n.href,children:Kt(Vt(n),{...e})}));break;case"br":r.push(new it({text:"",break:1}));break;case"image":r.push(new it({text:`[image: ${n.text}]`,italics:!0}));break;case"del":r.push(new it({text:n.text,strike:!0}));break;default:r.push(new it({text:n.raw,...Cc(e)}));break}return r.length===0?[new it("")]:r}function Cc(t){return{...t?.bold===!0?{bold:!0}:{},...t?.italics===!0?{italics:!0}:{},...t?.code===!0?{font:"Courier New"}:{}}}function gA(t){return t.items.map(e=>new ot({children:Kt(e.tokens.length===1&&e.tokens[0]?.type==="text"?[{...e.tokens[0],text:v_(e)+e.tokens[0].text}]:[{type:"text",raw:e.text,text:v_(e)+e.text}]),...t.ordered?{numbering:{reference:"ordered-list",level:0}}:{bullet:{level:0}}}))}function v_(t){return t.task?`[${t.checked?"x":" "}] `:""}function wA(t){let e=[t.header,...t.rows].map(r=>new oA({children:r.map(n=>new sA({children:[new ot({children:Kt(n.tokens,n.header?{bold:!0}:void 0)})]}))}));return new nA({width:{size:100,type:iA.PERCENTAGE},rows:e})}function yA(t){return t.text.split(`
1494
- `).map(r=>new ot({children:[new it({text:r.length===0?" ":r,font:"Courier New"})]}))}function Vt(t){let e=t.tokens;return Array.isArray(e)?e:[]}function EA(t){return t.type==="list"&&Array.isArray(t.items)}function bA(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function TA(t){return t.type==="code"&&typeof t.text=="string"}function SA(t){switch(t){case 1:return rn.HEADING_1;case 2:return rn.HEADING_2;case 3:return rn.HEADING_3;case 4:return rn.HEADING_4;case 5:return rn.HEADING_5;default:return rn.HEADING_6}}var $_,x_=E(()=>{"use strict";Pe();$_={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=>lA(t,t.state)}});import{createHash as kA}from"node:crypto";import{existsSync as vA,mkdirSync as IA,readFileSync as j_,statSync as $A}from"node:fs";import{dirname as NA,isAbsolute as A_,normalize as xA,resolve as Kn}from"node:path";import jA from"exceljs";import{marked as AA}from"marked";async function RA(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 OA(t,e),i=LA(e.input_format),a=await CA(t,e),l=await MA(t,e.title),c=i==="markdown"?JA(o):UA(o);await XA({sheets:c.length===0?[{name:"Sheet1",headers:[],rows:[]}]:c,outputPath:a,title:l??t.workflow.name});let u=$A(a).size;if(u===0)throw new Error("rendered XLSX file was empty");let d=kA("sha256").update(j_(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 OA(t,e){if(typeof e.source!="string"||e.source.trim().length===0)return"";let r=(await Be(e.source,t,t.stateId)).trim(),n=PA(t.project.local_path,r);if(n!==null){if(!vA(n))throw new Error(`source file not found: ${n}`);return j_(n,"utf8")}return r}function LA(t){if(t==null||t==="")return"json";if(t==="json"||t==="markdown")return t;throw new Error(`unsupported input_format: ${String(t)}`)}async function CA(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let r=(await Be(e.output_path,t,t.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=DA(t.project.local_path,r);if(!n.endsWith(".xlsx"))throw new Error(`output_path must end with .xlsx: ${n}`);return n}async function MA(t,e){if(typeof e!="string"||e.trim().length===0)return null;let r=(await Be(e,t,t.stateId)).trim();return r.length===0?null:r}function DA(t,e){let r=Kn(t);return xA(A_(e)?Kn(e):Kn(r,e))}function PA(t,e){return FA(e)?A_(e)?Kn(e):Kn(t,e):null}function FA(t){return t.endsWith(".json")||t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function UA(t){if(t.trim().length===0)return[];let e;try{e=JSON.parse(t)}catch(r){let n=r instanceof Error?r.message:String(r);throw new Error(`invalid JSON source: ${n}`)}if(!di(e)||!Array.isArray(e.sheets))throw new Error("JSON source must be an object with sheets[]");return e.sheets.map((r,n)=>WA(r,n))}function WA(t,e){if(!di(t))throw new Error(`sheets[${e}] must be an object`);let r=BA(t.headers,`sheets[${e}].headers`),n=qA(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:HA(t.styles)}}function BA(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 qA(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 HA(t){if(!di(t)||!di(t.headers))return;let e={};return t.headers.bold===!0&&(e.bold=!0),typeof t.headers.fill=="string"&&(e.fill=t.headers.fill),Object.keys(e).length===0?void 0:e}function JA(t){let e=AA.lexer(t,{gfm:!0}),r=[],n=null;for(let s of e){if(zA(s)){n=s.text;continue}ZA(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 XA(t){IA(NA(t.outputPath),{recursive:!0});let e=new jA.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(VA(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);GA(s,n)}await e.xlsx.writeFile(t.outputPath)}function GA(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 VA(t,e){let r=KA(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 KA(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 zA(t){return t.type==="heading"&&typeof t.text=="string"}function ZA(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function di(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var R_,O_=E(()=>{"use strict";Pe();R_={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=>RA(t,t.state)}});import{spawnSync as QA}from"node:child_process";async function tR(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms;for(let f of e.pre_checks??[])if(QA("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=tn(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 en(t,m,e.coder,a!==null?`PRIOR REVIEW FEEDBACK:
1493
+ LIMIT 1`,t.run_id,`${n}:coder[%`);return o[0]?.content===void 0?null:ui(o[0].content)}function ui(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}async function _A(t,e){let r=N_(aA.lexer(t,{gfm:!0})),n=new Qj({title:e,numbering:{config:[{reference:"ordered-list",levels:[{level:0,format:tA.DECIMAL,text:"%1."}]}]},sections:[{children:r.length===0?[new ot("")]:r}]});return rA.toBuffer(n)}function N_(t){let e=[];for(let r of t)switch(r.type){case"space":break;case"heading":e.push(new ot({heading:SA(r.depth),children:Yt(Kt(r))}));break;case"paragraph":e.push(new ot({children:Yt(Kt(r))}));break;case"text":e.push(new ot({children:Kt(r).length===0?[new it(r.text)]:Yt(Kt(r))}));break;case"blockquote":e.push(...N_(Kt(r)).map(n=>n instanceof ot?n:new ot({children:[new it(r.text)]})));break;case"list":EA(r)&&e.push(...gA(r));break;case"table":bA(r)&&e.push(wA(r));break;case"code":TA(r)&&e.push(...yA(r));break;case"hr":e.push(new ot(""));break;case"html":r.text.trim().length>0&&e.push(new ot({children:[new it(r.text)]}));break;default:break}return e}function Yt(t,e){let r=[];for(let n of t)switch(n.type){case"text":case"escape":r.push(new it({text:n.text,...Mc(e)}));break;case"strong":r.push(...Yt(Kt(n),{...e,bold:!0}));break;case"em":r.push(...Yt(Kt(n),{...e,italics:!0}));break;case"codespan":r.push(new it({text:n.text,...Mc({...e,code:!0})}));break;case"link":r.push(new eA({link:n.href,children:Yt(Kt(n),{...e})}));break;case"br":r.push(new it({text:"",break:1}));break;case"image":r.push(new it({text:`[image: ${n.text}]`,italics:!0}));break;case"del":r.push(new it({text:n.text,strike:!0}));break;default:r.push(new it({text:n.raw,...Mc(e)}));break}return r.length===0?[new it("")]:r}function Mc(t){return{...t?.bold===!0?{bold:!0}:{},...t?.italics===!0?{italics:!0}:{},...t?.code===!0?{font:"Courier New"}:{}}}function gA(t){return t.items.map(e=>new ot({children:Yt(e.tokens.length===1&&e.tokens[0]?.type==="text"?[{...e.tokens[0],text:v_(e)+e.tokens[0].text}]:[{type:"text",raw:e.text,text:v_(e)+e.text}]),...t.ordered?{numbering:{reference:"ordered-list",level:0}}:{bullet:{level:0}}}))}function v_(t){return t.task?`[${t.checked?"x":" "}] `:""}function wA(t){let e=[t.header,...t.rows].map(r=>new oA({children:r.map(n=>new sA({children:[new ot({children:Yt(n.tokens,n.header?{bold:!0}:void 0)})]}))}));return new nA({width:{size:100,type:iA.PERCENTAGE},rows:e})}function yA(t){return t.text.split(`
1494
+ `).map(r=>new ot({children:[new it({text:r.length===0?" ":r,font:"Courier New"})]}))}function Kt(t){let e=t.tokens;return Array.isArray(e)?e:[]}function EA(t){return t.type==="list"&&Array.isArray(t.items)}function bA(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function TA(t){return t.type==="code"&&typeof t.text=="string"}function SA(t){switch(t){case 1:return rn.HEADING_1;case 2:return rn.HEADING_2;case 3:return rn.HEADING_3;case 4:return rn.HEADING_4;case 5:return rn.HEADING_5;default:return rn.HEADING_6}}var $_,x_=E(()=>{"use strict";Pe();$_={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=>lA(t,t.state)}});import{createHash as kA}from"node:crypto";import{existsSync as vA,mkdirSync as IA,readFileSync as j_,statSync as $A}from"node:fs";import{dirname as NA,isAbsolute as A_,normalize as xA,resolve as Kn}from"node:path";import jA from"exceljs";import{marked as AA}from"marked";async function RA(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 OA(t,e),i=LA(e.input_format),a=await CA(t,e),l=await MA(t,e.title),c=i==="markdown"?JA(o):UA(o);await XA({sheets:c.length===0?[{name:"Sheet1",headers:[],rows:[]}]:c,outputPath:a,title:l??t.workflow.name});let u=$A(a).size;if(u===0)throw new Error("rendered XLSX file was empty");let d=kA("sha256").update(j_(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 OA(t,e){if(typeof e.source!="string"||e.source.trim().length===0)return"";let r=(await Be(e.source,t,t.stateId)).trim(),n=PA(t.project.local_path,r);if(n!==null){if(!vA(n))throw new Error(`source file not found: ${n}`);return j_(n,"utf8")}return r}function LA(t){if(t==null||t==="")return"json";if(t==="json"||t==="markdown")return t;throw new Error(`unsupported input_format: ${String(t)}`)}async function CA(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let r=(await Be(e.output_path,t,t.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=DA(t.project.local_path,r);if(!n.endsWith(".xlsx"))throw new Error(`output_path must end with .xlsx: ${n}`);return n}async function MA(t,e){if(typeof e!="string"||e.trim().length===0)return null;let r=(await Be(e,t,t.stateId)).trim();return r.length===0?null:r}function DA(t,e){let r=Kn(t);return xA(A_(e)?Kn(e):Kn(r,e))}function PA(t,e){return FA(e)?A_(e)?Kn(e):Kn(t,e):null}function FA(t){return t.endsWith(".json")||t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function UA(t){if(t.trim().length===0)return[];let e;try{e=JSON.parse(t)}catch(r){let n=r instanceof Error?r.message:String(r);throw new Error(`invalid JSON source: ${n}`)}if(!di(e)||!Array.isArray(e.sheets))throw new Error("JSON source must be an object with sheets[]");return e.sheets.map((r,n)=>WA(r,n))}function WA(t,e){if(!di(t))throw new Error(`sheets[${e}] must be an object`);let r=BA(t.headers,`sheets[${e}].headers`),n=qA(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:HA(t.styles)}}function BA(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 qA(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 HA(t){if(!di(t)||!di(t.headers))return;let e={};return t.headers.bold===!0&&(e.bold=!0),typeof t.headers.fill=="string"&&(e.fill=t.headers.fill),Object.keys(e).length===0?void 0:e}function JA(t){let e=AA.lexer(t,{gfm:!0}),r=[],n=null;for(let s of e){if(zA(s)){n=s.text;continue}ZA(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 XA(t){IA(NA(t.outputPath),{recursive:!0});let e=new jA.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(VA(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);GA(s,n)}await e.xlsx.writeFile(t.outputPath)}function GA(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 VA(t,e){let r=KA(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 KA(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 zA(t){return t.type==="heading"&&typeof t.text=="string"}function ZA(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function di(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var R_,O_=E(()=>{"use strict";Pe();R_={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=>RA(t,t.state)}});import{spawnSync as QA}from"node:child_process";async function tR(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms;for(let f of e.pre_checks??[])if(QA("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=tn(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 en(t,m,e.coder,a!==null?`PRIOR REVIEW FEEDBACK:
1495
1495
  ${a}`:null,c,l,s,e.writes_to_project_path===!0,o);if(l){let g=zh(p.text);if(g!==null){let _=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(_.id,null,`escalation_vocab:${g.token}`),{kind:"escalate",token:g.token,reason:g.reason.length>0?`${g.token}: ${g.reason}`:g.token}}}if(p.outcome===null){let g=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(g.id,null,p.status_detail),{kind:"escalate",token:"",reason:`coder_no_outcome:${p.status_detail}`}}if(i.length===0){if(e.outcomes_from_stance!==void 0){let T=Object.keys(e.outcomes_from_stance),S=Hn(p.text,T);if(S.outcome===null){let v=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(v.id,null,`unhandled_stance:${S.reason}`),{kind:"escalate",token:"",reason:`no_stance:${S.reason}`}}let I=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(I.id,S.outcome,"outcomes_from_stance"),K(t,r,n,S.outcome),V(t.workflow,e.outcomes_from_stance[S.outcome])}let g=Hn(p.text,eR);if(g.outcome!==null){let T=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(T.id,g.outcome,"default_failure_stance"),K(t,r,n,g.outcome),{kind:"escalate",token:g.outcome,reason:`failure_stance:${g.outcome}`}}let _=X(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,t.dal.finishStep(_.id,"approve","no_reviewers"),K(t,r,n,"approve"),e.write_back_durable_memory){let T=t.membersByAlias.get(e.coder.alias);T!==void 0&&await xt(t,n,T,e.write_back_durable_memory)}return V(t.workflow,e.outcomes.approve)}let h=await Promise.all(i.map(g=>en(t,`${n}:reviewer_${g.alias}[${f}]`,g,`CODER OUTPUT:
1496
1496
  ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));if(h.every(g=>g.outcome==="approve")){let g=X(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,t.dal.finishStep(g.id,"approve",`loop=${f}`),K(t,r,n,"approve"),e.write_back_durable_memory){let _=t.membersByAlias.get(e.coder.alias);_!==void 0&&await xt(t,n,_,e.write_back_durable_memory)}return V(t.workflow,e.outcomes.approve)}if(a=h.filter(g=>g.outcome==="request_changes").map(g=>g.text).join(`
1497
1497
 
1498
- `),e.loop_feedback_artifact!==void 0){let g=X(t,{run_id:t.run_id,state_name:`${n}:feedback[${f}]`});t.steps_executed+=1,t.dal.finishStep(g.id,"feedback_captured",`loop=${f}`),t.dal.insertStepArtifact({step_id:g.id,kind:e.loop_feedback_artifact,content:a})}}let u=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(u.id,"max_loops_exceeded",`loops=${e.max_loops}`),K(t,r,n,"max_loops_exceeded");let d=e.outcomes.max_loops_exceeded;return d!==void 0?V(t.workflow,d):{kind:"terminal",terminal:z(t.workflow)}}var eR,L_,C_=E(()=>{"use strict";xc();Pe();eR=["blocked","failed","aborted"],L_={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=>tR(t,t.state)}});import{spawnSync as rR}from"node:child_process";async function nR(t,e){let r=t.stateId,n=t.displayName,s=await Be(e.command,t,n),o=Oc(t,n),i=c_(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=rR("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&&Lc(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 M_,D_=E(()=>{"use strict";Pe();M_={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=>nR(t,t.state)}});async function sR(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 oR(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,iR(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 oR(t,e){let r={};for(let[n,s]of Object.entries(e.inputs??{})){let o=await r_(s,t);r[n]=o===s?await ai(s,t):o}return r}function iR(t,e,r){let n={};for(let s of r)n[s.name]=aR(t,e,s);return n}function aR(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=lR(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 lR(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 P_,F_=E(()=>{"use strict";zr();Pe();Jn();P_={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=>sR(t,t.state)}});function cR(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 U_,W_=E(()=>{"use strict";Pe();U_={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=>cR(t,t.state)}});async function uR(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=dR(t.cursor),a=o.filter(fR).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 dR(t){if(t===void 0)return 0;let e=Number(t);return Number.isFinite(e)?e:0}function fR(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 B_,q_=E(()=>{"use strict";B_={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=>uR(t)}});async function mR(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 H_,J_=E(()=>{"use strict";H_={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=>mR(t)}});function X_(t){t.register(d_),t.register(L_),t.register(h_),t.register(b_),t.register(S_),t.register($_),t.register(R_),t.register(M_),t.register(m_),t.register(g_),t.register(P_),t.register(U_),t.register(H_),t.register(B_)}var G_=E(()=>{"use strict";f_();p_();__();y_();T_();k_();x_();O_();C_();D_();F_();W_();q_();J_()});function mi(){return fi===null&&(fi=new Mc,X_(fi)),fi}var pR,Mc,fi,Dc=E(()=>{"use strict";G_();pR={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"},Mc=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:pR[e];return r?this.types.get(r):void 0}list(){return Array.from(this.types.values())}},fi=null});async function Y_(t){tg(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=_R(e.definition,t.workflow),s=t.job.run_id===null?null:t.dal.getRun(t.job.run_id),o=Yn(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=Hh(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(Yn(n)){let m=Pc({dal:t.dal,workflow:hi(n),job:t.job,project:r,run:i,membersByAlias:c,outcomes:s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},inputs:Gt(t.job.payload)??{},team_id:t.team.id}),p=await Z_(n,m,i.current_state??n.entry_step_id);return K_(t.dal,r.id,i.id,n.name,p),p}let u=s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},d=Pc({dal:t.dal,workflow:n,job:t.job,project:r,run:i,membersByAlias:c,outcomes:u,inputs:Gt(t.job.payload)??{},team_id:t.team.id}),f=await z_(d,i.current_state??n.start_at);return K_(t.dal,r.id,i.id,n.name,f),f}function K_(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 Pc(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 Fc(e,r,n,s?.display_name??r)}finally{e.parent_step_id=o,e.iteration=i}},runChildWorkflow:async(r,n,s)=>{tg(n);let o=Yn(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=Pc({dal:t.dal,workflow:Yn(n)?hi(n):n,job:t.job,project:t.project,run:i,membersByAlias:t.membersByAlias,outcomes:{},inputs:s,team_id:t.team_id});return Yn(n)?Z_(n,a,i.current_state??n.entry_step_id):z_(a,i.current_state??n.start_at)}};return e}async function z_(t,e){let r=e;if(r.startsWith(Xn))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 jt(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=pi(t,z(t.workflow));if(l.kind==="paused")return Oe(t);if(l.kind==="escalate")return Ye(t,{id:r,name:r,type:"unknown"},l.token,l.reason),Oe(t);if(l.kind==="terminal")return jt(t,l.terminal);r=l.state;continue}let i,a=eg(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===wn)return jt(t,Na);let c=o.outcomes?.[a];i=c!==void 0?V(t.workflow,c):Ye(t,{id:r,name:r,type:o.type},a,`no declared edge for resumed outcome '${a}' from state '${r}'`)}else i=await Fc(t,r,o);if(i.kind==="paused")return Oe(t);if(i.kind==="escalate")return Ye(t,{id:r,name:r,type:o.type},i.token,i.reason),Oe(t);if(i.kind==="terminal"){let l=pi(t,i.terminal);if(l.kind==="paused")return Oe(t);if(l.kind==="escalate")return Ye(t,{id:r,name:r,type:o.type},l.token,l.reason),Oe(t);if(l.kind==="terminal")return jt(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=pi(t,z(t.workflow));return n.kind==="terminal"?jt(t,n.terminal):jt(t,z(t.workflow))}async function Z_(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 Ye(e,{id:o,name:o,type:"unknown"},"",`internal:unknown v3 step '${o}'`),Oe(e);let l=eg(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===wn)return jt(e,Na);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 Ye(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 hR(e,t,a);if(c.kind==="paused")return Oe(e);let u=Object.keys(t.connections[a.id]??{});if(c.kind==="escalate")return Ye(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=hi(t,a);try{let p=pi(e,d);if(p.kind==="paused")return Oe(e);if(p.kind==="escalate")return Ye(e,{id:a.id,name:a.name,type:a.type},p.token,p.reason),Oe(e);if(p.kind==="terminal")return jt(e,p.terminal);let h=s.get(p.state);if(h===void 0)return Ye(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(xr(d))return Ye(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 Ye(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})}),jt(e,"aborted")}async function hR(t,e,r){let n=Q_(e,r),s=t.workflow;t.workflow=hi(e,r);try{return await Fc(t,r.id,n,r.name)}finally{t.workflow=s}}function Q_(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 Fc(t,e,r,n){let s=mi().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?yR(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 _R(t,e){try{let r=JSON.parse(t);if(wR(r)&&r.definition_schema_version===3)return dt.parse(r)}catch{return e}return e}function Yn(t){return t.definition_schema_version===3}function hi(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]=Q_(t,o))}return e?.type==="lmctl/terminal"&&typeof e.parameters.name=="string"&&(n[e.parameters.name]={kind:gR(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 gR(t){return t==="success"||t==="failure"||t==="neutral"?t:"neutral"}function wR(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function yR(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 jt(t,e){t.dal.setRunTerminalState(t.run_id,e);try{Uh(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 eg(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 pi(t,e){if(!ER(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&&bR(t,e,r.on_unhandled_failure),{kind:"terminal",terminal:e}))}function ER(t,e){return t.definition_schema_version===2&&t.terminals[e]?.kind==="failure"}function bR(t,e,r){let n=TR(t),s=r.capture_evidence&&n!==null?SR(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 TR(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 SR(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 tg(t){if(!V_.includes(t.definition_schema_version))throw new Error(`unsupported definition_schema_version ${t.definition_schema_version}; supported versions: ${V_.join(", ")}`)}var V_,rg=E(()=>{"use strict";Kr();Wh();Jh();Pe();Dc();yn();V_=[1,2,3]});import{readFileSync as kR,readdirSync as vR}from"node:fs";import{basename as IR,join as $R,resolve as NR}from"node:path";function og(t={}){let e=NR(t.workflowsDir??"workflows"),r=vR(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=>xR($R(e,n)))}}function xR(t){let e=IR(t);try{let r=kR(t,"utf8"),n=Re(r);return lg(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:cg(r)}}}function ig(t,e){try{let r=Re(e);return lg(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:cg(r)}}}function ag(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 eR,L_,C_=E(()=>{"use strict";jc();Pe();eR=["blocked","failed","aborted"],L_={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=>tR(t,t.state)}});import{spawnSync as rR}from"node:child_process";async function nR(t,e){let r=t.stateId,n=t.displayName,s=await Be(e.command,t,n),o=Lc(t,n),i=c_(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=rR("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&&Cc(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 M_,D_=E(()=>{"use strict";Pe();M_={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=>nR(t,t.state)}});async function sR(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 oR(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,iR(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 oR(t,e){let r={};for(let[n,s]of Object.entries(e.inputs??{})){let o=await r_(s,t);r[n]=o===s?await ai(s,t):o}return r}function iR(t,e,r){let n={};for(let s of r)n[s.name]=aR(t,e,s);return n}function aR(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=lR(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 lR(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 P_,F_=E(()=>{"use strict";zr();Pe();Jn();P_={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=>sR(t,t.state)}});function cR(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 U_,W_=E(()=>{"use strict";Pe();U_={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=>cR(t,t.state)}});async function uR(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=dR(t.cursor),a=o.filter(fR).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 dR(t){if(t===void 0)return 0;let e=Number(t);return Number.isFinite(e)?e:0}function fR(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 B_,q_=E(()=>{"use strict";B_={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=>uR(t)}});async function mR(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 H_,J_=E(()=>{"use strict";H_={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=>mR(t)}});function X_(t){t.register(d_),t.register(L_),t.register(h_),t.register(b_),t.register(S_),t.register($_),t.register(R_),t.register(M_),t.register(m_),t.register(g_),t.register(P_),t.register(U_),t.register(H_),t.register(B_)}var G_=E(()=>{"use strict";f_();p_();__();y_();T_();k_();x_();O_();C_();D_();F_();W_();q_();J_()});function mi(){return fi===null&&(fi=new Dc,X_(fi)),fi}var pR,Dc,fi,Pc=E(()=>{"use strict";G_();pR={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"},Dc=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:pR[e];return r?this.types.get(r):void 0}list(){return Array.from(this.types.values())}},fi=null});async function Y_(t){tg(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=_R(e.definition,t.workflow),s=t.job.run_id===null?null:t.dal.getRun(t.job.run_id),o=Yn(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=Hh(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(Yn(n)){let m=Fc({dal:t.dal,workflow:hi(n),job:t.job,project:r,run:i,membersByAlias:c,outcomes:s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},inputs:Vt(t.job.payload)??{},team_id:t.team.id}),p=await Z_(n,m,i.current_state??n.entry_step_id);return K_(t.dal,r.id,i.id,n.name,p),p}let u=s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},d=Fc({dal:t.dal,workflow:n,job:t.job,project:r,run:i,membersByAlias:c,outcomes:u,inputs:Vt(t.job.payload)??{},team_id:t.team.id}),f=await z_(d,i.current_state??n.start_at);return K_(t.dal,r.id,i.id,n.name,f),f}function K_(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 Fc(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 Uc(e,r,n,s?.display_name??r)}finally{e.parent_step_id=o,e.iteration=i}},runChildWorkflow:async(r,n,s)=>{tg(n);let o=Yn(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=Fc({dal:t.dal,workflow:Yn(n)?hi(n):n,job:t.job,project:t.project,run:i,membersByAlias:t.membersByAlias,outcomes:{},inputs:s,team_id:t.team_id});return Yn(n)?Z_(n,a,i.current_state??n.entry_step_id):z_(a,i.current_state??n.start_at)}};return e}async function z_(t,e){let r=e;if(r.startsWith(Xn))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 jt(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=pi(t,z(t.workflow));if(l.kind==="paused")return Oe(t);if(l.kind==="escalate")return Ye(t,{id:r,name:r,type:"unknown"},l.token,l.reason),Oe(t);if(l.kind==="terminal")return jt(t,l.terminal);r=l.state;continue}let i,a=eg(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===wn)return jt(t,xa);let c=o.outcomes?.[a];i=c!==void 0?V(t.workflow,c):Ye(t,{id:r,name:r,type:o.type},a,`no declared edge for resumed outcome '${a}' from state '${r}'`)}else i=await Uc(t,r,o);if(i.kind==="paused")return Oe(t);if(i.kind==="escalate")return Ye(t,{id:r,name:r,type:o.type},i.token,i.reason),Oe(t);if(i.kind==="terminal"){let l=pi(t,i.terminal);if(l.kind==="paused")return Oe(t);if(l.kind==="escalate")return Ye(t,{id:r,name:r,type:o.type},l.token,l.reason),Oe(t);if(l.kind==="terminal")return jt(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=pi(t,z(t.workflow));return n.kind==="terminal"?jt(t,n.terminal):jt(t,z(t.workflow))}async function Z_(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 Ye(e,{id:o,name:o,type:"unknown"},"",`internal:unknown v3 step '${o}'`),Oe(e);let l=eg(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===wn)return jt(e,xa);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 Ye(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 hR(e,t,a);if(c.kind==="paused")return Oe(e);let u=Object.keys(t.connections[a.id]??{});if(c.kind==="escalate")return Ye(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=hi(t,a);try{let p=pi(e,d);if(p.kind==="paused")return Oe(e);if(p.kind==="escalate")return Ye(e,{id:a.id,name:a.name,type:a.type},p.token,p.reason),Oe(e);if(p.kind==="terminal")return jt(e,p.terminal);let h=s.get(p.state);if(h===void 0)return Ye(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(xr(d))return Ye(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 Ye(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})}),jt(e,"aborted")}async function hR(t,e,r){let n=Q_(e,r),s=t.workflow;t.workflow=hi(e,r);try{return await Uc(t,r.id,n,r.name)}finally{t.workflow=s}}function Q_(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 Uc(t,e,r,n){let s=mi().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?yR(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 _R(t,e){try{let r=JSON.parse(t);if(wR(r)&&r.definition_schema_version===3)return dt.parse(r)}catch{return e}return e}function Yn(t){return t.definition_schema_version===3}function hi(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]=Q_(t,o))}return e?.type==="lmctl/terminal"&&typeof e.parameters.name=="string"&&(n[e.parameters.name]={kind:gR(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 gR(t){return t==="success"||t==="failure"||t==="neutral"?t:"neutral"}function wR(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function yR(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 jt(t,e){t.dal.setRunTerminalState(t.run_id,e);try{Uh(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 eg(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 pi(t,e){if(!ER(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&&bR(t,e,r.on_unhandled_failure),{kind:"terminal",terminal:e}))}function ER(t,e){return t.definition_schema_version===2&&t.terminals[e]?.kind==="failure"}function bR(t,e,r){let n=TR(t),s=r.capture_evidence&&n!==null?SR(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 TR(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 SR(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 tg(t){if(!V_.includes(t.definition_schema_version))throw new Error(`unsupported definition_schema_version ${t.definition_schema_version}; supported versions: ${V_.join(", ")}`)}var V_,rg=E(()=>{"use strict";Kr();Wh();Jh();Pe();Pc();yn();V_=[1,2,3]});import{readFileSync as kR,readdirSync as vR}from"node:fs";import{basename as IR,join as $R,resolve as NR}from"node:path";function og(t={}){let e=NR(t.workflowsDir??"workflows"),r=vR(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=>xR($R(e,n)))}}function xR(t){let e=IR(t);try{let r=kR(t,"utf8"),n=Re(r);return lg(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:cg(r)}}}function ig(t,e){try{let r=Re(e);return lg(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:cg(r)}}}function ag(t){let e=[];e.push(`workflow verification - ${t.generated_at}`),e.push(`dir: ${t.workflows_dir}`),e.push(""),e.push(`${"status".padEnd(17)} ${"workflow".padEnd(36)} ${"first step".padEnd(52)} note`),e.push(`${"-".repeat(17)} ${"-".repeat(36)} ${"-".repeat(52)} ${"-".repeat(30)}`);for(let o of t.rows){let i=(o.workflow_name??o.file).slice(0,36).padEnd(36),a=`${o.first_step_id??"-"}${o.first_step_type===null?"":` (${o.first_step_type})`}`;e.push(`${o.status.padEnd(17)} ${i} ${a.slice(0,52).padEnd(52)} ${o.note}`)}let r=t.rows.filter(o=>o.status==="PASS").length,n=t.rows.filter(o=>o.status==="PASS_NEEDS_INPUTS").length,s=t.rows.filter(o=>o.status==="FAIL").length;return e.push(""),e.push(`summary: ${r} pass, ${n} pass_needs_inputs, ${s} fail`),`${e.join(`
1499
1499
  `)}
1500
- `}function lg(t,e){let r=AR(e),n=RR(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=jR(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 jR(t){return(t??[]).filter(e=>e.required===!0&&e.default===void 0).map(e=>e.name)}function AR(t){return Uc(t)?t.entry_step_id:t.start_at}function RR(t){return Uc(t)?t.steps.find(e=>e.id===t.entry_step_id)?.type??null:t.states[t.start_at]?.type??null}function Uc(t){return t.definition_schema_version===3}function cg(t){return t instanceof Nt?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 ug(t){let e=new Set;if(Uc(t))for(let r of t.steps){let n=r.members??{};ng(n,e)}else for(let r of Object.values(t.states))ng(r,e);return[...e].sort()}function ng(t,e){let r=["coder","agent","consolidator"],n=["reviewers","researchers"];for(let s of r){let o=t[s],i=sg(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=sg(i);a!==null&&e.add(a)}}}function sg(t){if(t===null||typeof t!="object")return null;let e=t.alias;return typeof e=="string"&&e.length>0?e:null}var _i=E(()=>{"use strict";zr()});function OR({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,gi)[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}=LR(t,r,i);if(a<20)continue;let c=i??"initial",u=`${zn}:${r.id}:${c}`;t.enqueueJob({project_id:r.id,source:gi,source_ref:zn,payload:JSON.stringify({kind:zn,project_id:r.id,completed_sessions:a,max_run_id:l,since_run_id:i}),dedupe_key:u})}}function LR(t,e,r){let n=t.query(`SELECT COUNT(*) AS cnt, MAX(r.id) AS max_id
1500
+ `}function lg(t,e){let r=AR(e),n=RR(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=jR(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 jR(t){return(t??[]).filter(e=>e.required===!0&&e.default===void 0).map(e=>e.name)}function AR(t){return Wc(t)?t.entry_step_id:t.start_at}function RR(t){return Wc(t)?t.steps.find(e=>e.id===t.entry_step_id)?.type??null:t.states[t.start_at]?.type??null}function Wc(t){return t.definition_schema_version===3}function cg(t){return t instanceof Nt?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 ug(t){let e=new Set;if(Wc(t))for(let r of t.steps){let n=r.members??{};ng(n,e)}else for(let r of Object.values(t.states))ng(r,e);return[...e].sort()}function ng(t,e){let r=["coder","agent","consolidator"],n=["reviewers","researchers"];for(let s of r){let o=t[s],i=sg(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=sg(i);a!==null&&e.add(a)}}}function sg(t){if(t===null||typeof t!="object")return null;let e=t.alias;return typeof e=="string"&&e.length>0?e:null}var _i=E(()=>{"use strict";zr()});function OR({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,gi)[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}=LR(t,r,i);if(a<20)continue;let c=i??"initial",u=`${zn}:${r.id}:${c}`;t.enqueueJob({project_id:r.id,source:gi,source_ref:zn,payload:JSON.stringify({kind:zn,project_id:r.id,completed_sessions:a,max_run_id:l,since_run_id:i}),dedupe_key:u})}}function LR(t,e,r){let n=t.query(`SELECT COUNT(*) AS cnt, MAX(r.id) AS max_id
1501
1501
  FROM run r
1502
1502
  JOIN job j ON j.id = r.job_id
1503
1503
  WHERE j.project_id = ?
1504
1504
  AND r.terminal_state IS NOT NULL
1505
- ${r!==null?"AND r.id > ?":""}`,...r!==null?[e.id,r]:[e.id]);return{count:n[0]?.cnt??0,maxRunId:n[0]?.max_id??0}}function dg(t){for(let e of CR)try{e(t)}catch{}}var gi,zn,CR,Wc=E(()=>{"use strict";gi="memory_policy",zn="memory_consolidation_request";CR=[OR]});var gg={};ie(gg,{getOrInsertConsolidationWorkflow:()=>mg,runJobById:()=>Zn,runOnce:()=>br,startWorker:()=>UR});import{createHash as MR}from"node:crypto";import{readFileSync as DR}from"node:fs";import{pathToFileURL as PR}from"node:url";function mg(t,e="durable-memory-consolidation-v2"){let r=t.getWorkflowByName(e);if(r!==null)return r;try{Lo({swallow:!0});let n=Co(e);if(n===null)return null;let s=DR(n,"utf8"),o=Re(s);return t.insertWorkflow({name:e,version:o.version,definition_schema_version:o.definition_schema_version,definition:s,source_uri:PR(n).href,source_sha256:MR("sha256").update(s).digest("hex")})}catch{return null}}async function br(t){let e=Date.now(),r=null;try{return r=t.dal.claimNextJobWithConcurrency({worker_id:t.worker_id,lease_ms:t.lease_ms??fg,evaluator:n=>hg(t.dal,n)}),r===null?null:await pg(t.dal,r,e)}catch(n){if(r!==null)return Yt(t.dal,r,"worker_run_failed",Er(n),e);try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:wi(Er(n))})})}catch{}return null}finally{t.max_concurrent}}async function Zn(t){let e=Date.now(),r=null;try{let n=t.dal.claimJobByIdWithConcurrency({job_id:t.job_id,worker_id:t.worker_id,lease_ms:t.lease_ms??fg,evaluator:s=>hg(t.dal,s)});return n.claimed?(r=n.job,{claimed:!0,...await pg(t.dal,r,e)}):n}catch(n){if(r!==null)return{claimed:!0,...Yt(t.dal,r,"worker_run_failed",Er(n),e)};try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:wi(Er(n)),job_id:t.job_id})})}catch{}return{claimed:!1,reason:"not_claimable",job_id:t.job_id}}finally{t.max_concurrent}}async function pg(t,e,r){let n=t.getProjectByJob(e.id);if(n===null)return Yt(t,e,"worker_project_missing","project_not_found",r);let s=e.source===gi&&e.source_ref===zn,o=e.run_id===null?null:t.getRun(e.run_id),i;if(o!==null?i=t.getWorkflow(o.workflow_id):s?i=mg(t):i=_g(t,e,n),i===null)return Yt(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 Yt(t,e,"worker_team_missing","team_not_found",r,n);let c;try{c=Re(i.definition)}catch(d){return Yt(t,e,"worker_workflow_invalid",Er(d),r,n)}let u=WR(c,l);if(u.length>0)return Yt(t,e,"worker_team_missing_aliases",`missing_aliases:${u.join(",")}`,r,n,a);try{let d=await Y_({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 Yt(t,e,"worker_run_failed",Er(d),r,n,a)}}function hg(t,e){let r=t.getProjectByJob(e.id);if(r===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let n=_g(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 Yo({workflow:s,job:e,project:r})}function _g(t,e,r){return e.workflow_id_override!==null?t.getWorkflow(e.workflow_id_override):t.getWorkflowByName(r.workflow_name)}async function UR(t){let e=!1,r=null,n=Promise.resolve(),s=async()=>{if(!e){try{let o;do o=await br(t);while(!e&&o!==null)}catch(o){try{t.dal.raiseAttention({kind:"worker_loop_error",severity:"error",payload:JSON.stringify({error:wi(Er(o))})})}catch{}}e||(r=setTimeout(()=>{n=s()},t.poll_interval_ms??FR))}};return n=s(),{stop:async()=>{e=!0,r!==null&&clearTimeout(r),await n.catch(()=>{})}}}function Yt(t,e,r,n,s,o,i){let a=wi(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 Er(t){return t instanceof Error?t.message:String(t)}function wi(t){return t.length>4096?t.slice(0,4096):t}function WR(t,e){let r=ug(t);if(r.length===0)return[];let n=new Set(e.map(s=>s.alias));return r.filter(s=>!n.has(s))}var fg,FR,Qn=E(()=>{"use strict";Mo();rg();zr();_i();uc();Wc();fg=6e5,FR=5e3});import{existsSync as BR,readFileSync as qR}from"node:fs";import{marked as HR}from"marked";function bg(t,e){t.get("/layman",r=>r.html($e("Layman Home",JR(e.dal)))),t.get("/api/layman",r=>r.json(vg(e.dal))),t.get("/layman/start/:workflow",r=>{let n=Eg(r);return n===null?r.notFound():r.html($e(`Start ${nn(n)}`,VR(e.dal,n)))}),t.post("/layman/start/:workflow",async r=>{let n=Eg(r);return n===null?r.notFound():n==="newspaper"?wg(r,e.dal):KR(r,e.dal,n)}),t.get("/layman/run/:id",r=>{let n=mr(e.dal,yi(r,"id"));return n===null?r.notFound():r.html($e(`Run ${n.id}`,ZR(e.dal,n)))}),t.get("/api/layman/run/:id",r=>{let n=mr(e.dal,yi(r,"id"));return n===null?r.notFound():r.json(cO(e.dal,n))}),t.post("/layman/run/:id/respond",async r=>eO(r,e.dal)),t.get("/layman/newspaper",r=>r.html($e("Newspaper Subscriptions",aO(e.dal)))),t.post("/layman/newspaper",r=>wg(r,e.dal)),t.delete("/layman/newspaper/:id",r=>yg(r,e.dal)),t.post("/layman/newspaper/:id/delete",r=>yg(r,e.dal))}function JR(t){let e=vg(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 dg(t){for(let e of CR)try{e(t)}catch{}}var gi,zn,CR,Bc=E(()=>{"use strict";gi="memory_policy",zn="memory_consolidation_request";CR=[OR]});var gg={};ie(gg,{getOrInsertConsolidationWorkflow:()=>mg,runJobById:()=>Zn,runOnce:()=>br,startWorker:()=>UR});import{createHash as MR}from"node:crypto";import{readFileSync as DR}from"node:fs";import{pathToFileURL as PR}from"node:url";function mg(t,e="durable-memory-consolidation-v2"){let r=t.getWorkflowByName(e);if(r!==null)return r;try{Lo({swallow:!0});let n=Co(e);if(n===null)return null;let s=DR(n,"utf8"),o=Re(s);return t.insertWorkflow({name:e,version:o.version,definition_schema_version:o.definition_schema_version,definition:s,source_uri:PR(n).href,source_sha256:MR("sha256").update(s).digest("hex")})}catch{return null}}async function br(t){let e=Date.now(),r=null;try{return r=t.dal.claimNextJobWithConcurrency({worker_id:t.worker_id,lease_ms:t.lease_ms??fg,evaluator:n=>hg(t.dal,n)}),r===null?null:await pg(t.dal,r,e)}catch(n){if(r!==null)return zt(t.dal,r,"worker_run_failed",Er(n),e);try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:wi(Er(n))})})}catch{}return null}finally{t.max_concurrent}}async function Zn(t){let e=Date.now(),r=null;try{let n=t.dal.claimJobByIdWithConcurrency({job_id:t.job_id,worker_id:t.worker_id,lease_ms:t.lease_ms??fg,evaluator:s=>hg(t.dal,s)});return n.claimed?(r=n.job,{claimed:!0,...await pg(t.dal,r,e)}):n}catch(n){if(r!==null)return{claimed:!0,...zt(t.dal,r,"worker_run_failed",Er(n),e)};try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:wi(Er(n)),job_id:t.job_id})})}catch{}return{claimed:!1,reason:"not_claimable",job_id:t.job_id}}finally{t.max_concurrent}}async function pg(t,e,r){let n=t.getProjectByJob(e.id);if(n===null)return zt(t,e,"worker_project_missing","project_not_found",r);let s=e.source===gi&&e.source_ref===zn,o=e.run_id===null?null:t.getRun(e.run_id),i;if(o!==null?i=t.getWorkflow(o.workflow_id):s?i=mg(t):i=_g(t,e,n),i===null)return zt(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 zt(t,e,"worker_team_missing","team_not_found",r,n);let c;try{c=Re(i.definition)}catch(d){return zt(t,e,"worker_workflow_invalid",Er(d),r,n)}let u=WR(c,l);if(u.length>0)return zt(t,e,"worker_team_missing_aliases",`missing_aliases:${u.join(",")}`,r,n,a);try{let d=await Y_({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 zt(t,e,"worker_run_failed",Er(d),r,n,a)}}function hg(t,e){let r=t.getProjectByJob(e.id);if(r===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let n=_g(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 Yo({workflow:s,job:e,project:r})}function _g(t,e,r){return e.workflow_id_override!==null?t.getWorkflow(e.workflow_id_override):t.getWorkflowByName(r.workflow_name)}async function UR(t){let e=!1,r=null,n=Promise.resolve(),s=async()=>{if(!e){try{let o;do o=await br(t);while(!e&&o!==null)}catch(o){try{t.dal.raiseAttention({kind:"worker_loop_error",severity:"error",payload:JSON.stringify({error:wi(Er(o))})})}catch{}}e||(r=setTimeout(()=>{n=s()},t.poll_interval_ms??FR))}};return n=s(),{stop:async()=>{e=!0,r!==null&&clearTimeout(r),await n.catch(()=>{})}}}function zt(t,e,r,n,s,o,i){let a=wi(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 Er(t){return t instanceof Error?t.message:String(t)}function wi(t){return t.length>4096?t.slice(0,4096):t}function WR(t,e){let r=ug(t);if(r.length===0)return[];let n=new Set(e.map(s=>s.alias));return r.filter(s=>!n.has(s))}var fg,FR,Qn=E(()=>{"use strict";Mo();rg();zr();_i();dc();Bc();fg=6e5,FR=5e3});import{existsSync as BR,readFileSync as qR}from"node:fs";import{marked as HR}from"marked";function bg(t,e){t.get("/layman",r=>r.html($e("Layman Home",JR(e.dal)))),t.get("/api/layman",r=>r.json(vg(e.dal))),t.get("/layman/start/:workflow",r=>{let n=Eg(r);return n===null?r.notFound():r.html($e(`Start ${nn(n)}`,VR(e.dal,n)))}),t.post("/layman/start/:workflow",async r=>{let n=Eg(r);return n===null?r.notFound():n==="newspaper"?wg(r,e.dal):KR(r,e.dal,n)}),t.get("/layman/run/:id",r=>{let n=pr(e.dal,yi(r,"id"));return n===null?r.notFound():r.html($e(`Run ${n.id}`,ZR(e.dal,n)))}),t.get("/api/layman/run/:id",r=>{let n=pr(e.dal,yi(r,"id"));return n===null?r.notFound():r.json(cO(e.dal,n))}),t.post("/layman/run/:id/respond",async r=>eO(r,e.dal)),t.get("/layman/newspaper",r=>r.html($e("Newspaper Subscriptions",aO(e.dal)))),t.post("/layman/newspaper",r=>wg(r,e.dal)),t.delete("/layman/newspaper/:id",r=>yg(r,e.dal)),t.post("/layman/newspaper/:id/delete",r=>yg(r,e.dal))}function JR(t){let e=vg(t);return`<section class="layman-home">
1506
1506
  <h1>Welcome</h1>
1507
1507
  <p class="muted">Choose a workflow and answer a few plain-language prompts.</p>
1508
1508
  <div class="grid">${Ei.map(XR).join("")}</div>
@@ -1539,23 +1539,23 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1539
1539
  <h2>${b(fO(e.state_name))}</h2>
1540
1540
  <p class="muted">The agent is waiting for your response.</p>
1541
1541
  <h3>Agent output</h3>
1542
- <div class="metric">${Xc(e.last_agent_output??"")}</div>
1542
+ <div class="metric">${Gc(e.last_agent_output??"")}</div>
1543
1543
  <form method="post" action="/layman/run/${b(t.id)}/respond">
1544
1544
  <input type="hidden" name="step_id" value="${b(e.step_id)}">
1545
1545
  <label>Your response<textarea name="input" rows="7"></textarea></label>
1546
1546
  <button type="submit" name="done" value="false">Send response</button>
1547
1547
  <button type="submit" name="done" value="true">Done with this stage</button>
1548
1548
  </form>
1549
- </section>`}async function eO(t,e){let r=yi(t,"id"),n=await t.req.parseBody(),s=Number(qe(n.step_id)),o=qe(n.input),i=qe(n.done)==="true";if(!Number.isInteger(s))return t.html($e("Interactive response",'<p class="error">Missing interactive step.</p>'),400);let a=e.resumeInteractive(s,o,i);return a.resumed?(tO(e,a.run.id),await br({dal:e,worker_id:`layman-respond-${Date.now()}`}),t.redirect(`/layman/run/${r}`,302)):t.html($e("Interactive response",`<p class="error">Could not submit response: ${b(a.reason)}</p>`),400)}function tO(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(!qc(s)||s.definition_schema_version!==3||!Array.isArray(s.steps))return;let o=s.steps.find(i=>qc(i)&&i.name===r.current_state&&typeof i.id=="string");qc(o)&&typeof o.id=="string"&&t.setRunCurrentState(r.id,o.id)}catch{return}}function rO(t,e,r){let n=mO(e.terminal_state);return`<section class="metric terminal-run">
1549
+ </section>`}async function eO(t,e){let r=yi(t,"id"),n=await t.req.parseBody(),s=Number(qe(n.step_id)),o=qe(n.input),i=qe(n.done)==="true";if(!Number.isInteger(s))return t.html($e("Interactive response",'<p class="error">Missing interactive step.</p>'),400);let a=e.resumeInteractive(s,o,i);return a.resumed?(tO(e,a.run.id),await br({dal:e,worker_id:`layman-respond-${Date.now()}`}),t.redirect(`/layman/run/${r}`,302)):t.html($e("Interactive response",`<p class="error">Could not submit response: ${b(a.reason)}</p>`),400)}function tO(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(!Hc(s)||s.definition_schema_version!==3||!Array.isArray(s.steps))return;let o=s.steps.find(i=>Hc(i)&&i.name===r.current_state&&typeof i.id=="string");Hc(o)&&typeof o.id=="string"&&t.setRunCurrentState(r.id,o.id)}catch{return}}function rO(t,e,r){let n=mO(e.terminal_state);return`<section class="metric terminal-run">
1550
1550
  <h2>${n?"Complete":"Stopped"}</h2>
1551
1551
  <p>Status: <strong>${b(e.terminal_state)}</strong></p>
1552
1552
  ${n?nO(t,e,r):oO(e)}
1553
1553
  <h2>Stage Log</h2>
1554
1554
  ${Sg(e)}
1555
- </section>`}function nO(t,e,r){if(r==="info-qa"){let n=Jc(e,["info_qa_consolidated"]);return`<h3>Answer</h3><div class="metric">${Xc(n??"No answer artifact was recorded yet.")}</div>`}if(r==="document-creation")return sO(t,e);if(r==="newspaper"){let n=Jc(e,["newspaper_consolidated"]);return`<h3>Digest</h3><div class="metric">${Xc(n??"No digest artifact was recorded yet.")}</div>`}return'<p class="muted">No layman output renderer for this workflow.</p>'}function sO(t,e){let r=pr(t,e.id),n=Bc(r,["render_docx"]),s=Bc(r,["render_xlsx"]),o=Jc(e,["review:coder[0]_transcript","chat_output_md"])??iO(Bc(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 nO(t,e,r){if(r==="info-qa"){let n=Xc(e,["info_qa_consolidated"]);return`<h3>Answer</h3><div class="metric">${Gc(n??"No answer artifact was recorded yet.")}</div>`}if(r==="document-creation")return sO(t,e);if(r==="newspaper"){let n=Xc(e,["newspaper_consolidated"]);return`<h3>Digest</h3><div class="metric">${Gc(n??"No digest artifact was recorded yet.")}</div>`}return'<p class="muted">No layman output renderer for this workflow.</p>'}function sO(t,e){let r=hr(t,e.id),n=qc(r,["render_docx"]),s=qc(r,["render_xlsx"]),o=Xc(e,["review:coder[0]_transcript","chat_output_md"])??iO(qc(r,["document_md","markdown"])),i=[n,s].filter(a=>a!==null).map(a=>`<li><a href="file://${b(a)}">${b(a)}</a></li>`).join("");return`<h3>Document Preview</h3>
1556
1556
  <pre>${b(hO(pO(o??"No preview available."),30))}</pre>
1557
1557
  <h3>Downloads</h3>
1558
- ${i.length>0?`<ul>${i}</ul>`:'<p class="muted">No rendered files found yet.</p>'}`}function oO(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 Jc(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 Bc(t,e){for(let r of[...t].reverse())if(e.includes(r.kind)&&r.path!==null)return r.path;return null}function iO(t){if(t===null||!BR(t)||!t.endsWith(".md"))return null;try{return qR(t,"utf8")}catch{return null}}function aO(t){let e=t.listProjects();return`<h1>Newspaper Subscriptions</h1>
1558
+ ${i.length>0?`<ul>${i}</ul>`:'<p class="muted">No rendered files found yet.</p>'}`}function oO(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 Xc(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 qc(t,e){for(let r of[...t].reverse())if(e.includes(r.kind)&&r.path!==null)return r.path;return null}function iO(t){if(t===null||!BR(t)||!t.endsWith(".md"))return null;try{return qR(t,"utf8")}catch{return null}}function aO(t){let e=t.listProjects();return`<h1>Newspaper Subscriptions</h1>
1559
1559
  ${lO(Ig(t))}
1560
1560
  <h2>Add Subscription</h2>
1561
1561
  ${e.length===0?'<p class="error">Create a project before subscribing.</p>':kg(e,"/layman/newspaper")}`}function kg(t,e){return`<form method="post" action="${b(e)}">
@@ -1572,28 +1572,28 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1572
1572
  </form>`}async function wg(t,e){let r=await t.req.parseBody(),n=Ng(e,r);if(n===null)return t.html($e("Newspaper",'<p class="error">Choose a valid project.</p>'),400);let s=e.getWorkflowByName("newspaper");if(s===null)return t.html($e("Newspaper",'<p class="error">The newspaper workflow is not loaded.</p>'),400);let o=qe(r.topics).split(/[\n,]/).map(a=>a.trim()).filter(a=>a.length>0);if(o.length===0)return t.html($e("Newspaper",'<p class="error">Enter at least one topic.</p>'),400);let i={topics:o,output_dir:qe(r.output_dir).trim()||"digests",schedule:dO(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 yg(t,e){let r=yi(t,"id");return e.removeProjectWorkflow(r)?t.redirect("/layman/newspaper?removed=1",302):t.notFound()}function lO(t){return ue(["id","project","topics","status","action"],t.map(e=>{let r=gO(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 vg(t){let e=Ig(t);return{workflows:Ei,recent_runs:uO(t),newspaper_subscriptions:e.length}}function cO(t,e){let r=$g(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 uO(t){return t.query(`SELECT r.*, w.name AS workflow_name
1573
1573
  FROM run r
1574
1574
  JOIN workflow w ON w.id = r.workflow_id
1575
- WHERE w.name IN (${Hc.map(()=>"?").join(",")})
1575
+ WHERE w.name IN (${Jc.map(()=>"?").join(",")})
1576
1576
  ORDER BY r.id DESC
1577
- LIMIT 10`,...Hc)}function Ig(t){return t.query(`SELECT pw.*, p.name AS project_name
1577
+ LIMIT 10`,...Jc)}function Ig(t){return t.query(`SELECT pw.*, p.name AS project_name
1578
1578
  FROM project_workflow pw
1579
1579
  JOIN workflow w ON w.id = pw.workflow_id
1580
1580
  JOIN project p ON p.id = pw.project_id
1581
1581
  WHERE w.name = ?
1582
- ORDER BY pw.id DESC`,"newspaper")}function $g(t,e){for(let r of[...e.steps].reverse()){let n=t.getInteractiveSessionByStepId(r.id);if(n!==null)return n}return null}function Ng(t,e){let r=Number(qe(e.project_id));return Number.isInteger(r)?t.getProject(r):null}function dO(t){let e=qe(t.schedule)||"daily";return e==="weekly"?{preset:e,cron:"0 6 * * 1"}:e==="custom"?{preset:e,cron:qe(t.cron).trim()||"0 6 * * *"}:{preset:"daily",cron:"0 6 * * *"}}function Eg(t){let e=t.req.param("workflow");return Hc.includes(e)?e:null}function nn(t){return Ei.find(e=>e.name===t)?.title??t}function fO(t){return t.split(/[_:-]/).filter(Boolean).map(e=>`${e[0]?.toUpperCase()??""}${e.slice(1)}`).join(" ")}function Xc(t){return HR.parse(t,{async:!1})}function mO(t){return t==="done"||t==="pr_ready"||t==="merged"}function pO(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}function hO(t,e){return t.split(`
1582
+ ORDER BY pw.id DESC`,"newspaper")}function $g(t,e){for(let r of[...e.steps].reverse()){let n=t.getInteractiveSessionByStepId(r.id);if(n!==null)return n}return null}function Ng(t,e){let r=Number(qe(e.project_id));return Number.isInteger(r)?t.getProject(r):null}function dO(t){let e=qe(t.schedule)||"daily";return e==="weekly"?{preset:e,cron:"0 6 * * 1"}:e==="custom"?{preset:e,cron:qe(t.cron).trim()||"0 6 * * *"}:{preset:"daily",cron:"0 6 * * *"}}function Eg(t){let e=t.req.param("workflow");return Jc.includes(e)?e:null}function nn(t){return Ei.find(e=>e.name===t)?.title??t}function fO(t){return t.split(/[_:-]/).filter(Boolean).map(e=>`${e[0]?.toUpperCase()??""}${e.slice(1)}`).join(" ")}function Gc(t){return HR.parse(t,{async:!1})}function mO(t){return t==="done"||t==="pr_ready"||t==="merged"}function pO(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}function hO(t,e){return t.split(`
1583
1583
  `).slice(0,e).join(`
1584
- `)}function _O(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function qe(t){return typeof t=="string"?t:""}function gO(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 qc(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function yi(t,e){return Number(t.req.param(e))}var Ei,Hc,xg=E(()=>{"use strict";Qn();vt();kc();Ei=[{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."}],Hc=Ei.map(t=>t.name)});function yO(t){return t.replace(/^\/+/,"")}function jg(t){return typeof t=="string"&&t!==""&&!t.includes("/")&&!t.includes("\\")}function sn(t){if(t.mailboxKey!==void 0&&t.mailboxKey!==null&&t.mailboxKey!==""){let e=yO(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 jg(t.userId)&&jg(t.deviceId)?`${t.userId}/${t.deviceId}/`:`${wO}/${t.identityId}/`}function bO(t){return String(Math.max(0,Math.floor(t))).padStart(EO,"0")}function Gc(t,e,r){return`${t}${e}${bO(r)}.json`}function bi(t,e){return`${t}${e}`}function Ti(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 wO,EO,Si=E(()=>{"use strict";wO="mailbox";EO=12});function At(t,e){let r=Math.floor(t),n="",s=r;for(let u=0;u<12;u++)n=ki[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=ki[a&15]+i,a=a>>4;let l=ki[8|Math.floor(e()*4)&3],c="";for(let u=0;u<15;u++)c+=ki[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 ki,vi=E(()=>{"use strict";ki="0123456789abcdef"});function Kc(t,e){return!Number.isFinite(t)||t<=0?e:t}function Yc(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 Cg(t){return t.conversation_id===Lg&&kO(t.payload)}function kO(t){return typeof t=="object"&&t!==null&&t.kind==="heartbeat"}function vO(t){let e=typeof t.hb=="string"&&t.hb!==""?t.hb:Cg(t)?t.timestamp:void 0;if(e===void 0)return;let r=Date.parse(e);return Number.isFinite(r)?r:void 0}var Ag,Rg,Og,TO,Lg,SO,Vc,Tr,Ii=E(()=>{"use strict";Si();vi();Ag=3e3,Rg=1e4,Og=12e3,TO=1e3,Lg="__lmctl_heartbeat__",SO={kind:"heartbeat"},Vc={setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t)},Tr=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=sn({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=Kc(e.readIntervalMs??e.pollIntervalMs??Ag,Ag),this.heartbeatIdleMs=Kc(e.heartbeatIdleMs??Rg,Rg),this.backoffReadIntervalMs=Kc(e.backoffReadIntervalMs??e.pollIntervalMs??Og,Og)}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??Vc;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=bi(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:TO,...s!==void 0&&{ContinuationToken:s}}));this.opts.onS3Op?.("list");for(let i of o.Contents??[]){let a=Ti(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:At(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=Gc(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??Vc;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=Gc(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(Yc(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),Cg(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=vO(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??Vc;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(Lg,SO)}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 IO}from"@hono/node-server/conninfo";function Mg(t,e){let r=e.bucket??$O,n=e.remoteAddressOf??(o=>xO(o)),s=o=>{let i=n(o);return jO(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=zc(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 Yc(l)?o.json({error:"not_found"},404):o.json({error:"internal",message:Zc(l)},500)}}),t.put("/local-mailbox/object",async o=>{let i=s(o);if(i!==null)return i;let a=zc(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:Zc(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=zc(a,{allowEmpty:!0});if(typeof l!="string")return o.json({error:"bad_request",message:l.error},400);let c=NO(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:Zc(d)},500)}})}function zc(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 NO(t){if(t===void 0||t==="")return;let e=Number(t);return Number.isInteger(e)&&e>0?e:void 0}function xO(t){try{return IO(t).remote.address}catch{return}}function jO(t){return t===void 0||t===""?!1:!!(t==="127.0.0.1"||t==="::1"||t.startsWith("::ffff:127.")||t.startsWith("127."))}function Zc(t){return t instanceof Error?t.message:String(t)}var $O,Dg=E(()=>{"use strict";Ii();$O="local"});function Pg(t,e){t.get("/mailbox/workspace",r=>OO(r,e)),t.get("/mailbox/projects",r=>LO(r,e)),t.get("/mailbox/projects/:id",r=>CO(r,e)),t.post("/mailbox/projects",r=>MO(r,e)),t.patch("/mailbox/projects/:id",r=>DO(r,e)),t.delete("/mailbox/projects/:id",r=>PO(r,e)),t.post("/mailbox/projects/:project_id/prompts",r=>FO(r,e)),t.get("/mailbox/prompts/:id",r=>UO(r,e))}function OO(t,e){e.dal.ensureWorkspace({id:an,name:Qc});let r=Fg(e.dal),n={id:an,name:Qc,created_at:RO,projects:r};return t.json({workspace:n})}function LO(t,e){return t.json({projects:Fg(e.dal)})}function CO(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(on)){let s=eu(e.dal,r);return s===null||s.deleted_at!==null?t.json({project:null},404):t.json({project:xi(s)})}let n=Wg(e.dal,r);return n===null?t.json({project:null},404):t.json({project:Ug(n)})}async function MO(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:an,name:Qc});let s=e.dal.insertWebProject({workspace_id:an,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:xi(s)},201)}async function DO(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(on)){let o=eu(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:xi(i)})}return t.json({error:"project_not_found",message:`project not found: ${r}`},404)}function PO(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(on)){let n=eu(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 FO(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=Wg(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=`${AO}${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 WO({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:`${Ni}${i.id}`,text:s.text,status:"pending",created_at:new Date().toISOString(),completed_at:null};return t.json({prompt:d},201)}function UO(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=BO(e.dal,r);return t.json({result:n})}function Fg(t){let e=t.listProjects().map(Ug),r=t.listWebProjectsActive(an).map(xi);return[...e,...r].sort(ZO)}function Ug(t){return{id:`${Ni}${t.id}`,workspace_id:an,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 xi(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:`${on}${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 eu(t,e){if(!e.startsWith(on))return null;let r=e.slice(on.length),n=Number.parseInt(r,10);return!Number.isFinite(n)||String(n)!==r?null:t.getWebProject(n)}function Wg(t,e){if(e.startsWith(Ni)){let n=e.slice(Ni.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 WO(t){let{enqueueManual:e}=await Promise.resolve().then(()=>(fc(),ph));return{id:e(t.dal,{project_id:t.project_id,source_ref:t.source_ref,payload:t.payload}).id}}function BO(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=KO(t,o?.team_id??null),a=VO(s),l=YO(n,a,i.length>0),c=zO(r.created_at,s),u=o===null?{totalEstimatedMs:void 0,perStep:new Map}:qO(t,o.workflow_name),d=u.totalEstimatedMs,f=Bg(r.created_at),m=o?.workflow_name,p=u.perStep.size>0?u.perStep.size:void 0,h=s===null?[]:HO(t,s.id),g=JO(s,a,h,u.perStep,i),_=XO(h,u.perStep),T=GO(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),...T},errors_json:{error:n.last_error??"job_failed",job_id:n.id,run_id:s?.id??null},duration_ms:c}:l==="done"?(r.completed_at===null&&t.setPromptDispatchCompleted(e),{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,terminal_state:s?.terminal_state??null,text:r.text,...$i(d,f),...T},errors_json:null,duration_ms:c}):l==="paused"?{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,attempt_count:n.attempt_count,paused_step:a,attention_needed:i,...$i(d,f),...T},errors_json:null,duration_ms:c}:{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,attempt_count:n.attempt_count,...$i(d,f),...T},errors_json:null,duration_ms:c}}function qO(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 HO(t,e){try{return t.listStepsForRun(e)}catch{return[]}}function JO(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=Bg(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 XO(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 GO(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 Bg(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 VO(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 KO(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 zO(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 ZO(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 Ni,on,AO,an,Qc,RO,qg=E(()=>{"use strict";Ni="project:",on="web_project:",AO="prompt:",an="default",Qc="Default workspace",RO=new Date(0).toISOString()});import{Buffer as Hg}from"node:buffer";function Jg(t,e,r){if(typeof t=="number"&&Number.isFinite(t)&&t>0)return t;if(e!==void 0&&e!==""){let n=Number(e);if(Number.isFinite(n)&&n>0)return n}return r}function Xg(t){return tL[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 QO,eL,ji,tL,tu=E(()=>{"use strict";QO=1e4,eL=256*1024,ji=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=Jg(e.pushWindowMs,process.env.LMCTL_TERMINAL_PUSH_WINDOW_MS,QO),this.pushByteCap=Jg(e.pushByteCap,process.env.LMCTL_TERMINAL_PUSH_BYTE_CAP,eL),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+=Hg.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=${Hg.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 _O(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function qe(t){return typeof t=="string"?t:""}function gO(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 Hc(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function yi(t,e){return Number(t.req.param(e))}var Ei,Jc,xg=E(()=>{"use strict";Qn();vt();vc();Ei=[{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."}],Jc=Ei.map(t=>t.name)});function yO(t){return t.replace(/^\/+/,"")}function jg(t){return typeof t=="string"&&t!==""&&!t.includes("/")&&!t.includes("\\")}function sn(t){if(t.mailboxKey!==void 0&&t.mailboxKey!==null&&t.mailboxKey!==""){let e=yO(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 jg(t.userId)&&jg(t.deviceId)?`${t.userId}/${t.deviceId}/`:`${wO}/${t.identityId}/`}function bO(t){return String(Math.max(0,Math.floor(t))).padStart(EO,"0")}function Vc(t,e,r){return`${t}${e}${bO(r)}.json`}function bi(t,e){return`${t}${e}`}function Ti(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 wO,EO,Si=E(()=>{"use strict";wO="mailbox";EO=12});function At(t,e){let r=Math.floor(t),n="",s=r;for(let u=0;u<12;u++)n=ki[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=ki[a&15]+i,a=a>>4;let l=ki[8|Math.floor(e()*4)&3],c="";for(let u=0;u<15;u++)c+=ki[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 ki,vi=E(()=>{"use strict";ki="0123456789abcdef"});function Yc(t,e){return!Number.isFinite(t)||t<=0?e:t}function zc(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 Cg(t){return t.conversation_id===Lg&&kO(t.payload)}function kO(t){return typeof t=="object"&&t!==null&&t.kind==="heartbeat"}function vO(t){let e=typeof t.hb=="string"&&t.hb!==""?t.hb:Cg(t)?t.timestamp:void 0;if(e===void 0)return;let r=Date.parse(e);return Number.isFinite(r)?r:void 0}var Ag,Rg,Og,TO,Lg,SO,Kc,Tr,Ii=E(()=>{"use strict";Si();vi();Ag=3e3,Rg=1e4,Og=12e3,TO=1e3,Lg="__lmctl_heartbeat__",SO={kind:"heartbeat"},Kc={setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t)},Tr=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=sn({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=Yc(e.readIntervalMs??e.pollIntervalMs??Ag,Ag),this.heartbeatIdleMs=Yc(e.heartbeatIdleMs??Rg,Rg),this.backoffReadIntervalMs=Yc(e.backoffReadIntervalMs??e.pollIntervalMs??Og,Og)}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??Kc;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=bi(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:TO,...s!==void 0&&{ContinuationToken:s}}));this.opts.onS3Op?.("list");for(let i of o.Contents??[]){let a=Ti(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:At(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=Vc(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??Kc;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=Vc(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(zc(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),Cg(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=vO(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??Kc;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(Lg,SO)}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 IO}from"@hono/node-server/conninfo";function Mg(t,e){let r=e.bucket??$O,n=e.remoteAddressOf??(o=>xO(o)),s=o=>{let i=n(o);return jO(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=Zc(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 zc(l)?o.json({error:"not_found"},404):o.json({error:"internal",message:Qc(l)},500)}}),t.put("/local-mailbox/object",async o=>{let i=s(o);if(i!==null)return i;let a=Zc(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:Qc(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=Zc(a,{allowEmpty:!0});if(typeof l!="string")return o.json({error:"bad_request",message:l.error},400);let c=NO(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:Qc(d)},500)}})}function Zc(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 NO(t){if(t===void 0||t==="")return;let e=Number(t);return Number.isInteger(e)&&e>0?e:void 0}function xO(t){try{return IO(t).remote.address}catch{return}}function jO(t){return t===void 0||t===""?!1:!!(t==="127.0.0.1"||t==="::1"||t.startsWith("::ffff:127.")||t.startsWith("127."))}function Qc(t){return t instanceof Error?t.message:String(t)}var $O,Dg=E(()=>{"use strict";Ii();$O="local"});function Pg(t,e){t.get("/mailbox/workspace",r=>OO(r,e)),t.get("/mailbox/projects",r=>LO(r,e)),t.get("/mailbox/projects/:id",r=>CO(r,e)),t.post("/mailbox/projects",r=>MO(r,e)),t.patch("/mailbox/projects/:id",r=>DO(r,e)),t.delete("/mailbox/projects/:id",r=>PO(r,e)),t.post("/mailbox/projects/:project_id/prompts",r=>FO(r,e)),t.get("/mailbox/prompts/:id",r=>UO(r,e))}function OO(t,e){e.dal.ensureWorkspace({id:an,name:eu});let r=Fg(e.dal),n={id:an,name:eu,created_at:RO,projects:r};return t.json({workspace:n})}function LO(t,e){return t.json({projects:Fg(e.dal)})}function CO(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(on)){let s=tu(e.dal,r);return s===null||s.deleted_at!==null?t.json({project:null},404):t.json({project:xi(s)})}let n=Wg(e.dal,r);return n===null?t.json({project:null},404):t.json({project:Ug(n)})}async function MO(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:an,name:eu});let s=e.dal.insertWebProject({workspace_id:an,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:xi(s)},201)}async function DO(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(on)){let o=tu(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:xi(i)})}return t.json({error:"project_not_found",message:`project not found: ${r}`},404)}function PO(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(on)){let n=tu(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 FO(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=Wg(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=`${AO}${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 WO({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:`${Ni}${i.id}`,text:s.text,status:"pending",created_at:new Date().toISOString(),completed_at:null};return t.json({prompt:d},201)}function UO(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=BO(e.dal,r);return t.json({result:n})}function Fg(t){let e=t.listProjects().map(Ug),r=t.listWebProjectsActive(an).map(xi);return[...e,...r].sort(ZO)}function Ug(t){return{id:`${Ni}${t.id}`,workspace_id:an,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 xi(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:`${on}${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 tu(t,e){if(!e.startsWith(on))return null;let r=e.slice(on.length),n=Number.parseInt(r,10);return!Number.isFinite(n)||String(n)!==r?null:t.getWebProject(n)}function Wg(t,e){if(e.startsWith(Ni)){let n=e.slice(Ni.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 WO(t){let{enqueueManual:e}=await Promise.resolve().then(()=>(mc(),ph));return{id:e(t.dal,{project_id:t.project_id,source_ref:t.source_ref,payload:t.payload}).id}}function BO(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=KO(t,o?.team_id??null),a=VO(s),l=YO(n,a,i.length>0),c=zO(r.created_at,s),u=o===null?{totalEstimatedMs:void 0,perStep:new Map}:qO(t,o.workflow_name),d=u.totalEstimatedMs,f=Bg(r.created_at),m=o?.workflow_name,p=u.perStep.size>0?u.perStep.size:void 0,h=s===null?[]:HO(t,s.id),g=JO(s,a,h,u.perStep,i),_=XO(h,u.perStep),T=GO(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),...T},errors_json:{error:n.last_error??"job_failed",job_id:n.id,run_id:s?.id??null},duration_ms:c}:l==="done"?(r.completed_at===null&&t.setPromptDispatchCompleted(e),{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,terminal_state:s?.terminal_state??null,text:r.text,...$i(d,f),...T},errors_json:null,duration_ms:c}):l==="paused"?{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,attempt_count:n.attempt_count,paused_step:a,attention_needed:i,...$i(d,f),...T},errors_json:null,duration_ms:c}:{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,attempt_count:n.attempt_count,...$i(d,f),...T},errors_json:null,duration_ms:c}}function qO(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 HO(t,e){try{return t.listStepsForRun(e)}catch{return[]}}function JO(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=Bg(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 XO(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 GO(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 Bg(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 VO(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 KO(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 zO(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 ZO(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 Ni,on,AO,an,eu,RO,qg=E(()=>{"use strict";Ni="project:",on="web_project:",AO="prompt:",an="default",eu="Default workspace",RO=new Date(0).toISOString()});import{Buffer as Hg}from"node:buffer";function Jg(t,e,r){if(typeof t=="number"&&Number.isFinite(t)&&t>0)return t;if(e!==void 0&&e!==""){let n=Number(e);if(Number.isFinite(n)&&n>0)return n}return r}function Xg(t){return tL[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 QO,eL,ji,tL,ru=E(()=>{"use strict";QO=1e4,eL=256*1024,ji=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=Jg(e.pushWindowMs,process.env.LMCTL_TERMINAL_PUSH_WINDOW_MS,QO),this.pushByteCap=Jg(e.pushByteCap,process.env.LMCTL_TERMINAL_PUSH_BYTE_CAP,eL),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+=Hg.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=${Hg.byteLength(n,"utf8")}`)}catch(o){this.opts.log?.(`[dt-2] publish failed session=${e.session_id} reason=${r}: ${o instanceof Error?o.message:String(o)}`)}}async onPtyExit(e,r){if(e.closed)return;await this.flush(e,"pty_exit");let n=`\r
1585
1585
  [process exited with code ${r.exitCode}${r.signal!==void 0?` signal ${r.signal}`:""}]\r
1586
- `,s={kind:"terminal",session_id:e.session_id,direction:"agent_to_user",data:n,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s)}catch(o){this.opts.log?.(`[dt-2] publish (exit) failed session=${e.session_id}: ${o instanceof Error?o.message:String(o)}`)}e.closed=!0,this.sessions.delete(e.session_id)}};tL={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 Kg(t,e){t.post("/mailbox/terminal/launch",r=>rL(r,e)),t.post("/mailbox/terminal/end/:session_id",r=>nL(r,e)),t.get("/mailbox/terminal/sessions",r=>sL(r,e))}async function rL(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"||!Vg.test(s))return t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let o=n.provider;if(typeof o!="string"||o==="")return t.json({error:"bad_request",message:"provider is required"},400);let i;if(typeof n.command_line=="string"&&n.command_line.trim()!==""){if(i=Gg(n.command_line),i===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=Xg(o);if(a===void 0)return t.json({error:"no_default_for_provider",message:`no 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 nL(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||!Vg.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 sL(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 Vg,Yg=E(()=>{"use strict";tu();Vg=/^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i});import{Buffer as oL}from"node:buffer";function lL(t){try{return oL.byteLength(JSON.stringify(t),"utf8")}catch{return 256}}function zg(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 Zg(t){return cL[t]}function Qg(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 iL,aL,Ai,cL,ru=E(()=>{"use strict";iL=2e3,aL=64*1024,Ai=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=zg(e.pushWindowMs,process.env.LMCTL_PROVIDER_PUSH_WINDOW_MS,iL),this.pushByteCap=zg(e.pushByteCap,process.env.LMCTL_PROVIDER_PUSH_BYTE_CAP,aL),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=lL(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")))})}};cL={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 tw(t,e){t.post("/mailbox/chat/launch",r=>uL(r,e)),t.post("/mailbox/chat/end/:session_id",r=>dL(r,e)),t.get("/mailbox/chat/sessions",r=>fL(r,e))}async function uL(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"||!ew.test(s))return t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let o=n.provider;if(typeof o!="string"||o==="")return t.json({error:"bad_request",message:"provider is required"},400);let i;if(typeof n.command_line=="string"&&n.command_line.trim()!==""){if(i=Qg(n.command_line),i===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=Zg(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 dL(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||!ew.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 fL(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 ew,rw=E(()=>{"use strict";ru();ew=/^[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 mL}from"node:fs";function sw(t){let e=t.artifacts.find(r=>r.kind===`${t.state_name}_transcript`);if(e?.content!==void 0&&e.content!==null)return nw(e.content);if(e?.path===void 0||e.path===null)return[];try{let r=mL(e.path,{encoding:"utf8"});return nw(r)}catch{return[]}}function nw(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 ow=E(()=>{"use strict"});function iw(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 Ri(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)}};tL={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 Kg(t,e){t.post("/mailbox/terminal/launch",r=>rL(r,e)),t.post("/mailbox/terminal/end/:session_id",r=>nL(r,e)),t.get("/mailbox/terminal/sessions",r=>sL(r,e))}async function rL(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"||!Vg.test(s))return t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let o=n.provider;if(typeof o!="string"||o==="")return t.json({error:"bad_request",message:"provider is required"},400);let i;if(typeof n.command_line=="string"&&n.command_line.trim()!==""){if(i=Gg(n.command_line),i===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=Xg(o);if(a===void 0)return t.json({error:"no_default_for_provider",message:`no 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 nL(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||!Vg.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 sL(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 Vg,Yg=E(()=>{"use strict";ru();Vg=/^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i});import{Buffer as oL}from"node:buffer";function lL(t){try{return oL.byteLength(JSON.stringify(t),"utf8")}catch{return 256}}function zg(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 Zg(t){return cL[t]}function Qg(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 iL,aL,Ai,cL,nu=E(()=>{"use strict";iL=2e3,aL=64*1024,Ai=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=zg(e.pushWindowMs,process.env.LMCTL_PROVIDER_PUSH_WINDOW_MS,iL),this.pushByteCap=zg(e.pushByteCap,process.env.LMCTL_PROVIDER_PUSH_BYTE_CAP,aL),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=lL(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")))})}};cL={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 tw(t,e){t.post("/mailbox/chat/launch",r=>uL(r,e)),t.post("/mailbox/chat/end/:session_id",r=>dL(r,e)),t.get("/mailbox/chat/sessions",r=>fL(r,e))}async function uL(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"||!ew.test(s))return t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let o=n.provider;if(typeof o!="string"||o==="")return t.json({error:"bad_request",message:"provider is required"},400);let i;if(typeof n.command_line=="string"&&n.command_line.trim()!==""){if(i=Qg(n.command_line),i===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=Zg(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 dL(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||!ew.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 fL(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 ew,rw=E(()=>{"use strict";nu();ew=/^[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 mL}from"node:fs";function sw(t){let e=t.artifacts.find(r=>r.kind===`${t.state_name}_transcript`);if(e?.content!==void 0&&e.content!==null)return nw(e.content);if(e?.path===void 0||e.path===null)return[];try{let r=mL(e.path,{encoding:"utf8"});return nw(r)}catch{return[]}}function nw(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 ow=E(()=>{"use strict"});function iw(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 Ri(t,e){let r=t.query(`SELECT id, kind FROM attention
1587
1587
  WHERE run_id = ?
1588
1588
  AND acknowledged_at IS NULL
1589
1589
  AND requires_user = 1
1590
- ORDER BY id DESC LIMIT 1`,e);return r.length===0?null:{kind:r[0].kind,attention_id:r[0].id}}var Oi=E(()=>{"use strict"});function _w(t,e){t.all("/runtime/*",r=>pL(r.req.raw,e))}async function pL(t,e){try{return Response.json(await hL(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 hL(t,e){let r=new URL(t.url),n=TL(e),s=r.pathname.split("/").filter(Boolean).map(decodeURIComponent);if(t.method==="GET"&&r.pathname==="/runtime/workspaces")return nu(t),[{id:n.id,name:n.name}];if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="workspaces")return Li(t,n.id,s[2]),_L(e.dal,n);if(t.method==="GET"&&s.length===5&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"){Li(t,n.id,s[2]);let o=lw(e.dal,s[4]);return aw(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/lead-teams")return nu(t),e.dal.listTeams().map(o=>bL(o));if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="chat"){let o=cw(e.dal,uw(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 fw(t,n.id,i.context),dw(o,i.context)}if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="messages"){let o=cw(e.dal,uw(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");fw(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 dw(o,i.context,a)}if(t.method==="POST"&&s.length===6&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"&&s[5]==="workflow-message"){Li(t,n.id,s[2]);let o=lw(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 yL(e.dal,o,a),aw(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/templates")return es(t,n.id),e.dal.listWorkflows().map(o=>SL(o));if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="templates"){es(t,n.id);let o=vL(e.dal,s[2]);return kL(o)}if(t.method==="GET"&&r.pathname==="/runtime/runs"){es(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 IL(e.dal,o,i).map(l=>pw(e.dal,l))}if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="runs"){es(t,n.id);let o=mw(e.dal,s[2]);return pw(e.dal,o)}if(t.method==="GET"&&s.length===4&&s[0]==="runtime"&&s[1]==="runs"&&s[3]==="events"){es(t,n.id);let o=mw(e.dal,s[2]),i=NL(e.dal,o);return{runId:lu(o),events:i,...i.length>0?{cursor:i[i.length-1].id}:{}}}throw new se(404,`unknown runtime request: ${t.method} ${r.pathname}`)}function _L(t,e){return{id:e.id,name:e.name,projects:t.listProjects().map(r=>gw(t,e,r))}}function aw(t,e,r){let n=gw(t,e,r);return{...n,managedWorkflow:{...n.managedWorkflow,instance:gL(t,r),composerTarget:{kind:"workflow-initial",label:`Project Workflow: ${r.workflow_name}`,templateId:`template:${r.workflow_name}`,runId:n.managedWorkflow.runId}},workflowMessages:wL(t,r)}}function gw(t,e,r){let n=ww(t,r.id),s=ou(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 gL(t,e){let r=ww(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:ou(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 wL(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 yL(t,e,r){let n=EL(t,e.id);if(n!==null){let s=Ri(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 ww(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 EL(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 ou(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 lw(t,e){let r=t.findProjectByName(e);if(r===null)throw new se(404,`project not found: ${e}`);return r}function cw(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 uw(t){return t.startsWith("team:")?t.slice(5):t}function bL(t){return{id:`team:${t.name}`,name:t.name,teamfile:"",hasLead:!0,kind:t.name.toLowerCase().includes("manager")?"global-manager":"custom-ai-led"}}function dw(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??hw}`,teamId:`team:${t.name}`,title:`${t.name} Lead`,messages:s,...e===void 0?{}:{context:e}}}function TL(t){let e=t.workspaceName??hn()??sr.default;return{id:e,name:e}}function nu(t){if(t.headers.get("x-lmctl-workspace-id")!==hw)throw new se(400,"runtime request requires global-admin workspace identity")}function Li(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 es(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 fw(t,e,r){if(r?.scope==="workspace"){if(r.workspaceId===void 0)throw new se(400,"workspace manager context requires workspace identity");Li(t,e,r.workspaceId);return}nu(t)}function iu(t){return`${ln}${au(t.name)}`}function au(t){return t.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"item"}function lu(t){return`${su}${t.id}`}function SL(t){let e=Ci(t.definition);return{id:iu(t),name:t.name,...e.description===null?{}:{description:e.description}}}function kL(t){let e=Ci(t.definition);return{id:iu(t),name:t.name,...e.description===null?{}:{description:e.description},graph:e.graph}}function Ci(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 vL(t,e){if(!e.startsWith(ln))throw new se(404,`template not found: ${e}`);let r=e.slice(ln.length),n=t.listWorkflows().filter(s=>au(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 mw(t,e){if(!e.startsWith(su))throw new se(404,`run not found: ${e}`);let r=e.slice(su.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 IL(t,e,r){if(r!==null){if(!r.startsWith(ln))return[];let s=r.slice(ln.length),o=t.listWorkflows().filter(a=>au(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 pw(t,e){let r=t.getWorkflow(e.workflow_id),n=ou(e),s=$L(r,e);return{id:lu(e),templateId:r===null?`${ln}unknown`:iu(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 $L(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]:[Ci(t.definition).nameToId.get(r)??r]}function NL(t,e){let r=t.getWorkflow(e.workflow_id),n=r===null?{stepIds:[],nameToId:new Map}:Ci(r.definition),s=c=>n.nameToId.get(c)??c,o=lu(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=xL(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 xL(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 hw,ln,su,se,yw=E(()=>{"use strict";He();Oi();vt();hw="global-admin";ln="template:",su="run:";se=class extends Error{status;constructor(e,r){super(r),this.status=e}}});import{mkdirSync as jL,writeFileSync as AL}from"node:fs";import{randomUUID as Ew}from"node:crypto";import{dirname as RL,resolve as Mi,sep as bw}from"node:path";async function Sw(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(!DL(n))return t.text("missing image file",400);if(n.size>OL)return t.text("upload too large",413);let s=Buffer.from(await n.arrayBuffer()),o=PL(s);if(o===null||!(o in Tw))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=LL(e,r.project);if(typeof i=="string")return t.text(i,404);let a=i===null?Mi(ML()):Mi(i.local_path),l=Mi(a,"uploads",Ew()),c=Mi(l,`${Ew()}${Tw[o]}`);if(!CL(c,a))return t.text("invalid upload path",400);jL(l,{recursive:!0});let u=new Uint8Array(s.buffer,s.byteOffset,s.byteLength);AL(c,u);let d={path:c,size:s.byteLength,mime:o,project:i?.name??null};return t.json(d)}function LL(t,e){return e==null||e===""?null:typeof e!="string"?"invalid project":t.findProjectByName(e)??`project not found: ${e}`}function CL(t,e){let r=e.endsWith(bw)?e:`${e}${bw}`;return t.startsWith(r)}function ML(){return RL(de())}function DL(t){return typeof File<"u"&&t instanceof File}function PL(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 OL,Tw,kw=E(()=>{"use strict";He();OL=10*1024*1024,Tw={"image/png":".png","image/jpeg":".jpg","image/webp":".webp","image/heic":".heic","application/pdf":".pdf"}});import{existsSync as Di}from"node:fs";import{basename as FL,dirname as UL,extname as WL,isAbsolute as BL,join as qL,relative as HL}from"node:path";import{fileURLToPath as JL}from"node:url";import{Hono as XL}from"hono";import{serveStatic as ft}from"@hono/node-server/serve-static";function Aw(t){let e=new XL,r=[],n=t.localWebui!==void 0?uu(t.localWebui.webuiDir):GL();if(t.localWebui!==void 0&&Mg(e,{s3:t.localWebui.localMailbox.s3,commands:t.localWebui.localMailbox.commands}),n!==null){let s=VL();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("*",bh()),e.get("/login",s=>s.html($e("Login",`
1590
+ ORDER BY id DESC LIMIT 1`,e);return r.length===0?null:{kind:r[0].kind,attention_id:r[0].id}}var Oi=E(()=>{"use strict"});function _w(t,e){t.all("/runtime/*",r=>pL(r.req.raw,e))}async function pL(t,e){try{return Response.json(await hL(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 hL(t,e){let r=new URL(t.url),n=TL(e),s=r.pathname.split("/").filter(Boolean).map(decodeURIComponent);if(t.method==="GET"&&r.pathname==="/runtime/workspaces")return su(t),[{id:n.id,name:n.name}];if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="workspaces")return Li(t,n.id,s[2]),_L(e.dal,n);if(t.method==="GET"&&s.length===5&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"){Li(t,n.id,s[2]);let o=lw(e.dal,s[4]);return aw(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/lead-teams")return su(t),e.dal.listTeams().map(o=>bL(o));if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="chat"){let o=cw(e.dal,uw(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 fw(t,n.id,i.context),dw(o,i.context)}if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="messages"){let o=cw(e.dal,uw(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");fw(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 dw(o,i.context,a)}if(t.method==="POST"&&s.length===6&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"&&s[5]==="workflow-message"){Li(t,n.id,s[2]);let o=lw(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 yL(e.dal,o,a),aw(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/templates")return es(t,n.id),e.dal.listWorkflows().map(o=>SL(o));if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="templates"){es(t,n.id);let o=vL(e.dal,s[2]);return kL(o)}if(t.method==="GET"&&r.pathname==="/runtime/runs"){es(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 IL(e.dal,o,i).map(l=>pw(e.dal,l))}if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="runs"){es(t,n.id);let o=mw(e.dal,s[2]);return pw(e.dal,o)}if(t.method==="GET"&&s.length===4&&s[0]==="runtime"&&s[1]==="runs"&&s[3]==="events"){es(t,n.id);let o=mw(e.dal,s[2]),i=NL(e.dal,o);return{runId:cu(o),events:i,...i.length>0?{cursor:i[i.length-1].id}:{}}}throw new se(404,`unknown runtime request: ${t.method} ${r.pathname}`)}function _L(t,e){return{id:e.id,name:e.name,projects:t.listProjects().map(r=>gw(t,e,r))}}function aw(t,e,r){let n=gw(t,e,r);return{...n,managedWorkflow:{...n.managedWorkflow,instance:gL(t,r),composerTarget:{kind:"workflow-initial",label:`Project Workflow: ${r.workflow_name}`,templateId:`template:${r.workflow_name}`,runId:n.managedWorkflow.runId}},workflowMessages:wL(t,r)}}function gw(t,e,r){let n=ww(t,r.id),s=iu(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 gL(t,e){let r=ww(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:iu(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 wL(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 yL(t,e,r){let n=EL(t,e.id);if(n!==null){let s=Ri(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 ww(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 EL(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 iu(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 lw(t,e){let r=t.findProjectByName(e);if(r===null)throw new se(404,`project not found: ${e}`);return r}function cw(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 uw(t){return t.startsWith("team:")?t.slice(5):t}function bL(t){return{id:`team:${t.name}`,name:t.name,teamfile:"",hasLead:!0,kind:t.name.toLowerCase().includes("manager")?"global-manager":"custom-ai-led"}}function dw(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??hw}`,teamId:`team:${t.name}`,title:`${t.name} Lead`,messages:s,...e===void 0?{}:{context:e}}}function TL(t){let e=t.workspaceName??hn()??or.default;return{id:e,name:e}}function su(t){if(t.headers.get("x-lmctl-workspace-id")!==hw)throw new se(400,"runtime request requires global-admin workspace identity")}function Li(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 es(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 fw(t,e,r){if(r?.scope==="workspace"){if(r.workspaceId===void 0)throw new se(400,"workspace manager context requires workspace identity");Li(t,e,r.workspaceId);return}su(t)}function au(t){return`${ln}${lu(t.name)}`}function lu(t){return t.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"item"}function cu(t){return`${ou}${t.id}`}function SL(t){let e=Ci(t.definition);return{id:au(t),name:t.name,...e.description===null?{}:{description:e.description}}}function kL(t){let e=Ci(t.definition);return{id:au(t),name:t.name,...e.description===null?{}:{description:e.description},graph:e.graph}}function Ci(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 vL(t,e){if(!e.startsWith(ln))throw new se(404,`template not found: ${e}`);let r=e.slice(ln.length),n=t.listWorkflows().filter(s=>lu(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 mw(t,e){if(!e.startsWith(ou))throw new se(404,`run not found: ${e}`);let r=e.slice(ou.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 IL(t,e,r){if(r!==null){if(!r.startsWith(ln))return[];let s=r.slice(ln.length),o=t.listWorkflows().filter(a=>lu(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 pw(t,e){let r=t.getWorkflow(e.workflow_id),n=iu(e),s=$L(r,e);return{id:cu(e),templateId:r===null?`${ln}unknown`:au(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 $L(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]:[Ci(t.definition).nameToId.get(r)??r]}function NL(t,e){let r=t.getWorkflow(e.workflow_id),n=r===null?{stepIds:[],nameToId:new Map}:Ci(r.definition),s=c=>n.nameToId.get(c)??c,o=cu(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=xL(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 xL(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 hw,ln,ou,se,yw=E(()=>{"use strict";He();Oi();vt();hw="global-admin";ln="template:",ou="run:";se=class extends Error{status;constructor(e,r){super(r),this.status=e}}});import{mkdirSync as jL,writeFileSync as AL}from"node:fs";import{randomUUID as Ew}from"node:crypto";import{dirname as RL,resolve as Mi,sep as bw}from"node:path";async function Sw(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(!DL(n))return t.text("missing image file",400);if(n.size>OL)return t.text("upload too large",413);let s=Buffer.from(await n.arrayBuffer()),o=PL(s);if(o===null||!(o in Tw))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=LL(e,r.project);if(typeof i=="string")return t.text(i,404);let a=i===null?Mi(ML()):Mi(i.local_path),l=Mi(a,"uploads",Ew()),c=Mi(l,`${Ew()}${Tw[o]}`);if(!CL(c,a))return t.text("invalid upload path",400);jL(l,{recursive:!0});let u=new Uint8Array(s.buffer,s.byteOffset,s.byteLength);AL(c,u);let d={path:c,size:s.byteLength,mime:o,project:i?.name??null};return t.json(d)}function LL(t,e){return e==null||e===""?null:typeof e!="string"?"invalid project":t.findProjectByName(e)??`project not found: ${e}`}function CL(t,e){let r=e.endsWith(bw)?e:`${e}${bw}`;return t.startsWith(r)}function ML(){return RL(de())}function DL(t){return typeof File<"u"&&t instanceof File}function PL(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 OL,Tw,kw=E(()=>{"use strict";He();OL=10*1024*1024,Tw={"image/png":".png","image/jpeg":".jpg","image/webp":".webp","image/heic":".heic","application/pdf":".pdf"}});import{existsSync as Di}from"node:fs";import{basename as FL,dirname as UL,extname as WL,isAbsolute as BL,join as qL,relative as HL}from"node:path";import{fileURLToPath as JL}from"node:url";import{Hono as XL}from"hono";import{serveStatic as ft}from"@hono/node-server/serve-static";function Aw(t){let e=new XL,r=[],n=t.localWebui!==void 0?du(t.localWebui.webuiDir):GL();if(t.localWebui!==void 0&&Mg(e,{s3:t.localWebui.localMailbox.s3,commands:t.localWebui.localMailbox.commands}),n!==null){let s=VL();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("*",bh()),e.get("/login",s=>s.html($e("Login",`
1591
1591
  <h1>Login</h1>
1592
1592
  <form method="post" action="/login">
1593
1593
  <label>Token <input name="token" type="password"></label>
1594
1594
  <button type="submit">Login</button>
1595
1595
  </form>
1596
- `))),e.post("/login",async s=>{let o=await s.req.parseBody(),i=typeof o.token=="string"?o.token:"";return Sh(i)?(wc(s,i),s.redirect("/",302)):s.html($e("Login","<p>Invalid token</p>"),401)}),e.post("/logout",s=>(kh(s),s.redirect("/login",302))),bg(e,{dal:t.dal}),_w(e,{dal:t.dal}),Pg(e,{dal:t.dal}),Kg(e,{terminalSessionManager:t.terminalSessionManager}),tw(e,{persistentSessionManager:t.persistentSessionManager}),e.post("/api/teams/:team_name/refresh",async s=>{let o=jn(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 kl(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>`)}),Ah(e,{dal:t.dal}),Ph(e,{dal:t.dal}),e.get("/api/status",s=>U(s,mo(t.dal),tC)),e.get("/api/projects",s=>U(s,po(t.dal),rC)),e.get("/api/teams",s=>U(s,Xm(t.dal),oC)),e.get("/api/workflows",s=>U(s,ho(t.dal),iC)),e.get("/api/workflows/verify",s=>{let o=og();return s.req.header("accept")?.includes("text/plain")?s.text(ag(o)):s.json(o)}),e.get("/api/jobs",s=>U(s,Gm(t.dal,{status:s.req.query("status")}),aC)),e.post("/api/uploads",s=>Sw(s,t.dal)),e.get("/api/jobs/:id",s=>{let o=_o(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(()=>(Qn(),gg)),i=_o(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),nC)}),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 cn(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{Jt(u)}catch{return s.text("invalid condition",400)}let d=zL(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=Iw(s.req.query("status"),ZL);if(typeof i=="string")return s.text(i,400);let a=Iw(s.req.query("severity"),Ow);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")}:{}}),sC)}),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 cn(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=QL(i.severity);if(typeof c=="object")return s.text(c.error,400);let u=eC(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 cn(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 cn(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 cn(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 cn(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=pr(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=pr(t.dal,o,i);if(a.length===0)return s.notFound();let l=a[a.length-1],c=s.req.query("raw")==="true";if(l.content!==null&&l.content!==void 0)return c?s.text(l.content):U(s,l,le);if(l.path!==null&&l.path!==void 0){if(c)try{let{readFileSync:u}=await import("node:fs"),d=KL(l.path);if(YL(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=FL(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,Fr(t.dal,{limit:cu(s,"limit")??100}),lC)),e.get("/api/runs/:id",s=>{let o=mr(t.dal,Q(s,"id"));return o===null?s.notFound():U(s,o,cC)}),e.get("/api/runs/:id/where",s=>{let o=Ur(t.dal,Q(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(wo(o)):s.json(o)}),e.get("/api/runs/:id/timeline",s=>{let o=yo(t.dal,Q(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Eo(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?(Pi(t.daemon),U(s,i,$w)):U(s,i,$w,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?(Pi(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=>vw(s,t.dal,o=>U(s,o,dC))),e.get("/api/runs/:id/steps/:step_id/transcript",s=>{let o=zm(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=>vw(s,t.dal,o=>{let i=sw(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,Zm(t.dal,{type:s.req.query("type")}),fC)),e.get("/api/external-signals",s=>U(s,Qm(t.dal,{unhandled:s.req.query("unhandled")==="true"}),mC)),e.get("/api/attentions",s=>U(s,qt(t.dal,{unacked:s.req.query("unacked")==="true"}),pC)),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=go(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=qt(t.dal).find(m=>m.id===o);if(u===void 0)return s.notFound();if(u.kind==="workflow_escalation"){let m=t.dal.resumeEscalation(o,i);if(!m.resumed)return s.json({ok:!1,reason:m.reason},400);Pi(t.daemon);let p=qt(t.dal).find(h=>h.id===o);return s.json({ok:!0,attention_id:o,run_id:m.run.id,decision:i,session_status:"escalation_resumed",acknowledged_at:p?.acknowledged_at??null})}if(u.kind!=="interactive_waiting_operator")return s.json({ok:!1,reason:"wrong_kind",kind:u.kind},400);if(u.acknowledged_at!==null)return s.json({ok:!1,reason:"already_acked"},400);if(c.step_id===null)return s.json({ok:!1,reason:"no_step"},400);let d=t.dal.resumeInteractive(c.step_id,i,a);if(!d.resumed)return s.json({ok:!1,reason:d.reason,step_id:c.step_id},400);let f=t.dal.acknowledgeAttention(o);return Pi(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=Vm(t.dal,{status:i,pr_url:o});return U(s,a,hC)}),e.get("/api/submitted-prs/:id",s=>{let o=Q(s,"id"),i=Km(t.dal,o);return i===null?s.notFound():U(s,i,_C)}),e.get("/api/sessions",s=>U(s,t.dal.latestSessionSizes(),Nw)),e.get("/api/sessions/:team_name/:alias/history",s=>{let o=jn(s.req.param("team_name"));return U(s,t.dal.sessionSizeHistory(o,s.req.param("alias")),Nw)}),e.post("/api/sessions/:team_name/:alias/compact",async s=>{let o=jn(s.req.param("team_name"));try{let i=await Fm(t.dal,o,s.req.param("alias"));return U(s,i,a=>xw("compacted",a.row))}catch(i){if(i instanceof xn)return s.text(i.message,409);throw i}}),e.post("/api/sessions/:team_name/:alias/refresh",async s=>{let o=jn(s.req.param("team_name")),i=await kl(t.dal,o,s.req.param("alias"));return U(s,i,a=>xw(`refreshed ${a.sessionid}`,a.row))}),e.get("/api/intake/state",s=>U(s,r,jw)),e.post("/api/intake/scan",async s=>(r=await Zr(t.dal),U(s,r,jw))),e.get("/api/stats/run-throughput",s=>U(s,rp(t.dal),gC)),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=Al(t.dal,o),l=Rl(t.dal,{project_id:o});return s.html($e(`Metrics \u2014 ${i.name}`,yC(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=cu(s,"since_days");return s.json(Al(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=cu(s,"since_days");return s.json(Rl(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 vw(t,e,r){let n=jl(e,Q(t,"id"),Q(t,"step_id"));return n===null?t.notFound():r(n)}function Pi(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 GL(){let t=process.env.LMCTL_WEBUI_DIST;if(t!==void 0)return Di(`${t}/index.html`)?uu(t):null;let e="src/serve/webui-dist";if(Di(`${e}/index.html`))return e;let r="dist/serve/webui-dist";if(Di(`${r}/index.html`))return r;let n=qL(UL(JL(import.meta.url)),"webui-dist");return Di(`${n}/index.html`)?uu(n):null}function uu(t){if(!BL(t))return t;let e=HL(process.cwd(),t);return e.length===0?".":e}function VL(){return async(t,e)=>{await e(),t.header("Cache-Control","no-store")}}function Q(t,e){return Number(t.req.param(e))}function cu(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 KL(t){switch(WL(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 YL(t){return!!(t.startsWith("text/")||t.startsWith("application/json")||t.startsWith("application/xml"))}async function cn(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 zL(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 Iw(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 QL(t){if(t!=null)return typeof t=="string"&&Ow.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function eC(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 tC(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 Sh(i)?(yc(s,i),s.redirect("/",302)):s.html($e("Login","<p>Invalid token</p>"),401)}),e.post("/logout",s=>(kh(s),s.redirect("/login",302))),bg(e,{dal:t.dal}),_w(e,{dal:t.dal}),Pg(e,{dal:t.dal}),Kg(e,{terminalSessionManager:t.terminalSessionManager}),tw(e,{persistentSessionManager:t.persistentSessionManager}),e.post("/api/teams/:team_name/refresh",async s=>{let o=jn(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 vl(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>`)}),Ah(e,{dal:t.dal}),Ph(e,{dal:t.dal}),e.get("/api/status",s=>U(s,mo(t.dal),tC)),e.get("/api/projects",s=>U(s,po(t.dal),rC)),e.get("/api/teams",s=>U(s,Xm(t.dal),oC)),e.get("/api/workflows",s=>U(s,ho(t.dal),iC)),e.get("/api/workflows/verify",s=>{let o=og();return s.req.header("accept")?.includes("text/plain")?s.text(ag(o)):s.json(o)}),e.get("/api/jobs",s=>U(s,Gm(t.dal,{status:s.req.query("status")}),aC)),e.post("/api/uploads",s=>Sw(s,t.dal)),e.get("/api/jobs/:id",s=>{let o=_o(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(()=>(Qn(),gg)),i=_o(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),nC)}),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 cn(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{Xt(u)}catch{return s.text("invalid condition",400)}let d=zL(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=Iw(s.req.query("status"),ZL);if(typeof i=="string")return s.text(i,400);let a=Iw(s.req.query("severity"),Ow);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")}:{}}),sC)}),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 cn(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=QL(i.severity);if(typeof c=="object")return s.text(c.error,400);let u=eC(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 cn(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 cn(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 cn(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 cn(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=hr(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=hr(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=KL(l.path);if(YL(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=FL(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,Fr(t.dal,{limit:uu(s,"limit")??100}),lC)),e.get("/api/runs/:id",s=>{let o=pr(t.dal,Q(s,"id"));return o===null?s.notFound():U(s,o,cC)}),e.get("/api/runs/:id/where",s=>{let o=Ur(t.dal,Q(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(wo(o)):s.json(o)}),e.get("/api/runs/:id/timeline",s=>{let o=yo(t.dal,Q(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Eo(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?(Pi(t.daemon),U(s,i,$w)):U(s,i,$w,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?(Pi(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=>vw(s,t.dal,o=>U(s,o,dC))),e.get("/api/runs/:id/steps/:step_id/transcript",s=>{let o=zm(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=>vw(s,t.dal,o=>{let i=sw(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,Zm(t.dal,{type:s.req.query("type")}),fC)),e.get("/api/external-signals",s=>U(s,Qm(t.dal,{unhandled:s.req.query("unhandled")==="true"}),mC)),e.get("/api/attentions",s=>U(s,qt(t.dal,{unacked:s.req.query("unacked")==="true"}),pC)),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=go(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=qt(t.dal).find(m=>m.id===o);if(u===void 0)return s.notFound();if(u.kind==="workflow_escalation"){let m=t.dal.resumeEscalation(o,i);if(!m.resumed)return s.json({ok:!1,reason:m.reason},400);Pi(t.daemon);let p=qt(t.dal).find(h=>h.id===o);return s.json({ok:!0,attention_id:o,run_id:m.run.id,decision:i,session_status:"escalation_resumed",acknowledged_at:p?.acknowledged_at??null})}if(u.kind!=="interactive_waiting_operator")return s.json({ok:!1,reason:"wrong_kind",kind:u.kind},400);if(u.acknowledged_at!==null)return s.json({ok:!1,reason:"already_acked"},400);if(c.step_id===null)return s.json({ok:!1,reason:"no_step"},400);let d=t.dal.resumeInteractive(c.step_id,i,a);if(!d.resumed)return s.json({ok:!1,reason:d.reason,step_id:c.step_id},400);let f=t.dal.acknowledgeAttention(o);return Pi(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=Vm(t.dal,{status:i,pr_url:o});return U(s,a,hC)}),e.get("/api/submitted-prs/:id",s=>{let o=Q(s,"id"),i=Km(t.dal,o);return i===null?s.notFound():U(s,i,_C)}),e.get("/api/sessions",s=>U(s,t.dal.latestSessionSizes(),Nw)),e.get("/api/sessions/:team_name/:alias/history",s=>{let o=jn(s.req.param("team_name"));return U(s,t.dal.sessionSizeHistory(o,s.req.param("alias")),Nw)}),e.post("/api/sessions/:team_name/:alias/compact",async s=>{let o=jn(s.req.param("team_name"));try{let i=await Fm(t.dal,o,s.req.param("alias"));return U(s,i,a=>xw("compacted",a.row))}catch(i){if(i instanceof xn)return s.text(i.message,409);throw i}}),e.post("/api/sessions/:team_name/:alias/refresh",async s=>{let o=jn(s.req.param("team_name")),i=await vl(t.dal,o,s.req.param("alias"));return U(s,i,a=>xw(`refreshed ${a.sessionid}`,a.row))}),e.get("/api/intake/state",s=>U(s,r,jw)),e.post("/api/intake/scan",async s=>(r=await Zr(t.dal),U(s,r,jw))),e.get("/api/stats/run-throughput",s=>U(s,rp(t.dal),gC)),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=Rl(t.dal,o),l=Ol(t.dal,{project_id:o});return s.html($e(`Metrics \u2014 ${i.name}`,yC(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=uu(s,"since_days");return s.json(Rl(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=uu(s,"since_days");return s.json(Ol(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 vw(t,e,r){let n=Al(e,Q(t,"id"),Q(t,"step_id"));return n===null?t.notFound():r(n)}function Pi(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 GL(){let t=process.env.LMCTL_WEBUI_DIST;if(t!==void 0)return Di(`${t}/index.html`)?du(t):null;let e="src/serve/webui-dist";if(Di(`${e}/index.html`))return e;let r="dist/serve/webui-dist";if(Di(`${r}/index.html`))return r;let n=qL(UL(JL(import.meta.url)),"webui-dist");return Di(`${n}/index.html`)?du(n):null}function du(t){if(!BL(t))return t;let e=HL(process.cwd(),t);return e.length===0?".":e}function VL(){return async(t,e)=>{await e(),t.header("Cache-Control","no-store")}}function Q(t,e){return Number(t.req.param(e))}function uu(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 KL(t){switch(WL(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 YL(t){return!!(t.startsWith("text/")||t.startsWith("application/json")||t.startsWith("application/xml"))}async function cn(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 zL(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 Iw(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 QL(t){if(t!=null)return typeof t=="string"&&Ow.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function eC(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 tC(t){return`<h1>Status</h1><div class="grid">
1597
1597
  <div class="metric"><strong>${t.jobs.queued}</strong><br>queued jobs</div>
1598
1598
  <div class="metric"><strong>${t.jobs.done}</strong><br>done jobs</div>
1599
1599
  <div class="metric"><strong>${t.runs.active}</strong><br>active runs</div>
@@ -1636,26 +1636,26 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1636
1636
  <h2>Retry counts (runs with &gt;1 attempt per state)</h2>
1637
1637
  ${ue(["state","retried runs","avg attempts"],i)}
1638
1638
  <h2>Tool efficacy</h2>
1639
- ${ue(["tool","invocations","successes (status=ok)","hit rate","avg latency ms","p50 ms","p95 ms"],a)}`}var ZL,Ow,Lw=E(()=>{"use strict";Qo();Gr();Ih();Rh();Fh();vt();kc();xg();Dg();qg();Yg();rw();ow();yw();lo();kw();_i();ZL=["open","assigned","closed","reopened"],Ow=["low","medium","high","critical"]});function EC(t){return Math.floor(t/6e4)*6e4}function bC(t){t.db.transaction(()=>{let e=t.getRollupCursor(),r=t.listSessionEventsSince(e);if(r.length!==0){for(let n of r)TC(t,n);t.setRollupCursor(r[r.length-1].id)}})()}function TC(t,e){let r=Date.now(),n=EC(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 Cw(t,e=250){let r=setInterval(()=>{try{bC(t)}catch{}},e);return{stop(){clearInterval(r)}}}var Mw=E(()=>{"use strict"});function kC({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 ZL,Ow,Lw=E(()=>{"use strict";Qo();Gr();Ih();Rh();Fh();vt();vc();xg();Dg();qg();Yg();rw();ow();yw();lo();kw();_i();ZL=["open","assigned","closed","reopened"],Ow=["low","medium","high","critical"]});function EC(t){return Math.floor(t/6e4)*6e4}function bC(t){t.db.transaction(()=>{let e=t.getRollupCursor(),r=t.listSessionEventsSince(e);if(r.length!==0){for(let n of r)TC(t,n);t.setRollupCursor(r[r.length-1].id)}})()}function TC(t,e){let r=Date.now(),n=EC(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 Cw(t,e=250){let r=setInterval(()=>{try{bC(t)}catch{}},e);return{stop(){clearInterval(r)}}}var Mw=E(()=>{"use strict"});function kC({dal:t}){let e=t.listProjects();for(let r of e){let n=t.query(`SELECT r.id, r.team_id
1640
1640
  FROM run r
1641
1641
  JOIN job j ON j.id = r.job_id
1642
1642
  WHERE j.project_id = ?
1643
1643
  AND r.terminal_state IS NOT NULL
1644
1644
  ORDER BY r.id DESC
1645
- LIMIT ?`,r.id,3);if(n.length<3||!n.every(l=>t.query("SELECT 1 FROM step WHERE run_id = ? AND outcome = ? LIMIT 1",l.id,SC).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,Dw)||t.insertDriftSignal({team_member_id:a.id,project_id:r.id,signal_kind:Dw,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 Pw(t){for(let e of vC)try{e(t)}catch{}}var SC,Dw,vC,Fw=E(()=>{"use strict";SC="request_changes",Dw="reviewer_rejection_rate_high";vC=[kC]});function ts(){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??ts(),r=t.runOnceFn??br,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??Cw)(t.dal));let c=f=>{n.running&&(s=setTimeout(()=>{d.runCycle().finally(()=>c(e))},f))},u=f=>{n.running&&(o=setTimeout(()=>{a===null&&(a=Ww(t.dal,t.monitorSessionActivityFn??vl,e,n).finally(()=>{a=null})),a.finally(()=>u(Il(t.dal,e)))},f))},d={state:n,runCycle:async()=>(i!==null||(i=IC(t.dal,r,t.collectSessionSizesFn??Pm,t.scanIntakeFn??Zr,t.monitorSessionActivityFn??vl,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 IC(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(dg({dal:t}),Pw({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 Ww(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 Ww(t,e,r,n){let s=Il(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 du=E(()=>{"use strict";Qo();Qn();Wc();lo();Mw();Fw();$l()});function Bw(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 qw=E(()=>{"use strict"});import{mkdirSync as $C,readFileSync as NC,readdirSync as xC,statSync as jC,writeFileSync as AC}from"node:fs";import{dirname as RC,join as Jw,sep as Hw}from"node:path";function Fi(t){return{s3:{async send(n){let s=n;switch(s._localfsTag){case Xw:return OC(t,s.input);case Gw:return LC(t,s.input);case Vw:return CC(t,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:pu,GetObjectCommand:mu,PutObjectCommand:fu}}}function OC(t,e){let r=Kw(t,e.Key);return $C(RC(r),{recursive:!0}),AC(r,e.Body),{}}function LC(t,e){let r=Kw(t,e.Key),n;try{n=NC(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 CC(t,e){let r=e.Prefix??"";Yw(r);let s=MC(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 Kw(t,e){return Yw(e),Jw(t,e)}function Yw(t){if(t.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${t}`)}function MC(t){let e=[],r=(n,s)=>{let o;try{o=xC(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=Jw(n,i.name);if(i.isDirectory())r(l,a);else if(i.isFile()){let c=Hw==="/"?a:a.split(Hw).join("/");e.push({key:c,lastModified:jC(l).mtime})}}};return r(t,""),e}var Xw,Gw,Vw,fu,mu,pu,hu=E(()=>{"use strict";Xw="localfs-put",Gw="localfs-get",Vw="localfs-list",fu=class{input;_localfsTag=Xw;constructor(e){this.input=e}},mu=class{input;_localfsTag=Gw;constructor(e){this.input=e}},pu=class{input;_localfsTag=Vw;constructor(e){this.input=e}}});function zw(){return{put:0,get:0,list:0}}function _u(t,e=DC){return t.put*e.putUsd+t.get*e.getUsd+t.list*e.listUsd}function gu(t){let e=new Date(t),r=e.getUTCFullYear(),n=String(e.getUTCMonth()+1).padStart(2,"0");return`${r}-${n}`}var DC,Ui,wu=E(()=>{"use strict";DC={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};Ui=class{counts=zw();record(e,r=1){this.counts[e]+=r}peek(){return{...this.counts}}drain(){let e={...this.counts};return this.counts=zw(),e}estimateCostUsd(e){return _u(this.counts,e)}}});function Zw(t){let e=t.now??Date.now,r=t.timers??PC,n=null,s=null;async function o(){let l=e(),c=gu(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=_u(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===gu(e())}}}var PC,Qw=E(()=>{"use strict";wu();PC={setInterval:(t,e)=>setInterval(t,e),clearInterval:t=>clearInterval(t)}});var yu=E(()=>{"use strict";Si();vi();vi()});function FC(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 UC(t){return t.reply_to!==void 0&&t.response!==void 0}function WC(t){if(typeof t!="object"||t===null)return;let e=t.conversation_id;return typeof e=="string"?e:void 0}function ey(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 Wi,rs,ty=E(()=>{"use strict";yu();Wi=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(e="MailboxFetchClient stopped before a response arrived"){super(e)}},rs=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 Wi("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=At(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(ey(c));return}u=()=>{this.pending.has(s)&&(this.pending.delete(s),l(ey(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 Wi;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=FC(e);if(n===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(UC(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??WC(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:At(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 Eu(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 ry=E(()=>{"use strict"});function bu(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 ny=E(()=>{"use strict"});function Su(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 Tu,sy=E(()=>{"use strict";Tu="daemon:events"});function iy(t){return{kind:"prompt",prompt_id:t.prompt_id??At(t.now?.()??Date.now(),t.random??Math.random),root_teamfile:t.root_teamfile,text:t.text}}function ku(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 oy,vu=E(()=>{"use strict";yu();oy="prompt:root"});function ns(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(ly(e[1]));return typeof r.sub=="string"&&r.sub!==""?r.sub:null}catch{return null}}function BC(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(ly(e[1]));return typeof r.exp=="number"&&Number.isFinite(r.exp)?r.exp:null}catch{return null}}function ay(t,e=60){if(typeof t!="string"||t==="")return!0;let r=BC(t);return r===null?!0:Date.now()/1e3>=r-e}function ly(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 Iu=E(()=>{"use strict"});async function Bi(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":qC},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 qC,$u=E(()=>{"use strict";qC="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as cy,mkdirSync as uy,readFileSync as dy,writeFileSync as fy}from"node:fs";import{homedir as my}from"node:os";import{dirname as py,join as hy}from"node:path";function ss(){return process.env.LMCTL_DEVICE_AUTH_PATH??hy(my(),".lmctl","device-auth.json")}function _y(){return process.env.LMCTL_TOKEN_PATH??hy(my(),".lmctl","cli-tokens.json")}function Nu(t=ss()){try{let e=JSON.parse(dy(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 gy(t,e=ss()){uy(py(e),{recursive:!0,mode:448}),fy(e,JSON.stringify(t,null,2));try{cy(e,384)}catch{}}function xu(t,e=_y()){let r={};try{r=JSON.parse(dy(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};uy(py(e),{recursive:!0,mode:448}),fy(e,JSON.stringify(s,null,2));try{cy(e,384)}catch{}}async function wy(t){let e=t.deviceAuthPath??ss(),r=Nu(e);if(r===null)throw new Error("device_auth_not_found: no ~/.lmctl/device-auth.json; run `lmctl device login` first");let n=await Bi({region:t.region,clientId:t.clientId,refreshToken:r.refreshToken,...t.fetchImpl!==void 0?{fetchImpl:t.fetchImpl}:{}});return xu({idToken:n.idToken,...n.accessToken!==void 0?{accessToken:n.accessToken}:{},refreshToken:r.refreshToken,...n.expiresAt!==void 0?{expiresAt:n.expiresAt}:{}},t.cliTokensPath??_y()),{idToken:n.idToken,userId:r.userId}}var ju=E(()=>{"use strict";$u()});function yy(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(`
1646
- `);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(!HC.has(c))throw new mt(`unknown frontmatter key "${c}" \u2014 allowed keys: ${qi.join(", ")}`);r[c]=u}if(n===-1)throw new mt("frontmatter not closed (missing trailing `---` on its own line)");for(let i of qi)if(r[i]===void 0)throw new mt(`missing required frontmatter key "${i}" \u2014 required: ${qi.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 qi,HC,mt,Ey=E(()=>{"use strict";qi=["title","description","members"],HC=new Set(qi),mt=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});import{readFileSync as JC,writeFileSync as aV,renameSync as lV,existsSync as ky,realpathSync as Au,statSync as XC}from"node:fs";import{basename as vy,resolve as zt,dirname as Ru}from"node:path";function KC(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 YC(t){return/^\s*_MEMBER_\s+\S/.test(t)}function zC(t){return/^\s*_SESSION_\s+\S/.test(t)}function ZC(t){return/^\s*_CONNECT_(?:\s|$)/.test(t)}function QC(t){return/^\s*_SKILL_(?:\s|$)/.test(t)}function Lu(t){let e=vy(t);return e.endsWith(".lmctl")?e.slice(0,-6):e}function Ne(t){let e=JC(t,"utf-8"),r=Ru(zt(t)),n=Cu(e,Lu(t),{baseDir:r,sourcePath:zt(t)});for(let s of n.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=zt(r,s.sessiondir));return n}function eM(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(!Ty.includes(c)){n.push(`line ${e}: unknown key "${c}" on _CONNECT_ line: ${t.trim()}
1647
- allowed keys: ${Ty.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 Cu(t,e,r={}){let n=[],s=[],o=[],i=[],a=new Set,l=r.baseDir??VC,c;if(r.sourcePath!==void 0)try{c=Au(r.sourcePath)}catch{c=void 0}let u=t;if(u.startsWith("#teamfile:")){let m=u.indexOf(`
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,SC).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,Dw)||t.insertDriftSignal({team_member_id:a.id,project_id:r.id,signal_kind:Dw,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 Pw(t){for(let e of vC)try{e(t)}catch{}}var SC,Dw,vC,Fw=E(()=>{"use strict";SC="request_changes",Dw="reviewer_rejection_rate_high";vC=[kC]});function ts(){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??ts(),r=t.runOnceFn??br,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??Cw)(t.dal));let c=f=>{n.running&&(s=setTimeout(()=>{d.runCycle().finally(()=>c(e))},f))},u=f=>{n.running&&(o=setTimeout(()=>{a===null&&(a=Ww(t.dal,t.monitorSessionActivityFn??Il,e,n).finally(()=>{a=null})),a.finally(()=>u($l(t.dal,e)))},f))},d={state:n,runCycle:async()=>(i!==null||(i=IC(t.dal,r,t.collectSessionSizesFn??Pm,t.scanIntakeFn??Zr,t.monitorSessionActivityFn??Il,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 IC(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(dg({dal:t}),Pw({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 Ww(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 Ww(t,e,r,n){let s=$l(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 fu=E(()=>{"use strict";Qo();Qn();Bc();lo();Mw();Fw();Nl()});function Bw(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 qw=E(()=>{"use strict"});import{mkdirSync as $C,readFileSync as NC,readdirSync as xC,statSync as jC,writeFileSync as AC}from"node:fs";import{dirname as RC,join as Jw,sep as Hw}from"node:path";function Fi(t){return{s3:{async send(n){let s=n;switch(s._localfsTag){case Xw:return OC(t,s.input);case Gw:return LC(t,s.input);case Vw:return CC(t,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:hu,GetObjectCommand:pu,PutObjectCommand:mu}}}function OC(t,e){let r=Kw(t,e.Key);return $C(RC(r),{recursive:!0}),AC(r,e.Body),{}}function LC(t,e){let r=Kw(t,e.Key),n;try{n=NC(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 CC(t,e){let r=e.Prefix??"";Yw(r);let s=MC(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 Kw(t,e){return Yw(e),Jw(t,e)}function Yw(t){if(t.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${t}`)}function MC(t){let e=[],r=(n,s)=>{let o;try{o=xC(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=Jw(n,i.name);if(i.isDirectory())r(l,a);else if(i.isFile()){let c=Hw==="/"?a:a.split(Hw).join("/");e.push({key:c,lastModified:jC(l).mtime})}}};return r(t,""),e}var Xw,Gw,Vw,mu,pu,hu,_u=E(()=>{"use strict";Xw="localfs-put",Gw="localfs-get",Vw="localfs-list",mu=class{input;_localfsTag=Xw;constructor(e){this.input=e}},pu=class{input;_localfsTag=Gw;constructor(e){this.input=e}},hu=class{input;_localfsTag=Vw;constructor(e){this.input=e}}});function zw(){return{put:0,get:0,list:0}}function gu(t,e=DC){return t.put*e.putUsd+t.get*e.getUsd+t.list*e.listUsd}function wu(t){let e=new Date(t),r=e.getUTCFullYear(),n=String(e.getUTCMonth()+1).padStart(2,"0");return`${r}-${n}`}var DC,Ui,yu=E(()=>{"use strict";DC={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};Ui=class{counts=zw();record(e,r=1){this.counts[e]+=r}peek(){return{...this.counts}}drain(){let e={...this.counts};return this.counts=zw(),e}estimateCostUsd(e){return gu(this.counts,e)}}});function Zw(t){let e=t.now??Date.now,r=t.timers??PC,n=null,s=null;async function o(){let l=e(),c=wu(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=gu(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===wu(e())}}}var PC,Qw=E(()=>{"use strict";yu();PC={setInterval:(t,e)=>setInterval(t,e),clearInterval:t=>clearInterval(t)}});var Eu=E(()=>{"use strict";Si();vi();vi()});function FC(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 UC(t){return t.reply_to!==void 0&&t.response!==void 0}function WC(t){if(typeof t!="object"||t===null)return;let e=t.conversation_id;return typeof e=="string"?e:void 0}function ey(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 Wi,rs,ty=E(()=>{"use strict";Eu();Wi=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(e="MailboxFetchClient stopped before a response arrived"){super(e)}},rs=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 Wi("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=At(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(ey(c));return}u=()=>{this.pending.has(s)&&(this.pending.delete(s),l(ey(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 Wi;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=FC(e);if(n===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(UC(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??WC(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:At(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 bu(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 ry=E(()=>{"use strict"});function Tu(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 ny=E(()=>{"use strict"});function ku(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,sy=E(()=>{"use strict";Su="daemon:events"});function iy(t){return{kind:"prompt",prompt_id:t.prompt_id??At(t.now?.()??Date.now(),t.random??Math.random),root_teamfile:t.root_teamfile,text:t.text}}function vu(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 oy,Iu=E(()=>{"use strict";Eu();oy="prompt:root"});function ns(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(ly(e[1]));return typeof r.sub=="string"&&r.sub!==""?r.sub:null}catch{return null}}function BC(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(ly(e[1]));return typeof r.exp=="number"&&Number.isFinite(r.exp)?r.exp:null}catch{return null}}function ay(t,e=60){if(typeof t!="string"||t==="")return!0;let r=BC(t);return r===null?!0:Date.now()/1e3>=r-e}function ly(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 $u=E(()=>{"use strict"});async function Bi(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":qC},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 qC,Nu=E(()=>{"use strict";qC="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as cy,mkdirSync as uy,readFileSync as dy,writeFileSync as fy}from"node:fs";import{homedir as my}from"node:os";import{dirname as py,join as hy}from"node:path";function ss(){return process.env.LMCTL_DEVICE_AUTH_PATH??hy(my(),".lmctl","device-auth.json")}function _y(){return process.env.LMCTL_TOKEN_PATH??hy(my(),".lmctl","cli-tokens.json")}function xu(t=ss()){try{let e=JSON.parse(dy(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 gy(t,e=ss()){uy(py(e),{recursive:!0,mode:448}),fy(e,JSON.stringify(t,null,2));try{cy(e,384)}catch{}}function ju(t,e=_y()){let r={};try{r=JSON.parse(dy(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};uy(py(e),{recursive:!0,mode:448}),fy(e,JSON.stringify(s,null,2));try{cy(e,384)}catch{}}async function wy(t){let e=t.deviceAuthPath??ss(),r=xu(e);if(r===null)throw new Error("device_auth_not_found: no ~/.lmctl/device-auth.json; run `lmctl device login` first");let n=await Bi({region:t.region,clientId:t.clientId,refreshToken:r.refreshToken,...t.fetchImpl!==void 0?{fetchImpl:t.fetchImpl}:{}});return ju({idToken:n.idToken,...n.accessToken!==void 0?{accessToken:n.accessToken}:{},refreshToken:r.refreshToken,...n.expiresAt!==void 0?{expiresAt:n.expiresAt}:{}},t.cliTokensPath??_y()),{idToken:n.idToken,userId:r.userId}}var Au=E(()=>{"use strict";Nu()});function yy(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(`
1646
+ `);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(!HC.has(c))throw new mt(`unknown frontmatter key "${c}" \u2014 allowed keys: ${qi.join(", ")}`);r[c]=u}if(n===-1)throw new mt("frontmatter not closed (missing trailing `---` on its own line)");for(let i of qi)if(r[i]===void 0)throw new mt(`missing required frontmatter key "${i}" \u2014 required: ${qi.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 qi,HC,mt,Ey=E(()=>{"use strict";qi=["title","description","members"],HC=new Set(qi),mt=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});import{readFileSync as JC,writeFileSync as aV,renameSync as lV,existsSync as ky,realpathSync as Ru,statSync as XC}from"node:fs";import{basename as vy,resolve as Zt,dirname as Ou}from"node:path";function KC(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 YC(t){return/^\s*_MEMBER_\s+\S/.test(t)}function zC(t){return/^\s*_SESSION_\s+\S/.test(t)}function ZC(t){return/^\s*_CONNECT_(?:\s|$)/.test(t)}function QC(t){return/^\s*_SKILL_(?:\s|$)/.test(t)}function Cu(t){let e=vy(t);return e.endsWith(".lmctl")?e.slice(0,-6):e}function Ne(t){let e=JC(t,"utf-8"),r=Ou(Zt(t)),n=Mu(e,Cu(t),{baseDir:r,sourcePath:Zt(t)});for(let s of n.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=Zt(r,s.sessiondir));return n}function eM(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(!Ty.includes(c)){n.push(`line ${e}: unknown key "${c}" on _CONNECT_ line: ${t.trim()}
1647
+ allowed keys: ${Ty.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 Mu(t,e,r={}){let n=[],s=[],o=[],i=[],a=new Set,l=r.baseDir??VC,c;if(r.sourcePath!==void 0)try{c=Ru(r.sourcePath)}catch{c=void 0}let u=t;if(u.startsWith("#teamfile:")){let m=u.indexOf(`
1648
1648
  `);u=m>=0?u.slice(m+1):""}let d=null;if(u.startsWith("---"))try{d=yy(u)}catch(m){if(m instanceof mt)i.push(`frontmatter: ${m.message}`);else throw m}let f=t.split(`
1649
- `);for(let m=0;m<f.length;m++){let p=f[m],h=m+1;if(zC(p))throw new Error(`line ${h}: _SESSION_ is the legacy prefix. Rename to _MEMBER_. (line: ${p.trim()})`);if(ZC(p)){let{kvs:S,errors:I}=eM(p,h);if(i.push(...I),I.length>0)continue;let v=S.alias,k=S.teamfile;if(v||i.push(`line ${h}: _CONNECT_ missing alias: ${p.trim()}`),k||i.push(`line ${h}: _CONNECT_ missing teamfile: ${p.trim()}`),!v||!k)continue;let R=zt(l,k);try{let L=Au(R);if(c!==void 0&&L===c){i.push(`line ${h}: ${Hi}`);continue}let B=`${v}\0${L}`;if(a.has(B)){i.push(`line ${h}: duplicate _CONNECT_ alias "${v}" for teamfile "${k}"`);continue}a.add(B),s.push({alias:v,teamfile:L})}catch(L){i.push(`line ${h}: _CONNECT_ teamfile missing/unreadable: ${R}: ${L instanceof Error?L.message:String(L)}`)}continue}if(QC(p)){let S=p.replace(/^\s*_SKILL_\s*/,"").trim(),I=S.length===0?[]:S.split(/\s+/u);if(I.length!==1){i.push(`line ${h}: _SKILL_ requires exactly one https:// URL or local path: ${p.trim()}`);continue}let v=I[0];try{if(new URL(v).protocol!=="https:"){i.push(`line ${h}: _SKILL_ URL must use https:// or a local path: ${v}`);continue}}catch{if(/^[A-Za-z][A-Za-z0-9+.-]*:/u.test(v)&&!/^[A-Za-z]:[\\/]/u.test(v)){i.push(`line ${h}: _SKILL_ URL must use https:// or a local path: ${v}`);continue}}o.push(v);continue}if(!YC(p))continue;let g=KC(p);for(let S of Object.keys(g))if(!by.includes(S))throw new Error(`line ${h}: unknown key "${S}" on _MEMBER_ line: ${p.trim()}
1650
- allowed keys: ${by.join(", ")}`);if(!g.provider&&!g.teamfile){i.push(`line ${h}: member line missing provider (or teamfile): ${p.trim()}`);continue}let T={alias:g.alias||`member${n.length+1}`,provider:g.provider||"",extra:{}};g.sessionid&&(T.session=g.sessionid),g.sessiondir&&(T.sessiondir=g.sessiondir),g.teamfile&&(T.teamfile=g.teamfile),g.model&&(T.model=g.model),n.push(T)}return{name:e,members:n,connections:s,skillUrls:o,rawText:t,parseErrors:i,frontmatter:d}}function Mu(t,e){let r=[];for(let o of t.parseErrors){let i=o.includes("_CONNECT_")?"connect":o.includes("_SKILL_")?"skill":"session";r.push({field:i,message:o})}let n=t.members.filter(o=>o.alias.toLowerCase()===Ou.toLowerCase());n.length>1&&r.push({field:Ou,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?zt(e,o.teamfile):zt(o.teamfile);if(!ky(a))r.push({field:o.alias,message:`Teamfile not found: ${a}`});else{let l=Ne(a),c=pt(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 GC.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 pt(t){return t.members.find(e=>e.alias.toLowerCase()===Ou.toLowerCase())}function Du(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=zt(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),!ky(o))throw new Error(`Teamfile not found: ${o} (referenced by alias "${t.alias}")`);let a=Ne(o),l=pt(a);if(!l)throw new Error(`Team at ${o} has no lead session`);if(l.teamfile)return Du(l,Ru(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||Ru(o),alias:t.alias,resolvedFrom:o,model:l.model}}function Sy(t){let e;try{e=Au(t)}catch(n){throw new Error(`connect target missing/unreadable: ${t}: ${n instanceof Error?n.message:String(n)}`)}let r=XC(e);return{path:e,key:`${r.dev}:${r.ino}`}}function tM(t){return t.map(e=>vy(e)).join(" -> ")}function rM(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 Sr(t){let e=Sy(zt(t)),r=new Map,n=new Map,s=[];function o(a,l){if(r.has(a.key))return;r.set(a.key,a);let c;try{c=Ne(a.path)}catch(d){throw new Error(`connect parse error in ${a.path}: ${d instanceof Error?d.message:String(d)}`)}if(c.parseErrors.length>0){let d=c.parseErrors.find(f=>f.includes("_CONNECT_ teamfile missing/unreadable"));throw d!==void 0?new Error(`${a.path}: ${d}`):new Error(`connect parse error in ${a.path}: ${c.parseErrors.join("; ")}`)}let u=[];n.set(a.key,{source_teamfile:a.path,connections:u});for(let d of c.connections){let f=Sy(d.teamfile);if(f.key===a.key)throw new Error(Hi);let m;try{m=Ne(f.path)}catch(p){throw new Error(`connect target missing/unreadable: ${d.alias} -> ${f.path}: ${p instanceof Error?p.message:String(p)}`)}if(m.parseErrors.length>0)throw new Error(`connect target invalid: ${d.alias} -> ${f.path}: ${m.parseErrors.join("; ")}`);if(os(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=rM(s);if(i!==null)throw new Error(`connect cycle: ${tM(i)}`);return{root_teamfile:e.path,snapshots:[...n.values()],edges:s}}function os(t,e){return t.members.find(r=>r.alias===e)??t.members.find(r=>r.alias.toLowerCase()===e.toLowerCase())}var Ou,Hi,GC,VC,by,Ty,Rt=E(()=>{"use strict";Ey();Ou="Lead",Hi="_CONNECT_ cannot target its own team (self-edge); intra-team members are connected implicitly via _MEMBER_",GC=new Set(["claude","codex","opencode","gemini","copilot","qwen","agy","ClaudeMock"]),VC=process.cwd();by=["alias","provider","sessionid","sessiondir","teamfile","model"],Ty=["alias","teamfile"]});import{existsSync as nM,realpathSync as sM}from"node:fs";import{dirname as oM}from"node:path";function Pu(t){iM(t).catch(e=>{t.log?.(`[mailbox] prompt trigger failed: ${e instanceof Error?e.message:String(e)}`)})}async function iM(t){let e=t.payload.root_teamfile;try{e=sM(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 un(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 un(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=aM(e);if("error"in r)return await un(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()-uM(t.env??process.env)).toISOString()});if(!s.acquired){let o=cM(r.alias,s.current);return await un(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??dr)({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 un(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 un(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 aM(t){if(!nM(t))return{error:`prompt root missing/unreadable: ${t}`};let e=Ne(t);if(e.parseErrors.length>0)return{error:`prompt root parse error: ${e.parseErrors.join("; ")}`};let r=pt(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??oM(t)}}async function un(t,e){let r=Ny(e.message),n=e.response===null?null:Ny(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 Ny(t){return t.length<=Iy?{text:t,truncated:!1}:{text:t.slice(0,Iy),truncated:!0}}function lM(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function cM(t,e){return e.sender_teamfile.startsWith("prompt:")?`${t} is busy servicing another prompt since ${e.started_at}`:lM(t,e)}function uM(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return $y;let r=Number(e);return!Number.isFinite(r)||r<=0?$y:r}var Iy,$y,xy=E(()=>{"use strict";kt();Rt();Iy=256*1024,$y=30*60*1e3});import{chmodSync as Cy,existsSync as dM,mkdirSync as My,readFileSync as Vi,writeFileSync as Dy}from"node:fs";import{dirname as Fu,resolve as Ji,join as Py}from"node:path";import{fileURLToPath as fM}from"node:url";import{homedir as Fy}from"node:os";import{CognitoIdentityClient as mM,GetIdCommand as pM}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as jy}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as hM,ListObjectsV2Command as _M,PutObjectCommand as gM,S3Client as Ay}from"@aws-sdk/client-s3";function as(t={}){let e=t.env??process.env,r=t.tfstatePath!==void 0?[t.tfstatePath]:TM(t.selfUrl),n={},s;for(let v of r)if(dM(v)){n=bM(v),s=v;break}let o=(...v)=>{for(let k of v)if(typeof k=="string"&&k!=="")return k},i=o(e.LMCTL_NEXT_IDENTITY_POOL_ID,n.LMCTL_NEXT_IDENTITY_POOL_ID)??wM,a=o(e.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??yM,l=o(e.LMCTL_NEXT_MAILBOX_BUCKET,e.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??EM,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)??Ki,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=Gi(e.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),g=Gi(e.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),_=Gi(e.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),T=Gi(e.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),S=o(e.LMCTL_MAILBOX_KEY),I=o(e.LMCTL_TOKEN_PATH);return f.config={identityPoolId:i,cognitoUserPoolId:a,cognitoClientId:u,region:c,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},...h!==void 0?{readIntervalMs:h}:{},...g!==void 0?{heartbeatIdleMs:g}:{},..._!==void 0?{backoffReadIntervalMs:_}:{},...T!==void 0?{chatLogPollIntervalMs:T}:{},...S!==void 0?{mailboxKey:S}:{},...I!==void 0?{tokenPath:I}:{}},f}function bM(t){try{let e=Vi(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 TM(t){let e=Fu(fM(t??import.meta.url));return[Ji(e,"..","..","..","..","infra","terraform","terraform.tfstate"),Ji(e,"..","..","..","..","..","infra","terraform","terraform.tfstate"),Ji(e,"..","..","..","infra","terraform","terraform.tfstate"),Ji(e,"..","..","infra","terraform","terraform.tfstate")]}function Gi(t){if(t===void 0||t==="")return;let e=Number(t);if(!(!Number.isFinite(e)||e<=0))return e*1e3}function SM(t){let e=kM(t.intervalMs)??Uy,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 kM(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}async function Wy(t){let e=t.tokenPath??Py(Fy(),".lmctl","cli-tokens.json"),r=Oy(t.tokenPath);if(ay(r.cognito?.idToken)&&Nu()!==null)try{await wy({region:t.region,clientId:t.cognitoClientId??Ki,cliTokensPath:e}),r=Oy(t.tokenPath),t.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(x){let H=x instanceof Error?x.message:String(x);t.log?.(`[mx-mailbox] device-auth refresh failed: ${H}`)}if(r.cognito===void 0)throw new Error("agent_mailbox_not_logged_in: ~/.lmctl/cli-tokens.json has no cognito tokens; run `webcli login` or `lmctl device login` first");let n=r.cognito.idToken;if(typeof n!="string"||n==="")throw new Error("agent_mailbox_no_id_token: cli-tokens.json's cognito.idToken is empty; run `webcli login` or `lmctl device login` first");let s=`cognito-idp.${t.region}.amazonaws.com/${t.cognitoUserPoolId}`,o=r.cognito.identityId,i=!1;o===void 0||o===""?o=await Ly({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=jy({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new Ay({region:t.region,credentials:a}),c={ListObjectsV2Command:_M,GetObjectCommand:hM,PutObjectCommand:gM},u=ns(n),d=u??o,f=t.deviceId,m=sn({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey}),p=t.cursorStore,h;if(p!==void 0){let x=p.loadMailboxCursor(d,m);if(x!==null)h=x.last_processed_seq??void 0,t.log?.(`[mx-mailbox] resumed seq cursor=${h??"(sentinel)"} for user_id=${d}`);else{let H=!1,me=0;for(;!H&&me<2;){me+=1;try{let $=bi(m,"web"),N=0,O;do{let q=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:$,MaxKeys:1e3,...O!==void 0?{ContinuationToken:O}:{}}));for(let F of q.Contents??[]){let C=Ti(F.Key??"",m,"web");C!==void 0&&C>N&&(N=C)}O=q.IsTruncated===!0?q.NextContinuationToken:void 0}while(O!==void 0);h=N,t.log?.(`[mx-mailbox] cold start: seeded seq cursor=${N} for user_id=${d}`),H=!0}catch($){let N=$ instanceof Error?$.message:String($);if(i&&me===1&&$M($)){t.log?.(`[mx-mailbox] cached identityId rejected by cognito (${N}); clearing + refreshing`),IM(e),i=!1,o=await Ly({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}),a=jy({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new Ay({region:t.region,credentials:a}),m=sn({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey});continue}t.log?.(`[mx-mailbox] cold start seq probe failed: ${N}`);break}}p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:h??null,last_processed_at:new Date().toISOString()})}}let g=null,_=t.terminalSessionManager,T=t.persistentSessionManager,S=t.promptTriggerStore,I=new Ui,v=new Tr({bucket:t.mailboxBucket,identityId:o,...u!==null?{userId:u}:{},...f!==void 0?{deviceId:f}:{},...t.mailboxKey!==void 0?{mailboxKey:t.mailboxKey}:{},s3:l,commands:c,selfRole:"agent",onS3Op:x=>I.record(x),onMessage:async x=>{if(_!==void 0&&Eu(x.payload)){_.onInbound(x.payload);return}if(T!==void 0&&bu(x.payload)){await T.onInbound(x.payload);return}if(!Su(x.payload)){if(S!==void 0&&ku(x.payload)){Pu({store:S,payload:x.payload,log:t.log});return}g!==null&&await g.handleIncoming(x.payload,x)}},...p!==void 0?{onCursorAdvance:x=>{p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:x,last_processed_at:new Date().toISOString()})}}:{},...h!==void 0?{cursor:h}:{},...t.pollIntervalMs!==void 0?{pollIntervalMs:t.pollIntervalMs}:{},...t.readIntervalMs!==void 0?{readIntervalMs:t.readIntervalMs}:{},...t.heartbeatIdleMs!==void 0?{heartbeatIdleMs:t.heartbeatIdleMs}:{},...t.backoffReadIntervalMs!==void 0?{backoffReadIntervalMs:t.backoffReadIntervalMs}:{}});g=new rs({client:v,...t.log!==void 0?{log:t.log}:{}}),_!==void 0&&_.setPublish(async x=>v.putMessage({conversation_id:`terminal:${x.session_id}`,payload:x})),T!==void 0&&T.setPublish(async x=>v.putMessage({conversation_id:`provider:${x.session_id}`,payload:x}));let k=x=>v.putMessage({conversation_id:Tu,payload:x});v.start();let R=t.chatLogTailStore===void 0?void 0:SM({store:t.chatLogTailStore,publishDaemonEvent:k,cursorKey:m,intervalMs:t.chatLogPollIntervalMs??t.readIntervalMs??t.pollIntervalMs??Uy,log:t.log});t.log?.(`[mx-mailbox] agent polling ${m} (bucket=${t.mailboxBucket})`);let L=t.deviceId??o,B=`${d}/usage/`,ee;return ee=t.usageStore===void 0?void 0:Zw({meter:I,store:t.usageStore,userId:d,deviceId:L,ceilingUsd:t.usageQuotaUsd??1/0,onQuotaExceeded:({period:x,costUsd:H,ceilingUsd:me})=>{t.log?.(`[usage] month ${x} cost $${H.toFixed(4)} >= ceiling $${me} \u2014 blocking mailbox`),v.stop().catch(()=>{}),ee?.stop()},publishOwnRollup:async(x,H)=>{await l.send(new c.PutObjectCommand({Bucket:t.mailboxBucket,Key:`${B}${L}-${x}.json`,Body:JSON.stringify({...H,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async x=>{let H={put:0,get:0,list:0},me;do{let $=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:B,MaxKeys:1e3,...me!==void 0?{ContinuationToken:me}:{}}));for(let N of $.Contents??[]){let O=N.Key??"";if(O.endsWith(`-${x}.json`))try{let q=await l.send(new c.GetObjectCommand({Bucket:t.mailboxBucket,Key:O}));if(q.Body===void 0)continue;let F=JSON.parse(await q.Body.transformToString("utf-8"));H.put+=F.put??0,H.get+=F.get??0,H.list+=F.list??0}catch{}}me=$.IsTruncated===!0?$.NextContinuationToken:void 0}while(me!==void 0);return H},intervalMs:t.usageFlushIntervalMs??36e5,...t.log!==void 0?{log:t.log}:{}}),{identityId:o,mailbox:v,fetchClient:g,publishDaemonEvent:k,async stop(){R?.stop(),ee!==void 0&&(await ee.flushNow().catch(()=>{}),ee.stop()),await g.stop().catch(()=>{}),await v.stop().catch(()=>{})}}}async function By(t){let e=t.s3!==void 0&&t.commands!==void 0?{s3:t.s3,commands:t.commands}:Fi(t.rootDir),r=sn({identityId:is,userId:is,deviceId:Ry}),n=null,s=t.terminalSessionManager,o=t.persistentSessionManager,i=t.promptTriggerStore,a=new Tr({bucket:"local",identityId:is,userId:is,deviceId:Ry,s3:e.s3,commands:e.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&Eu(c.payload)){s.onInbound(c.payload);return}if(o!==void 0&&bu(c.payload)){await o.onInbound(c.payload);return}if(!Su(c.payload)){if(i!==void 0&&ku(c.payload)){Pu({store:i,payload:c.payload,log:t.log});return}n!==null&&await n.handleIncoming(c.payload,c)}},pollIntervalMs:t.pollIntervalMs??Xi,readIntervalMs:t.readIntervalMs??Xi,heartbeatIdleMs:t.heartbeatIdleMs??Xi,backoffReadIntervalMs:t.backoffReadIntervalMs??Xi});n=new rs({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:Tu,payload:c});return a.start(),t.log?.(`[local-webui] agent polling ${r} (local-fs ${t.rootDir})`),{identityId:is,mailbox:a,fetchClient:n,publishDaemonEvent:l,async stop(){await n.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function Oy(t){let e=t??Py(Fy(),".lmctl","cli-tokens.json");try{let r=Vi(e,"utf8");return JSON.parse(r)}catch{return{}}}function vM(t,e){if(e===void 0||e==="")return;let r={};try{let s=Vi(t,"utf8");r=JSON.parse(s)}catch{}if(r.cognito===void 0)return;let n={...r,cognito:{...r.cognito,identityId:e}};My(Fu(t),{recursive:!0,mode:448}),Dy(t,JSON.stringify(n,null,2));try{Cy(t,384)}catch{}}function IM(t){let e={};try{let n=Vi(t,"utf8");e=JSON.parse(n)}catch{return}if(e.cognito===void 0)return;let r={...e,cognito:{...e.cognito}};delete r.cognito.identityId,My(Fu(t),{recursive:!0,mode:448}),Dy(t,JSON.stringify(r,null,2));try{Cy(t,384)}catch{}}async function Ly(t){t.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new mM({region:t.region}).send(new pM({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{vM(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 $M(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 Uy,Xi,Ki,wM,yM,EM,is,Ry,Uu=E(()=>{"use strict";Ii();hu();wu();Qw();ty();ry();ny();sy();vu();Si();Iu();ju();xy();Uy=3e3,Xi=1e3,Ki="79u5jhkk46qofog661c9i0bdcs",wM="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",yM="us-east-1_4iUdFggDn",EM="lmctl-next-preview-mailbox-254332045686";is="local",Ry="local"});import{spawn as Hu}from"node:child_process";import{createInterface as qy}from"node:readline";var Wu,Bu,qu,Hy,Jy=E(()=>{"use strict";Fa();Xe();Wu=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=Hu(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=qy({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+`
1649
+ `);for(let m=0;m<f.length;m++){let p=f[m],h=m+1;if(zC(p))throw new Error(`line ${h}: _SESSION_ is the legacy prefix. Rename to _MEMBER_. (line: ${p.trim()})`);if(ZC(p)){let{kvs:S,errors:I}=eM(p,h);if(i.push(...I),I.length>0)continue;let v=S.alias,k=S.teamfile;if(v||i.push(`line ${h}: _CONNECT_ missing alias: ${p.trim()}`),k||i.push(`line ${h}: _CONNECT_ missing teamfile: ${p.trim()}`),!v||!k)continue;let R=Zt(l,k);try{let L=Ru(R);if(c!==void 0&&L===c){i.push(`line ${h}: ${Hi}`);continue}let B=`${v}\0${L}`;if(a.has(B)){i.push(`line ${h}: duplicate _CONNECT_ alias "${v}" for teamfile "${k}"`);continue}a.add(B),s.push({alias:v,teamfile:L})}catch(L){i.push(`line ${h}: _CONNECT_ teamfile missing/unreadable: ${R}: ${L instanceof Error?L.message:String(L)}`)}continue}if(QC(p)){let S=p.replace(/^\s*_SKILL_\s*/,"").trim(),I=S.length===0?[]:S.split(/\s+/u);if(I.length!==1){i.push(`line ${h}: _SKILL_ requires exactly one https:// URL or local path: ${p.trim()}`);continue}let v=I[0];try{if(new URL(v).protocol!=="https:"){i.push(`line ${h}: _SKILL_ URL must use https:// or a local path: ${v}`);continue}}catch{if(/^[A-Za-z][A-Za-z0-9+.-]*:/u.test(v)&&!/^[A-Za-z]:[\\/]/u.test(v)){i.push(`line ${h}: _SKILL_ URL must use https:// or a local path: ${v}`);continue}}o.push(v);continue}if(!YC(p))continue;let g=KC(p);for(let S of Object.keys(g))if(!by.includes(S))throw new Error(`line ${h}: unknown key "${S}" on _MEMBER_ line: ${p.trim()}
1650
+ allowed keys: ${by.join(", ")}`);if(!g.provider&&!g.teamfile){i.push(`line ${h}: member line missing provider (or teamfile): ${p.trim()}`);continue}let T={alias:g.alias||`member${n.length+1}`,provider:g.provider||"",extra:{}};g.sessionid&&(T.session=g.sessionid),g.sessiondir&&(T.sessiondir=g.sessiondir),g.teamfile&&(T.teamfile=g.teamfile),g.model&&(T.model=g.model),n.push(T)}return{name:e,members:n,connections:s,skillUrls:o,rawText:t,parseErrors:i,frontmatter:d}}function Du(t,e){let r=[];for(let o of t.parseErrors){let i=o.includes("_CONNECT_")?"connect":o.includes("_SKILL_")?"skill":"session";r.push({field:i,message:o})}let n=t.members.filter(o=>o.alias.toLowerCase()===Lu.toLowerCase());n.length>1&&r.push({field:Lu,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?Zt(e,o.teamfile):Zt(o.teamfile);if(!ky(a))r.push({field:o.alias,message:`Teamfile not found: ${a}`});else{let l=Ne(a),c=pt(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 GC.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 pt(t){return t.members.find(e=>e.alias.toLowerCase()===Lu.toLowerCase())}function Pu(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=Zt(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),!ky(o))throw new Error(`Teamfile not found: ${o} (referenced by alias "${t.alias}")`);let a=Ne(o),l=pt(a);if(!l)throw new Error(`Team at ${o} has no lead session`);if(l.teamfile)return Pu(l,Ou(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||Ou(o),alias:t.alias,resolvedFrom:o,model:l.model}}function Sy(t){let e;try{e=Ru(t)}catch(n){throw new Error(`connect target missing/unreadable: ${t}: ${n instanceof Error?n.message:String(n)}`)}let r=XC(e);return{path:e,key:`${r.dev}:${r.ino}`}}function tM(t){return t.map(e=>vy(e)).join(" -> ")}function rM(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 Sr(t){let e=Sy(Zt(t)),r=new Map,n=new Map,s=[];function o(a,l){if(r.has(a.key))return;r.set(a.key,a);let c;try{c=Ne(a.path)}catch(d){throw new Error(`connect parse error in ${a.path}: ${d instanceof Error?d.message:String(d)}`)}if(c.parseErrors.length>0){let d=c.parseErrors.find(f=>f.includes("_CONNECT_ teamfile missing/unreadable"));throw d!==void 0?new Error(`${a.path}: ${d}`):new Error(`connect parse error in ${a.path}: ${c.parseErrors.join("; ")}`)}let u=[];n.set(a.key,{source_teamfile:a.path,connections:u});for(let d of c.connections){let f=Sy(d.teamfile);if(f.key===a.key)throw new Error(Hi);let m;try{m=Ne(f.path)}catch(p){throw new Error(`connect target missing/unreadable: ${d.alias} -> ${f.path}: ${p instanceof Error?p.message:String(p)}`)}if(m.parseErrors.length>0)throw new Error(`connect target invalid: ${d.alias} -> ${f.path}: ${m.parseErrors.join("; ")}`);if(os(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=rM(s);if(i!==null)throw new Error(`connect cycle: ${tM(i)}`);return{root_teamfile:e.path,snapshots:[...n.values()],edges:s}}function os(t,e){return t.members.find(r=>r.alias===e)??t.members.find(r=>r.alias.toLowerCase()===e.toLowerCase())}var Lu,Hi,GC,VC,by,Ty,Rt=E(()=>{"use strict";Ey();Lu="Lead",Hi="_CONNECT_ cannot target its own team (self-edge); intra-team members are connected implicitly via _MEMBER_",GC=new Set(["claude","codex","opencode","gemini","copilot","qwen","agy","ClaudeMock"]),VC=process.cwd();by=["alias","provider","sessionid","sessiondir","teamfile","model"],Ty=["alias","teamfile"]});import{existsSync as nM,realpathSync as sM}from"node:fs";import{dirname as oM}from"node:path";function Fu(t){iM(t).catch(e=>{t.log?.(`[mailbox] prompt trigger failed: ${e instanceof Error?e.message:String(e)}`)})}async function iM(t){let e=t.payload.root_teamfile;try{e=sM(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 un(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 un(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=aM(e);if("error"in r)return await un(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()-uM(t.env??process.env)).toISOString()});if(!s.acquired){let o=cM(r.alias,s.current);return await un(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??fr)({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 un(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 un(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 aM(t){if(!nM(t))return{error:`prompt root missing/unreadable: ${t}`};let e=Ne(t);if(e.parseErrors.length>0)return{error:`prompt root parse error: ${e.parseErrors.join("; ")}`};let r=pt(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??oM(t)}}async function un(t,e){let r=Ny(e.message),n=e.response===null?null:Ny(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 Ny(t){return t.length<=Iy?{text:t,truncated:!1}:{text:t.slice(0,Iy),truncated:!0}}function lM(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function cM(t,e){return e.sender_teamfile.startsWith("prompt:")?`${t} is busy servicing another prompt since ${e.started_at}`:lM(t,e)}function uM(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return $y;let r=Number(e);return!Number.isFinite(r)||r<=0?$y:r}var Iy,$y,xy=E(()=>{"use strict";kt();Rt();Iy=256*1024,$y=30*60*1e3});import{chmodSync as Cy,existsSync as dM,mkdirSync as My,readFileSync as Vi,writeFileSync as Dy}from"node:fs";import{dirname as Uu,resolve as Ji,join as Py}from"node:path";import{fileURLToPath as fM}from"node:url";import{homedir as Fy}from"node:os";import{CognitoIdentityClient as mM,GetIdCommand as pM}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as jy}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as hM,ListObjectsV2Command as _M,PutObjectCommand as gM,S3Client as Ay}from"@aws-sdk/client-s3";function as(t={}){let e=t.env??process.env,r=t.tfstatePath!==void 0?[t.tfstatePath]:TM(t.selfUrl),n={},s;for(let v of r)if(dM(v)){n=bM(v),s=v;break}let o=(...v)=>{for(let k of v)if(typeof k=="string"&&k!=="")return k},i=o(e.LMCTL_NEXT_IDENTITY_POOL_ID,n.LMCTL_NEXT_IDENTITY_POOL_ID)??wM,a=o(e.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??yM,l=o(e.LMCTL_NEXT_MAILBOX_BUCKET,e.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??EM,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)??Ki,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=Gi(e.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),g=Gi(e.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),_=Gi(e.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),T=Gi(e.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),S=o(e.LMCTL_MAILBOX_KEY),I=o(e.LMCTL_TOKEN_PATH);return f.config={identityPoolId:i,cognitoUserPoolId:a,cognitoClientId:u,region:c,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},...h!==void 0?{readIntervalMs:h}:{},...g!==void 0?{heartbeatIdleMs:g}:{},..._!==void 0?{backoffReadIntervalMs:_}:{},...T!==void 0?{chatLogPollIntervalMs:T}:{},...S!==void 0?{mailboxKey:S}:{},...I!==void 0?{tokenPath:I}:{}},f}function bM(t){try{let e=Vi(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 TM(t){let e=Uu(fM(t??import.meta.url));return[Ji(e,"..","..","..","..","infra","terraform","terraform.tfstate"),Ji(e,"..","..","..","..","..","infra","terraform","terraform.tfstate"),Ji(e,"..","..","..","infra","terraform","terraform.tfstate"),Ji(e,"..","..","infra","terraform","terraform.tfstate")]}function Gi(t){if(t===void 0||t==="")return;let e=Number(t);if(!(!Number.isFinite(e)||e<=0))return e*1e3}function SM(t){let e=kM(t.intervalMs)??Uy,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 kM(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}async function Wy(t){let e=t.tokenPath??Py(Fy(),".lmctl","cli-tokens.json"),r=Oy(t.tokenPath);if(ay(r.cognito?.idToken)&&xu()!==null)try{await wy({region:t.region,clientId:t.cognitoClientId??Ki,cliTokensPath:e}),r=Oy(t.tokenPath),t.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(x){let H=x instanceof Error?x.message:String(x);t.log?.(`[mx-mailbox] device-auth refresh failed: ${H}`)}if(r.cognito===void 0)throw new Error("agent_mailbox_not_logged_in: ~/.lmctl/cli-tokens.json has no cognito tokens; run `webcli login` or `lmctl device login` first");let n=r.cognito.idToken;if(typeof n!="string"||n==="")throw new Error("agent_mailbox_no_id_token: cli-tokens.json's cognito.idToken is empty; run `webcli login` or `lmctl device login` first");let s=`cognito-idp.${t.region}.amazonaws.com/${t.cognitoUserPoolId}`,o=r.cognito.identityId,i=!1;o===void 0||o===""?o=await Ly({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=jy({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new Ay({region:t.region,credentials:a}),c={ListObjectsV2Command:_M,GetObjectCommand:hM,PutObjectCommand:gM},u=ns(n),d=u??o,f=t.deviceId,m=sn({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey}),p=t.cursorStore,h;if(p!==void 0){let x=p.loadMailboxCursor(d,m);if(x!==null)h=x.last_processed_seq??void 0,t.log?.(`[mx-mailbox] resumed seq cursor=${h??"(sentinel)"} for user_id=${d}`);else{let H=!1,me=0;for(;!H&&me<2;){me+=1;try{let $=bi(m,"web"),N=0,O;do{let q=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:$,MaxKeys:1e3,...O!==void 0?{ContinuationToken:O}:{}}));for(let F of q.Contents??[]){let C=Ti(F.Key??"",m,"web");C!==void 0&&C>N&&(N=C)}O=q.IsTruncated===!0?q.NextContinuationToken:void 0}while(O!==void 0);h=N,t.log?.(`[mx-mailbox] cold start: seeded seq cursor=${N} for user_id=${d}`),H=!0}catch($){let N=$ instanceof Error?$.message:String($);if(i&&me===1&&$M($)){t.log?.(`[mx-mailbox] cached identityId rejected by cognito (${N}); clearing + refreshing`),IM(e),i=!1,o=await Ly({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}),a=jy({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new Ay({region:t.region,credentials:a}),m=sn({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey});continue}t.log?.(`[mx-mailbox] cold start seq probe failed: ${N}`);break}}p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:h??null,last_processed_at:new Date().toISOString()})}}let g=null,_=t.terminalSessionManager,T=t.persistentSessionManager,S=t.promptTriggerStore,I=new Ui,v=new Tr({bucket:t.mailboxBucket,identityId:o,...u!==null?{userId:u}:{},...f!==void 0?{deviceId:f}:{},...t.mailboxKey!==void 0?{mailboxKey:t.mailboxKey}:{},s3:l,commands:c,selfRole:"agent",onS3Op:x=>I.record(x),onMessage:async x=>{if(_!==void 0&&bu(x.payload)){_.onInbound(x.payload);return}if(T!==void 0&&Tu(x.payload)){await T.onInbound(x.payload);return}if(!ku(x.payload)){if(S!==void 0&&vu(x.payload)){Fu({store:S,payload:x.payload,log:t.log});return}g!==null&&await g.handleIncoming(x.payload,x)}},...p!==void 0?{onCursorAdvance:x=>{p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:x,last_processed_at:new Date().toISOString()})}}:{},...h!==void 0?{cursor:h}:{},...t.pollIntervalMs!==void 0?{pollIntervalMs:t.pollIntervalMs}:{},...t.readIntervalMs!==void 0?{readIntervalMs:t.readIntervalMs}:{},...t.heartbeatIdleMs!==void 0?{heartbeatIdleMs:t.heartbeatIdleMs}:{},...t.backoffReadIntervalMs!==void 0?{backoffReadIntervalMs:t.backoffReadIntervalMs}:{}});g=new rs({client:v,...t.log!==void 0?{log:t.log}:{}}),_!==void 0&&_.setPublish(async x=>v.putMessage({conversation_id:`terminal:${x.session_id}`,payload:x})),T!==void 0&&T.setPublish(async x=>v.putMessage({conversation_id:`provider:${x.session_id}`,payload:x}));let k=x=>v.putMessage({conversation_id:Su,payload:x});v.start();let R=t.chatLogTailStore===void 0?void 0:SM({store:t.chatLogTailStore,publishDaemonEvent:k,cursorKey:m,intervalMs:t.chatLogPollIntervalMs??t.readIntervalMs??t.pollIntervalMs??Uy,log:t.log});t.log?.(`[mx-mailbox] agent polling ${m} (bucket=${t.mailboxBucket})`);let L=t.deviceId??o,B=`${d}/usage/`,ee;return ee=t.usageStore===void 0?void 0:Zw({meter:I,store:t.usageStore,userId:d,deviceId:L,ceilingUsd:t.usageQuotaUsd??1/0,onQuotaExceeded:({period:x,costUsd:H,ceilingUsd:me})=>{t.log?.(`[usage] month ${x} cost $${H.toFixed(4)} >= ceiling $${me} \u2014 blocking mailbox`),v.stop().catch(()=>{}),ee?.stop()},publishOwnRollup:async(x,H)=>{await l.send(new c.PutObjectCommand({Bucket:t.mailboxBucket,Key:`${B}${L}-${x}.json`,Body:JSON.stringify({...H,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async x=>{let H={put:0,get:0,list:0},me;do{let $=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:B,MaxKeys:1e3,...me!==void 0?{ContinuationToken:me}:{}}));for(let N of $.Contents??[]){let O=N.Key??"";if(O.endsWith(`-${x}.json`))try{let q=await l.send(new c.GetObjectCommand({Bucket:t.mailboxBucket,Key:O}));if(q.Body===void 0)continue;let F=JSON.parse(await q.Body.transformToString("utf-8"));H.put+=F.put??0,H.get+=F.get??0,H.list+=F.list??0}catch{}}me=$.IsTruncated===!0?$.NextContinuationToken:void 0}while(me!==void 0);return H},intervalMs:t.usageFlushIntervalMs??36e5,...t.log!==void 0?{log:t.log}:{}}),{identityId:o,mailbox:v,fetchClient:g,publishDaemonEvent:k,async stop(){R?.stop(),ee!==void 0&&(await ee.flushNow().catch(()=>{}),ee.stop()),await g.stop().catch(()=>{}),await v.stop().catch(()=>{})}}}async function By(t){let e=t.s3!==void 0&&t.commands!==void 0?{s3:t.s3,commands:t.commands}:Fi(t.rootDir),r=sn({identityId:is,userId:is,deviceId:Ry}),n=null,s=t.terminalSessionManager,o=t.persistentSessionManager,i=t.promptTriggerStore,a=new Tr({bucket:"local",identityId:is,userId:is,deviceId:Ry,s3:e.s3,commands:e.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&bu(c.payload)){s.onInbound(c.payload);return}if(o!==void 0&&Tu(c.payload)){await o.onInbound(c.payload);return}if(!ku(c.payload)){if(i!==void 0&&vu(c.payload)){Fu({store:i,payload:c.payload,log:t.log});return}n!==null&&await n.handleIncoming(c.payload,c)}},pollIntervalMs:t.pollIntervalMs??Xi,readIntervalMs:t.readIntervalMs??Xi,heartbeatIdleMs:t.heartbeatIdleMs??Xi,backoffReadIntervalMs:t.backoffReadIntervalMs??Xi});n=new rs({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:is,mailbox:a,fetchClient:n,publishDaemonEvent:l,async stop(){await n.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function Oy(t){let e=t??Py(Fy(),".lmctl","cli-tokens.json");try{let r=Vi(e,"utf8");return JSON.parse(r)}catch{return{}}}function vM(t,e){if(e===void 0||e==="")return;let r={};try{let s=Vi(t,"utf8");r=JSON.parse(s)}catch{}if(r.cognito===void 0)return;let n={...r,cognito:{...r.cognito,identityId:e}};My(Uu(t),{recursive:!0,mode:448}),Dy(t,JSON.stringify(n,null,2));try{Cy(t,384)}catch{}}function IM(t){let e={};try{let n=Vi(t,"utf8");e=JSON.parse(n)}catch{return}if(e.cognito===void 0)return;let r={...e,cognito:{...e.cognito}};delete r.cognito.identityId,My(Uu(t),{recursive:!0,mode:448}),Dy(t,JSON.stringify(r,null,2));try{Cy(t,384)}catch{}}async function Ly(t){t.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new mM({region:t.region}).send(new pM({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{vM(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 $M(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 Uy,Xi,Ki,wM,yM,EM,is,Ry,Wu=E(()=>{"use strict";Ii();_u();yu();Qw();ty();ry();ny();sy();Iu();Si();$u();Au();xy();Uy=3e3,Xi=1e3,Ki="79u5jhkk46qofog661c9i0bdcs",wM="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",yM="us-east-1_4iUdFggDn",EM="lmctl-next-preview-mailbox-254332045686";is="local",Ry="local"});import{spawn as Ju}from"node:child_process";import{createInterface as qy}from"node:readline";var Bu,qu,Hu,Hy,Jy=E(()=>{"use strict";Ua();Xe();Bu=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=Ju(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=qy({input:n.stdout}),this.rl.on("line",s=>{r.generation===r.currentGeneration()&&this.handleLine(s)}),n.stderr?.on("data",s=>{if(r.generation!==r.currentGeneration())return;let o=s instanceof Buffer?s.toString("utf8"):String(s);r.emit({event_type:"notification",payload:{source:"stderr",text:o}})}),await this.rpc("initialize",{clientInfo:{name:"lmctl-dt3",title:"lmctl DT-3",version:"0.1.0"},capabilities:{experimentalApi:!1}}),this.notify("initialized",{}),this.threadId!==void 0&&this.threadId!=="")try{await this.rpc("thread/resume",{threadId:this.threadId,approvalPolicy:"never",sandbox:"danger-full-access"}),r.emit({event_type:"thread_started",payload:{thread_id:this.threadId,resumed:!0}})}catch{let o=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,i=typeof o?.id=="string"?o.id:void 0;this.threadId=i,r.emit({event_type:"thread_started",payload:{thread_id:i,resumed:!1}})}else{let o=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,i=typeof o?.id=="string"?o.id:void 0;this.threadId=i,r.emit({event_type:"thread_started",payload:{thread_id:i,resumed:!1}})}return n}async sendTurn(e){if(this.closed)throw new Error("codex_session_closed");if(this.threadId===void 0||this.threadId==="")throw new Error("codex_no_thread_id");let r=`local-${this.nextLocalTurnId++}`;this.ctx?.turnMap.set(r,{startedAt:Date.now()});try{let s=(await this.rpc("turn/start",{threadId:this.threadId,input:[{type:"text",text:e}]})).result?.turn,o=typeof s?.id=="string"?s.id:void 0;if(o!==void 0){let i=this.ctx?.turnMap.get(r);this.ctx?.turnMap.delete(r),i!==void 0&&this.ctx?.turnMap.set(o,i)}}catch(n){throw this.ctx?.turnMap.delete(r),n}}async stop(){if(this.closed=!0,this.rl!==void 0&&(this.rl.close(),this.rl=void 0),this.child?.stdin!==null&&this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}for(let e of this.pending.values())e.reject(new Error("codex_session_stopping"));this.pending.clear()}async rpc(e,r){if(this.child?.stdin===null||this.child===void 0)throw new Error("codex_child_unavailable");return new Promise((n,s)=>{let o=this.nextRpcId++;this.pending.set(o,{resolve:n,reject:s});let i=JSON.stringify({jsonrpc:"2.0",id:o,method:e,params:r});try{this.child.stdin.write(i+`
1651
1651
  `)}catch(a){this.pending.delete(o),s(a instanceof Error?a:new Error(String(a)))}})}notify(e,r){if(this.child?.stdin===null||this.child===void 0)return;let n=JSON.stringify({jsonrpc:"2.0",method:e,params:r});try{this.child.stdin.write(n+`
1652
- `)}catch{}}handleLine(e){if(e.trim()==="")return;let r;try{r=JSON.parse(e)}catch{return}if(typeof r.id=="number"&&this.pending.has(r.id)){let i=this.pending.get(r.id);if(this.pending.delete(r.id),r.error!==void 0){let a=r.error,l=typeof a?.message=="string"&&a.message!==""?a.message:JSON.stringify(r.error);i.reject(new Error(`codex_rpc_error: ${l}`))}else i.resolve(r);return}let n=typeof r.method=="string"?r.method:void 0;if(n===void 0)return;let s=r.params??{},o=this.normalizeNotification(n,s);o!==void 0&&this.ctx?.emit(o)}normalizeNotification(e,r){if(e==="thread/started"){let n=r.thread;return typeof n?.id=="string"&&(this.threadId=n.id),{event_type:"thread_started",payload:{thread_id:this.threadId,raw:r}}}if(e==="turn/started")return{event_type:"turn_started",payload:{turn_id:r.turn?.id,thread_id:this.threadId}};if(e==="item/agentMessage/delta")return{event_type:"assistant_message_delta",payload:{text:typeof r.delta=="string"?r.delta:""}};if(e==="item/started"||e==="item/completed"){let n=r.item;return n?.type!==void 0&&n.type!=="agentMessage"&&n.type!=="userMessage"?{event_type:"tool_call",payload:{name:n.name??n.type,status:e==="item/started"?"started":"completed",item:n}}:{event_type:"notification",payload:{method:e,params:r}}}if(e==="turn/completed"){let n=r.turn;return typeof n?.id=="string"&&this.ctx?.turnMap.delete(n.id),{event_type:"turn_complete",payload:r}}if(e==="error"){let n=r.error;return{event_type:"error",payload:{message:typeof n?.message=="string"?n.message:JSON.stringify(r),raw:r}}}return{event_type:"notification",payload:{method:e,params:r}}}},Bu=class{child;ctx;buffer="";sessionIdSeen;closed=!1;async start(e,r){this.ctx=r;let n=Hu(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});return this.child=n,n.stdout.on("data",s=>{if(r.generation!==r.currentGeneration())return;let o=s instanceof Buffer?s.toString("utf8"):String(s);this.buffer+=o;let i=this.buffer.split(`
1652
+ `)}catch{}}handleLine(e){if(e.trim()==="")return;let r;try{r=JSON.parse(e)}catch{return}if(typeof r.id=="number"&&this.pending.has(r.id)){let i=this.pending.get(r.id);if(this.pending.delete(r.id),r.error!==void 0){let a=r.error,l=typeof a?.message=="string"&&a.message!==""?a.message:JSON.stringify(r.error);i.reject(new Error(`codex_rpc_error: ${l}`))}else i.resolve(r);return}let n=typeof r.method=="string"?r.method:void 0;if(n===void 0)return;let s=r.params??{},o=this.normalizeNotification(n,s);o!==void 0&&this.ctx?.emit(o)}normalizeNotification(e,r){if(e==="thread/started"){let n=r.thread;return typeof n?.id=="string"&&(this.threadId=n.id),{event_type:"thread_started",payload:{thread_id:this.threadId,raw:r}}}if(e==="turn/started")return{event_type:"turn_started",payload:{turn_id:r.turn?.id,thread_id:this.threadId}};if(e==="item/agentMessage/delta")return{event_type:"assistant_message_delta",payload:{text:typeof r.delta=="string"?r.delta:""}};if(e==="item/started"||e==="item/completed"){let n=r.item;return n?.type!==void 0&&n.type!=="agentMessage"&&n.type!=="userMessage"?{event_type:"tool_call",payload:{name:n.name??n.type,status:e==="item/started"?"started":"completed",item:n}}:{event_type:"notification",payload:{method:e,params:r}}}if(e==="turn/completed"){let n=r.turn;return typeof n?.id=="string"&&this.ctx?.turnMap.delete(n.id),{event_type:"turn_complete",payload:r}}if(e==="error"){let n=r.error;return{event_type:"error",payload:{message:typeof n?.message=="string"?n.message:JSON.stringify(r),raw:r}}}return{event_type:"notification",payload:{method:e,params:r}}}},qu=class{child;ctx;buffer="";sessionIdSeen;closed=!1;async start(e,r){this.ctx=r;let n=Ju(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});return this.child=n,n.stdout.on("data",s=>{if(r.generation!==r.currentGeneration())return;let o=s instanceof Buffer?s.toString("utf8"):String(s);this.buffer+=o;let i=this.buffer.split(`
1653
1653
  `);this.buffer=i.pop()??"";for(let a of i)this.handleLine(a)}),n.stderr?.on("data",s=>{if(r.generation!==r.currentGeneration())return;let o=s instanceof Buffer?s.toString("utf8"):String(s);r.emit({event_type:"notification",payload:{source:"stderr",text:o}})}),n}async sendTurn(e){if(this.closed)throw new Error("claude_session_closed");if(this.child===void 0||this.child.stdin===null)throw new Error("claude_child_unavailable");let r=`claude-${Date.now()}`;this.ctx?.turnMap.set(r,{startedAt:Date.now()});let n=JSON.stringify({type:"user",message:{role:"user",content:e}});try{this.child.stdin.write(n+`
1654
- `)}catch(s){throw this.ctx?.turnMap.delete(r),s instanceof Error?s:new Error(String(s))}}async stop(){if(this.closed=!0,this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}}handleLine(e){if(e.trim()==="")return;let r;try{r=JSON.parse(e)}catch{return}let n=typeof r.type=="string"?r.type:"";if(n==="system"&&r.subtype==="init"){let s=typeof r.session_id=="string"?r.session_id:void 0;s!==void 0&&s!==this.sessionIdSeen&&(this.sessionIdSeen=s,this.ctx?.emit({event_type:"thread_started",payload:{thread_id:s,raw:r}}));return}if(n==="assistant"){let o=r.message?.content;if(Array.isArray(o))for(let i of o)i.type==="text"&&typeof i.text=="string"&&i.text!==""&&this.ctx?.emit({event_type:"assistant_message_delta",payload:{text:i.text}});return}if(n==="result"){let s=typeof r.session_id=="string"?r.session_id:void 0;for(let o of Array.from(this.ctx?.turnMap.keys()??[]))this.ctx?.turnMap.delete(o);this.ctx?.emit({event_type:"turn_complete",payload:{result:r.result,session_id:s,raw:r}});return}this.ctx?.emit({event_type:"notification",payload:{method:n,params:r}})}},qu=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{qs(n)}catch(a){te({event:"opencode_config_install_failed",cwd:n,error_message:a instanceof Error?a.message:String(a)})}let s=Hu(e.command,e.args,{cwd:n,env:e.env??process.env,stdio:["pipe","pipe","pipe"]});this.child=s,this.rl=qy({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}})}},Hu=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{qs(n)}catch(a){te({event:"opencode_config_install_failed",cwd:n,error_message:a instanceof Error?a.message:String(a)})}let s=Ju(e.command,e.args,{cwd:n,env:e.env??process.env,stdio:["pipe","pipe","pipe"]});this.child=s,this.rl=qy({input:s.stdout}),this.rl.on("line",a=>{r.generation===r.currentGeneration()&&this.handleLine(a)}),s.stderr?.on("data",a=>{if(r.generation!==r.currentGeneration())return;let l=a instanceof Buffer?a.toString("utf8"):String(a);r.emit({event_type:"notification",payload:{source:"stderr",text:l}})}),await this.rpc("initialize",{protocolVersion:1,clientInfo:{name:"lmctl-dt3",version:"0.1.0"},clientCapabilities:{}}),this.notify("notifications/initialized",{});let i=(await this.rpc("session/new",{cwd:e.cwd??process.cwd(),mcpServers:[]})).result;return this.sessionId=typeof i?.sessionId=="string"?i.sessionId:void 0,r.emit({event_type:"thread_started",payload:{thread_id:this.sessionId,raw:i}}),s}async sendTurn(e){if(this.closed)throw new Error("acp_session_closed");if(this.sessionId===void 0)throw new Error("acp_no_session_id");let r=`acp-${Date.now()}`;this.ctx?.turnMap.set(r,{startedAt:Date.now()});try{let s=(await this.rpc("session/prompt",{sessionId:this.sessionId,prompt:[{type:"text",text:e}]})).result;this.ctx?.emit({event_type:"turn_complete",payload:{stopReason:s?.stopReason,raw:s}})}finally{this.ctx?.turnMap.delete(r)}}async stop(){if(this.closed=!0,this.rl!==void 0&&(this.rl.close(),this.rl=void 0),this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}for(let e of this.pending.values())e.reject(new Error("acp_session_stopping"));this.pending.clear()}async rpc(e,r){if(this.child?.stdin===null||this.child===void 0)throw new Error("acp_child_unavailable");return new Promise((n,s)=>{let o=this.nextRpcId++;this.pending.set(o,{resolve:n,reject:s});let i=JSON.stringify({jsonrpc:"2.0",id:o,method:e,params:r});try{this.child.stdin.write(i+`
1655
1655
  `)}catch(a){this.pending.delete(o),s(a instanceof Error?a:new Error(String(a)))}})}notify(e,r){if(this.child?.stdin===null||this.child===void 0)return;let n=JSON.stringify({jsonrpc:"2.0",method:e,params:r});try{this.child.stdin.write(n+`
1656
1656
  `)}catch{}}handleLine(e){if(e.trim()==="")return;let r;try{r=JSON.parse(e)}catch{return}if(typeof r.id=="number"&&this.pending.has(r.id)){let s=this.pending.get(r.id);if(this.pending.delete(r.id),r.error!==void 0){let o=r.error,i=typeof o?.message=="string"&&o.message!==""?o.message:JSON.stringify(r.error);s.reject(new Error(`acp_rpc_error: ${i}`))}else s.resolve(r);return}let n=typeof r.method=="string"?r.method:void 0;if(n!==void 0){if(typeof r.id=="number"){let s=JSON.stringify({jsonrpc:"2.0",id:r.id,error:{code:-32601,message:`Method not found: ${n} (lmctl dt-3 does not implement server-side ACP methods)`}});try{this.child?.stdin?.write(s+`
1657
- `)}catch{}this.ctx?.emit({event_type:"notification",payload:{kind:"unhandled_request",method:n,id:r.id,params:r.params}});return}if(n==="session/update"){let s=r.params,o=s?.update;if((typeof o?.sessionUpdate=="string"?o.sessionUpdate:"")==="agent_message_chunk"){let a=o?.content,l=typeof a?.text=="string"?a.text:"";if(l!==""){this.ctx?.emit({event_type:"assistant_message_delta",payload:{text:l}});return}}this.ctx?.emit({event_type:"notification",payload:{method:n,params:s}});return}this.ctx?.emit({event_type:"notification",payload:{method:n,params:r.params}})}}},Hy=t=>{switch(t){case"codex":return new Wu;case"claude":case"qwen":return new Bu;case"gemini":case"copilot":case"opencode":return new qu;default:throw new Error(`no_persistent_adapter_for_provider: ${t}`)}}});import{randomUUID as NM}from"node:crypto";import{existsSync as JV,mkdirSync as xM,readFileSync as jM,writeFileSync as AM}from"node:fs";import{homedir as RM}from"node:os";import{dirname as OM,join as LM}from"node:path";function Yi(){return process.env.LMCTL_DEVICE_FILE??LM(RM(),".lmctl","device.json")}function kr(t=Yi()){let e=process.env.LMCTL_DEVICE_ID;if(e!==void 0&&e!=="")return{device_id:e,created_at:"env"};try{let r=JSON.parse(jM(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 Ju(t=Yi()){let e=kr(t);if(e!==null&&e.created_at!=="env")return e;let r={device_id:NM(),created_at:new Date().toISOString()};return xM(OM(t),{recursive:!0}),AM(t,`${JSON.stringify(r,null,2)}
1658
- `,{encoding:"utf8",mode:384}),r}var Xu=E(()=>{"use strict"});import*as Xy from"node:child_process";function MM(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 Gu(t,e={}){let r=e.spawnSync===void 0&&process.env[DM]==="1",n=e.spawnSync??Xy.spawnSync,s=new Set,o=[];for(let i of t){if(s.has(i))continue;s.add(i);let a=zi[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=MM(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 Gy(t){if(t.binary==="<unknown>")return`unknown provider "${t.provider}" \u2014 no binary mapping (allowed: ${Object.keys(zi).join(", ")})`;let e=CM[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 zi,CM,DM,Vy=E(()=>{"use strict";zi={claude:"claude",codex:"codex",copilot:"copilot",gemini:"gemini",opencode:"opencode",qwen:"qwen",agy:"agy"},CM={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"};DM="LMCTL_SKIP_BINARY_CHECK"});var sE={};ie(sE,{ProviderBinaryPreflightError:()=>Zi,__setProviderBinaryCheckForTest:()=>GM,bootstrapAgentRestMailbox:()=>zy,publishRegisteredWorkflowsOnStart:()=>Yy,resolveLocalMailboxDir:()=>rE,resolveLocalWebuiDir:()=>tE,resolveServeConfig:()=>Zy,runProviderBinaryPreflight:()=>eE,runServe:()=>qM,validateServeArgs:()=>nE});import{randomBytes as PM}from"node:crypto";import{existsSync as FM}from"node:fs";import{homedir as UM}from"node:os";import{isAbsolute as Ky,resolve as Vu}from"node:path";import{serve as WM}from"@hono/node-server";async function qM(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(BM),0;let r=nE(t,process.env);if(typeof r=="string")return e.stderr.write(`error: ${r}
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}})}}},Hy=t=>{switch(t){case"codex":return new Bu;case"claude":case"qwen":return new qu;case"gemini":case"copilot":case"opencode":return new Hu;default:throw new Error(`no_persistent_adapter_for_provider: ${t}`)}}});import{randomUUID as NM}from"node:crypto";import{existsSync as JV,mkdirSync as xM,readFileSync as jM,writeFileSync as AM}from"node:fs";import{homedir as RM}from"node:os";import{dirname as OM,join as LM}from"node:path";function Yi(){return process.env.LMCTL_DEVICE_FILE??LM(RM(),".lmctl","device.json")}function kr(t=Yi()){let e=process.env.LMCTL_DEVICE_ID;if(e!==void 0&&e!=="")return{device_id:e,created_at:"env"};try{let r=JSON.parse(jM(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 Xu(t=Yi()){let e=kr(t);if(e!==null&&e.created_at!=="env")return e;let r={device_id:NM(),created_at:new Date().toISOString()};return xM(OM(t),{recursive:!0}),AM(t,`${JSON.stringify(r,null,2)}
1658
+ `,{encoding:"utf8",mode:384}),r}var Gu=E(()=>{"use strict"});import*as Xy from"node:child_process";function MM(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 Vu(t,e={}){let r=e.spawnSync===void 0&&process.env[DM]==="1",n=e.spawnSync??Xy.spawnSync,s=new Set,o=[];for(let i of t){if(s.has(i))continue;s.add(i);let a=zi[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=MM(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 Gy(t){if(t.binary==="<unknown>")return`unknown provider "${t.provider}" \u2014 no binary mapping (allowed: ${Object.keys(zi).join(", ")})`;let e=CM[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 zi,CM,DM,Vy=E(()=>{"use strict";zi={claude:"claude",codex:"codex",copilot:"copilot",gemini:"gemini",opencode:"opencode",qwen:"qwen",agy:"agy"},CM={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"};DM="LMCTL_SKIP_BINARY_CHECK"});var sE={};ie(sE,{ProviderBinaryPreflightError:()=>Zi,__setProviderBinaryCheckForTest:()=>GM,bootstrapAgentRestMailbox:()=>zy,publishRegisteredWorkflowsOnStart:()=>Yy,resolveLocalMailboxDir:()=>rE,resolveLocalWebuiDir:()=>tE,resolveServeConfig:()=>Zy,runProviderBinaryPreflight:()=>eE,runServe:()=>qM,validateServeArgs:()=>nE});import{randomBytes as PM}from"node:crypto";import{existsSync as FM}from"node:fs";import{homedir as UM}from"node:os";import{isAbsolute as Ky,resolve as Ku}from"node:path";import{serve as WM}from"@hono/node-server";async function qM(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(BM),0;let r=nE(t,process.env);if(typeof r=="string")return e.stderr.write(`error: ${r}
1659
1659
  `),2;try{eE(e)}catch(T){return 1}let n=pe({path:de()}),s={portCli:VM(t)},o;try{o=Zy({dal:n,cli:s,env:process.env,parsed:r,io:e})}catch(T){return n.close(),e.stderr.write(`error: ${T instanceof Error?T.message:String(T)}
1660
1660
  `),2}process.env.LMCTL_API_URL=o.apiUrl,process.env.LMCTL_API_TOKEN=o.apiToken,process.env.LMCTL_API_PORT=String(o.port),Bw(n);let i;if(r.localWebui!==void 0){let T=tE(r.localWebui.dir,process.env);if(T===null)return e.stderr.write("error: --webui requires a local SPA build directory: pass `lmctl serve --webui <dir>` or set LMCTL_LOCAL_WEBUI_DIR to a directory containing index.html\n"),n.close(),2;let S=rE(process.env),{s3:I,commands:v}=Fi(S);i={webuiDir:T,rootDir:S,s3:I,commands:v},e.stdout.write(`local webui: serving SPA from ${T}; mailbox store ${S}
1661
1661
  `)}let a=r.noDaemon?void 0:Uw({dal:n,intervalMs:ts()}),l=i!==void 0?{missing:[],tfstateCandidatesChecked:[]}:as({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)`)+`
@@ -1669,10 +1669,10 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1669
1669
  `)})),t.io?.stderr.write(`[mailbox] dg-2 agent runtime started (identity=${e.identityId})
1670
1670
  `)}catch(r){let n=r instanceof Error?r.message:String(r);t.io?.stderr.write(`[mailbox] dg-2 agent runtime NOT started: ${n}
1671
1671
  `)}return{...e!==void 0?{mailbox:e}:{},async stop(){e!==void 0&&await e.stop()}}}function Zy(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=PM(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: ${JM(m)} env var used as fallback for ${m}; consider \`lmctl api config set ${m} ...\` to make this DB-canonical.
1672
- `);return{port:a,apiUrl:d,apiToken:c}}function JM(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 XM(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 ji({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 GM(t){Qy=t??Gu}function eE(t){let e=Object.keys(zi),r=Qy(e),n=r.filter(o=>!o.found);if(n.length>0){for(let o of n)t.stderr.write(`error: ${Gy(o)}
1672
+ `);return{port:a,apiUrl:d,apiToken:c}}function JM(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 XM(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 ji({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 GM(t){Qy=t??Vu}function eE(t){let e=Object.keys(zi),r=Qy(e),n=r.filter(o=>!o.found);if(n.length>0){for(let o of n)t.stderr.write(`error: ${Gy(o)}
1673
1673
  `);throw t.stderr.write(`error: agent refusing to start; ensure missing provider CLIs are on PATH
1674
1674
  `),new Zi(n)}let s=r.map(o=>o.provider).join(", ");t.stdout.write(`providers ready: ${s}
1675
- `)}function tE(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=Ky(r)?r:Vu(process.cwd(),r);return FM(`${n}/index.html`)?n:null}function rE(t){let e=t.LMCTL_LOCAL_MAILBOX_DIR;return e!==void 0&&e!==""?Ky(e)?e:Vu(process.cwd(),e):Vu(UM(),".lmctl","local-mailbox")}function VM(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 nE(t,e=process.env){let r=KM(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 KM(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 BM,Zi,Qy,oE=E(()=>{"use strict";Me();Lw();du();qw();_c();Uu();hu();tu();ru();Jy();Xu();Vy();He();BM=`usage: lmctl serve [--port N] [--bind HOST] [--no-daemon] [--insecure-no-auth] [--webui [DIR]]
1675
+ `)}function tE(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=Ky(r)?r:Ku(process.cwd(),r);return FM(`${n}/index.html`)?n:null}function rE(t){let e=t.LMCTL_LOCAL_MAILBOX_DIR;return e!==void 0&&e!==""?Ky(e)?e:Ku(process.cwd(),e):Ku(UM(),".lmctl","local-mailbox")}function VM(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 nE(t,e=process.env){let r=KM(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 KM(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 BM,Zi,Qy,oE=E(()=>{"use strict";Me();Lw();fu();qw();gc();Wu();_u();ru();nu();Jy();Gu();Vy();He();BM=`usage: lmctl serve [--port N] [--bind HOST] [--no-daemon] [--insecure-no-auth] [--webui [DIR]]
1676
1676
 
1677
1677
  Start the local HTTP API, web UI, queue daemon, terminal manager, and agent
1678
1678
  services. Help exits before any port binding or daemon startup.
@@ -1682,14 +1682,14 @@ services. Help exits before any port binding or daemon startup.
1682
1682
  against the local filesystem (no S3, no Cognito) with a fixed
1683
1683
  local identity. Mailbox store defaults to
1684
1684
  ~/.lmctl/local-mailbox/ ($LMCTL_LOCAL_MAILBOX_DIR overrides).
1685
- `;Zi=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}},Qy=Gu});var iE={};ie(iE,{runIntake:()=>zM});async function zM(t,e){let[r,...n]=t;return r==="--help"||r==="-h"||r==="help"?(e.stdout.write(YM),0):r==="scan"?ZM(n,e):r==="config"?QM(n,e):(e.stderr.write(`usage: lmctl intake <scan|config> ...
1686
- `),1)}async function ZM(t,e){let r=P(t,["--project"],["--json"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,`unknown argument: ${r.positionals[0]}`);let n=j(r,"--project");return J(e,async s=>{if(n!==void 0){let o=s.findProjectByName(n);if(o===null)return w(e,`project not found: ${n}`);let i=await pc({dal:s,project:o});return W(e,{project_id:o.id,project_name:o.name,...i}),0}return W(e,await Zr(s)),0})}async function QM(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return w(e,"usage: lmctl intake config <project-name> --scan-github-issues true|false [--labels csv] [--state open|closed|all]");let s=P(n,["--scan-github-issues","--labels","--state"],["--json"]);if(s.error!==void 0)return w(e,s.error);let o=j(s,"--scan-github-issues");if(o!=="true"&&o!=="false")return w(e,"missing or invalid --scan-github-issues true|false");let i=j(s,"--state");if(i!==void 0&&i!=="open"&&i!=="closed"&&i!=="all")return w(e,"invalid --state: expected open, closed, or all");let a=j(s,"--labels"),l={scan_github_issues:o==="true",labels:a===void 0?void 0:a.split(",").map(c=>c.trim()).filter(Boolean),state:i};return J(e,c=>{let u=c.findProjectByName(r);if(u===null)return w(e,`project not found: ${r}`);let d=c.setProjectIntakeConfig(u.id,JSON.stringify(l));return W(e,d),0})}var YM,aE=E(()=>{"use strict";Qo();Se();YM=`usage: lmctl intake <scan|config> ...
1685
+ `;Zi=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}},Qy=Vu});var iE={};ie(iE,{runIntake:()=>zM});async function zM(t,e){let[r,...n]=t;return r==="--help"||r==="-h"||r==="help"?(e.stdout.write(YM),0):r==="scan"?ZM(n,e):r==="config"?QM(n,e):(e.stderr.write(`usage: lmctl intake <scan|config> ...
1686
+ `),1)}async function ZM(t,e){let r=P(t,["--project"],["--json"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,`unknown argument: ${r.positionals[0]}`);let n=j(r,"--project");return J(e,async s=>{if(n!==void 0){let o=s.findProjectByName(n);if(o===null)return w(e,`project not found: ${n}`);let i=await hc({dal:s,project:o});return W(e,{project_id:o.id,project_name:o.name,...i}),0}return W(e,await Zr(s)),0})}async function QM(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return w(e,"usage: lmctl intake config <project-name> --scan-github-issues true|false [--labels csv] [--state open|closed|all]");let s=P(n,["--scan-github-issues","--labels","--state"],["--json"]);if(s.error!==void 0)return w(e,s.error);let o=j(s,"--scan-github-issues");if(o!=="true"&&o!=="false")return w(e,"missing or invalid --scan-github-issues true|false");let i=j(s,"--state");if(i!==void 0&&i!=="open"&&i!=="closed"&&i!=="all")return w(e,"invalid --state: expected open, closed, or all");let a=j(s,"--labels"),l={scan_github_issues:o==="true",labels:a===void 0?void 0:a.split(",").map(c=>c.trim()).filter(Boolean),state:i};return J(e,c=>{let u=c.findProjectByName(r);if(u===null)return w(e,`project not found: ${r}`);let d=c.setProjectIntakeConfig(u.id,JSON.stringify(l));return W(e,d),0})}var YM,aE=E(()=>{"use strict";Qo();Se();YM=`usage: lmctl intake <scan|config> ...
1687
1687
 
1688
1688
  Scan configured project GitHub issues into lmctl, or update per-project
1689
1689
  intake settings such as enabled state, labels, and issue state filters.
1690
- `});import{createHash as eD}from"node:crypto";import{existsSync as ls,mkdirSync as tD,readFileSync as cE,realpathSync as rD,writeFileSync as nD}from"node:fs";import{dirname as uE,resolve as dE}from"node:path";function vr(t){let e=dE(t);return ls(e)?rD(e):e}function lE(t,e){let r=uE(e),n=Cu(t,Lu(e),{baseDir:r});for(let s of n.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=dE(r,s.sessiondir));return n}function cs(t,e){let r=vr(t);if(e!==void 0){let n=e.getRootTeam(r);if(n!==null)return!ls(r)&&"upsertRootTeam"in e&&(tD(uE(r),{recursive:!0}),nD(r,n.raw_text,"utf8")),lE(n.raw_text,r);if(ls(r)){let s=cE(r,"utf8"),o=lE(s,r);return"upsertRootTeam"in e&&oD(o)&&iD(e,r,o,s),o}throw new Error(`teamfile not found: ${t}`)}if(!ls(r))throw new Error(`teamfile not found: ${t}`);return Ne(r)}function fE(t,e,r){let n=vr(t),s=e.getRootTeam(n);s===null||!ls(n)||cE(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 oD(t){return t.parseErrors.length>0?!1:t.members.every(e=>e.teamfile!==void 0?!0:e.session!==void 0&&e.session.length>=sD)}function iD(t,e,r,n){let s=new Date().toISOString(),o={teamfile_path:e,name:r.name,raw_text:n,raw_sha256:eD("sha256").update(n).digest("hex"),registered_at:s,last_seeded_at:s};t.upsertRootTeam(o);try{let i=Sr(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 sD,Qi=E(()=>{"use strict";Rt();sD=5});import{existsSync as aD}from"node:fs";import{dirname as mE}from"node:path";function uD(t){return lD.test(t)||cD.test(t)}function pE(t){return ea.test(t)}function Ku(t){if(!t.includes(":"))return null;let e=t.lastIndexOf(":"),r=t.slice(0,e),n=t.slice(e+1);return!r.endsWith(".lmctl")||!ea.test(n)?null:{teamfile:r,alias:n}}function Ot(t,e,r){if(!t.endsWith(".lmctl"))throw new ge(`lmctl: "${t}" doesn't look like a teamfile (expected .lmctl extension).`);if(!pE(e))throw new ge(`lmctl: "${e}" is not a valid alias (must match ${ea.source}).`);let n=vr(t);if(r===void 0&&!aD(n))throw new ge(`lmctl: teamfile not found: ${t}`);let s;try{s=cs(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=os(s,e);if(o===void 0){let i=s.members.map(a=>a.alias).join(", ")||"(none)";throw new ge(`lmctl: alias "${e}" not found in ${t}.
1691
- Known aliases: ${i}`)}if(o.teamfile!==void 0){let i=Du(o,mE(n));return{teamfile:n,alias:o.alias,provider:i.provider,sessionid:i.session,sessiondir:i.sessiondir,...i.model??o.model?{model:i.model??o.model}:{}}}if(o.session===void 0)throw new ge(`lmctl: alias "${o.alias}" in ${t} has no session ID yet.
1692
- Run: lmctl seed ${t}`);return{teamfile:n,alias:o.alias,provider:o.provider,sessionid:o.session,sessiondir:o.sessiondir??mE(n),...o.model!==void 0?{model:o.model}:{}}}function Zt(t,e){let{target:r,alias:n,flags:s}=e;if(s.run!==void 0||s.project!==void 0||s.workflow!==void 0){if(r!==void 0)return{mode:"error",message:`lmctl ${t.name}: --run/--project/--workflow (managed mode) are mutually exclusive with a positional target "${r}" \u2014 pick one form.`};let i={mode:"managed"};return s.run!==void 0&&(i.run=s.run),s.project!==void 0&&(i.project=s.project),s.workflow!==void 0&&(i.workflow=s.workflow),i}if(r!==void 0){let i=Ku(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?pE(n)?{mode:"ai-team",teamfile:r,alias:n}:{mode:"error",message:`lmctl ${t.name}: "${n}" is not a valid alias (must match ${ea.source}).`}:t.allowsBareTeamfile?{mode:"ai-team",teamfile:r}:{mode:"error",message:`lmctl ${t.name}: alias required.
1690
+ `});import{createHash as eD}from"node:crypto";import{existsSync as ls,mkdirSync as tD,readFileSync as cE,realpathSync as rD,writeFileSync as nD}from"node:fs";import{dirname as uE,resolve as dE}from"node:path";function vr(t){let e=dE(t);return ls(e)?rD(e):e}function lE(t,e){let r=uE(e),n=Mu(t,Cu(e),{baseDir:r});for(let s of n.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=dE(r,s.sessiondir));return n}function cs(t,e){let r=vr(t);if(e!==void 0){let n=e.getRootTeam(r);if(n!==null)return!ls(r)&&"upsertRootTeam"in e&&(tD(uE(r),{recursive:!0}),nD(r,n.raw_text,"utf8")),lE(n.raw_text,r);if(ls(r)){let s=cE(r,"utf8"),o=lE(s,r);return"upsertRootTeam"in e&&oD(o)&&iD(e,r,o,s),o}throw new Error(`teamfile not found: ${t}`)}if(!ls(r))throw new Error(`teamfile not found: ${t}`);return Ne(r)}function fE(t,e,r){let n=vr(t),s=e.getRootTeam(n);s===null||!ls(n)||cE(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 oD(t){return t.parseErrors.length>0?!1:t.members.every(e=>e.teamfile!==void 0?!0:e.session!==void 0&&e.session.length>=sD)}function iD(t,e,r,n){let s=new Date().toISOString(),o={teamfile_path:e,name:r.name,raw_text:n,raw_sha256:eD("sha256").update(n).digest("hex"),registered_at:s,last_seeded_at:s};t.upsertRootTeam(o);try{let i=Sr(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 sD,Qi=E(()=>{"use strict";Rt();sD=5});import{existsSync as aD}from"node:fs";import{dirname as mE}from"node:path";function uD(t){return lD.test(t)||cD.test(t)}function pE(t){return ea.test(t)}function Yu(t){if(!t.includes(":"))return null;let e=t.lastIndexOf(":"),r=t.slice(0,e),n=t.slice(e+1);return!r.endsWith(".lmctl")||!ea.test(n)?null:{teamfile:r,alias:n}}function Ot(t,e,r){if(!t.endsWith(".lmctl"))throw new ge(`lmctl: "${t}" doesn't look like a teamfile (expected .lmctl extension).`);if(!pE(e))throw new ge(`lmctl: "${e}" is not a valid alias (must match ${ea.source}).`);let n=vr(t);if(r===void 0&&!aD(n))throw new ge(`lmctl: teamfile not found: ${t}`);let s;try{s=cs(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=os(s,e);if(o===void 0){let i=s.members.map(a=>a.alias).join(", ")||"(none)";throw new ge(`lmctl: alias "${e}" not found in ${t}.
1691
+ Known aliases: ${i}`)}if(o.teamfile!==void 0){let i=Pu(o,mE(n));return{teamfile:n,alias:o.alias,provider:i.provider,sessionid:i.session,sessiondir:i.sessiondir,...i.model??o.model?{model:i.model??o.model}:{}}}if(o.session===void 0)throw new ge(`lmctl: alias "${o.alias}" in ${t} has no session ID yet.
1692
+ Run: lmctl seed ${t}`);return{teamfile:n,alias:o.alias,provider:o.provider,sessionid:o.session,sessiondir:o.sessiondir??mE(n),...o.model!==void 0?{model:o.model}:{}}}function Qt(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=Yu(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?pE(n)?{mode:"ai-team",teamfile:r,alias:n}:{mode:"error",message:`lmctl ${t.name}: "${n}" is not a valid alias (must match ${ea.source}).`}:t.allowsBareTeamfile?{mode:"ai-team",teamfile:r}:{mode:"error",message:`lmctl ${t.name}: alias required.
1693
1693
  Use: lmctl ${t.name} ${r}:<alias> or lmctl ${t.name} ${r} <alias>`};if(uD(r)){if(n!==void 0)return{mode:"error",message:`lmctl ${t.name}: got a second positional "${n}" but "${r}" is not a teamfile path.`};if(!t.supportsRaw)return{mode:"error",message:`lmctl ${t.name}: "${r}" is a bare sessionid, but ${t.name} is teamfile-only (a sessionid carries no provider resume incantation).`};let a={mode:"ai-team-raw",sessionid:r};return s.provider!==void 0&&(a.provider=s.provider),a}return n!==void 0?{mode:"error",message:`lmctl ${t.name}: got a second positional "${n}" but "${r}" is not a teamfile path.
1694
1694
  Either drop the second arg, or pass <teamfile>.lmctl as the first arg.`}:{mode:"error",message:`lmctl ${t.name}: can't infer target type from "${r}".
1695
1695
  Expected one of: <path>.lmctl, <path>.lmctl:<alias>, <sessionid>.`}}if(s.session!==void 0){if(!t.supportsRaw)return{mode:"error",message:`lmctl ${t.name}: --session (raw mode) is not supported by ${t.name}.`};let i={mode:"ai-team-raw",sessionid:s.session};return s.provider!==void 0&&(i.provider=s.provider),i}return{mode:"error",message:`lmctl ${t.name}: a target is required.
@@ -1706,21 +1706,21 @@ ${bE}
1706
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":""})
1707
1707
  `),0):(e.stderr.write(`error: run ${l}: resumeInteractive failed (${m.reason})
1708
1708
  `),1)}return e.stderr.write(`error: run ${l}: pending attention kind "${d.kind}" is not operator-answerable
1709
- `),1})}let n=Zt(dD,{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=Qt(dD,{target:r.target,alias:r.alias,flags:{session:r.sessionFlag,provider:r.providerFlag}});if(n.mode==="error")return e.stderr.write(`error: ${n.message}
1710
1710
  `),2;if(n.mode==="managed")return e.stderr.write(`error: chat managed mode requires --run <id>
1711
1711
  `),2;let s,o=null,i=null;if(n.mode==="ai-team"){if(n.alias===void 0)return e.stderr.write(`error: chat: alias required (internal)
1712
1712
  `),2;let l=n.alias;try{let c=await J(e,h=>Ot(n.teamfile,l,h)),u=c.teamfile,d=await J(e,h=>pD(r.fromFlag,u,h)),f=await hD(e,{explicitRoot:r.rootFlag,sender:d,receiverTeamfile:u,operatorOrigin:r.fromFlag===void 0}),m=r.fromFlag===void 0?null:await yD(e,{rootTeamfile:f,sender:d,receiverTeamfile:u,receiverAlias:c.alias});m!==null&&!m.allowed&&e.stderr.write(`warning: out-of-policy chat send: ${m.reason}
1713
- `),s={provider:c.provider,sessionId:c.sessionid,cwd:c.sessiondir,alias:c.alias,...c.model!==void 0?{model:c.model}:{}},o={root_teamfile:f,sender_teamfile:d.teamfile,sender_alias:d.alias,receiver_teamfile:u,receiver_alias:c.alias,policy:m};let p=await TD(e,{receiver_teamfile:u,receiver_alias:c.alias,sender_teamfile:d.teamfile,sender_alias:d.alias,force:r.force===!0});if(!p.acquired){let h=kD(c.alias,p.current);return await Yu(e,{...o,message:r.prompt,response:null,status:"error",error_detail:h}),e.stderr.write(`error: ${h}
1713
+ `),s={provider:c.provider,sessionId:c.sessionid,cwd:c.sessiondir,alias:c.alias,...c.model!==void 0?{model:c.model}:{}},o={root_teamfile:f,sender_teamfile:d.teamfile,sender_alias:d.alias,receiver_teamfile:u,receiver_alias:c.alias,policy:m};let p=await TD(e,{receiver_teamfile:u,receiver_alias:c.alias,sender_teamfile:d.teamfile,sender_alias:d.alias,force:r.force===!0});if(!p.acquired){let h=kD(c.alias,p.current);return await zu(e,{...o,message:r.prompt,response:null,status:"error",error_detail:h}),e.stderr.write(`error: ${h}
1714
1714
  `),1}i=p.lease}catch(c){let u=c instanceof Error?c.message:String(c);return e.stderr.write(`error: ${u}
1715
1715
  `),c instanceof ge,1}}else{if(r.force===!0)return e.stderr.write(`error: --force is only valid for AI-team chat
1716
1716
  `),2;if(n.provider===void 0)return e.stderr.write(`error: chat raw mode (bare sessionid / --session) requires --provider <name>
1717
- `),2;s={provider:n.provider,sessionId:n.sessionid,cwd:process.cwd()}}let a=!1;try{let l={provider:s.provider,sessionId:s.sessionId,cwd:s.cwd,prompt:r.prompt,permissionMode:r.permissionMode,env:process.env,onDelta:d=>{a=!0,e.stdout.write(d)},onProgress:d=>vD(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 dr(l),u=c.status==="stalled";return o!==null&&await Yu(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=>vD(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 fr(l),u=c.status==="stalled";return o!==null&&await zu(e,{...o,message:r.prompt,response:u?null:c.text,status:o.policy?.outOfPolicy===!0?"out_of_policy":u?"error":"ok",error_detail:o.policy?.outOfPolicy===!0?o.policy.reason:u?`provider stalled${c.stalledAfterMs!==void 0?` after ${c.stalledAfterMs}ms`:""}`:null}),a?c.text.endsWith(`
1718
1718
  `)||e.stdout.write(`
1719
1719
  `):e.stdout.write(`${c.text}${c.text.endsWith(`
1720
1720
  `)?"":`
1721
- `}`),c.status==="stalled"?1:0}catch(l){let c=l instanceof Error?l.message:String(l);return o!==null&&await Yu(e,{...o,message:r.prompt,response:null,status:o.policy?.outOfPolicy===!0?"out_of_policy":"error",error_detail:o.policy?.outOfPolicy===!0?`${o.policy.reason}; provider error: ${c}`:c}),e.stderr.write(`error: ${c}
1722
- `),1}finally{i!==null&&await SD(e,i)}}function mD(t){let e=[],r="yolo",n,s,o,i,a,l=!1,c,u=!1;for(let h=0;h<t.length;h+=1){let g=t[h];if(g==="--permission-mode"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --permission-mode";if(_!=="plan"&&_!=="yolo")return`--permission-mode must be one of plan|yolo (got "${_}")`;r=_;continue}if(g==="--idle-timeout"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --idle-timeout";let T=kE(_);if(typeof T=="string")return T;n=T;continue}if(g==="--session"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --session";s=_;continue}if(g==="--provider"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --provider";o=_;continue}if(g==="--from"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --from";i=_;continue}if(g==="--root"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --root";a=_;continue}if(g==="--force"){l=!0;continue}if(g==="--run"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --run";c=_;continue}if(g==="--done"){u=!0;continue}if(g.startsWith("--"))return`unknown flag: ${g}`;e.push(g)}if(c!==void 0)return s!==void 0?"--run is mutually exclusive with --session":o!==void 0?"--run is mutually exclusive with --provider":i!==void 0?"--run is mutually exclusive with --from":a!==void 0?"--run is mutually exclusive with --root":l?"--run is mutually exclusive with --force":e.length===0?"a prompt (answer) is required with --run":e.length>1?`--run takes exactly one positional (the answer); got ${e.length}`:{prompt:e[0],permissionMode:r,runFlag:c,done:u};let d,f,m;if(e.length===0)return"a prompt is required";if(e.length===1){if(s===void 0)return'expected <teamfile>:<alias> "<prompt>" | <teamfile> <alias> "<prompt>" | <sessionid> "<prompt>" | --session <id> "<prompt>"';m=e[0]}else if(e.length===2)d=e[0],m=e[1];else if(e.length===3)d=e[0],f=e[1],m=e[2];else return`too many positionals (${e.length}); expected at most <teamfile> <alias> <prompt>`;if(u)return"--done requires --run";let p={prompt:m,permissionMode:r};return d!==void 0&&(p.target=d),f!==void 0&&(p.alias=f),n!==void 0&&(p.idleTimeoutMs=n),s!==void 0&&(p.sessionFlag=s),o!==void 0&&(p.providerFlag=o),i!==void 0&&(p.fromFlag=i),a!==void 0&&(p.rootFlag=a),l&&(p.force=!0),p}function pD(t,e,r){if(t===void 0)return{teamfile:e,alias:"operator"};let n=Ku(t);if(n===null)throw new ge("--from must be <teamfile.lmctl>:<alias>");let s=vr(n.teamfile),o=cs(s,r);if(o.parseErrors.length>0)throw new ge(`--from ${n.teamfile}: ${o.parseErrors.join("; ")}`);let i=os(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 hD(t,e){return e.explicitRoot!==void 0?vr(e.explicitRoot):e.operatorOrigin?e.receiverTeamfile:await J(t,r=>_D(r,e.sender.teamfile)??e.receiverTeamfile)}function _D(t,e){let r=t.listRootTeams().slice().sort(gD);for(let n of r)if(wD(t,n.teamfile_path,e))return n.teamfile_path;return null}function gD(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 wD(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 yD(t,e){return await J(t,r=>gE({rootTeamfile:e.rootTeamfile,fromTeamfile:e.sender.teamfile,fromAlias:e.sender.alias,toTeamfile:e.receiverTeamfile,toAlias:e.receiverAlias,registry:ED(r,e.sender.teamfile,e.receiverTeamfile)}))}function ED(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=>bD(o,t)),connections:s.map(o=>({sourceTeamfile:o.source_teamfile,targetTeamfile:o.target_teamfile,targetName:o.target_name}))}}function bD(t,e){let r=cs(t,e),n=pt(r);return{teamfile:t,aliases:r.members.map(s=>s.alias),leadAlias:n?.alias??null}}async function TD(t,e){let r=new Date().toISOString(),n=new Date(Date.now()-SE()).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 SD(t,e){try{await J(t,r=>{r.releaseAgentInflight(e)})}catch(r){t.stderr.write(`warning: failed to release chat in-flight slot: ${r instanceof Error?r.message:String(r)}
1723
- `)}}function kD(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function SE(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return EE;let r=Number(e);return!Number.isFinite(r)||r<=0?EE:r}async function Yu(t,e){let r=TE(e.message),n=e.response===null?null:TE(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)}
1721
+ `}`),c.status==="stalled"?1:0}catch(l){let c=l instanceof Error?l.message:String(l);return o!==null&&await zu(e,{...o,message:r.prompt,response:null,status:o.policy?.outOfPolicy===!0?"out_of_policy":"error",error_detail:o.policy?.outOfPolicy===!0?`${o.policy.reason}; provider error: ${c}`:c}),e.stderr.write(`error: ${c}
1722
+ `),1}finally{i!==null&&await SD(e,i)}}function mD(t){let e=[],r="yolo",n,s,o,i,a,l=!1,c,u=!1;for(let h=0;h<t.length;h+=1){let g=t[h];if(g==="--permission-mode"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --permission-mode";if(_!=="plan"&&_!=="yolo")return`--permission-mode must be one of plan|yolo (got "${_}")`;r=_;continue}if(g==="--idle-timeout"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --idle-timeout";let T=kE(_);if(typeof T=="string")return T;n=T;continue}if(g==="--session"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --session";s=_;continue}if(g==="--provider"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --provider";o=_;continue}if(g==="--from"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --from";i=_;continue}if(g==="--root"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --root";a=_;continue}if(g==="--force"){l=!0;continue}if(g==="--run"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --run";c=_;continue}if(g==="--done"){u=!0;continue}if(g.startsWith("--"))return`unknown flag: ${g}`;e.push(g)}if(c!==void 0)return s!==void 0?"--run is mutually exclusive with --session":o!==void 0?"--run is mutually exclusive with --provider":i!==void 0?"--run is mutually exclusive with --from":a!==void 0?"--run is mutually exclusive with --root":l?"--run is mutually exclusive with --force":e.length===0?"a prompt (answer) is required with --run":e.length>1?`--run takes exactly one positional (the answer); got ${e.length}`:{prompt:e[0],permissionMode:r,runFlag:c,done:u};let d,f,m;if(e.length===0)return"a prompt is required";if(e.length===1){if(s===void 0)return'expected <teamfile>:<alias> "<prompt>" | <teamfile> <alias> "<prompt>" | <sessionid> "<prompt>" | --session <id> "<prompt>"';m=e[0]}else if(e.length===2)d=e[0],m=e[1];else if(e.length===3)d=e[0],f=e[1],m=e[2];else return`too many positionals (${e.length}); expected at most <teamfile> <alias> <prompt>`;if(u)return"--done requires --run";let p={prompt:m,permissionMode:r};return d!==void 0&&(p.target=d),f!==void 0&&(p.alias=f),n!==void 0&&(p.idleTimeoutMs=n),s!==void 0&&(p.sessionFlag=s),o!==void 0&&(p.providerFlag=o),i!==void 0&&(p.fromFlag=i),a!==void 0&&(p.rootFlag=a),l&&(p.force=!0),p}function pD(t,e,r){if(t===void 0)return{teamfile:e,alias:"operator"};let n=Yu(t);if(n===null)throw new ge("--from must be <teamfile.lmctl>:<alias>");let s=vr(n.teamfile),o=cs(s,r);if(o.parseErrors.length>0)throw new ge(`--from ${n.teamfile}: ${o.parseErrors.join("; ")}`);let i=os(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 hD(t,e){return e.explicitRoot!==void 0?vr(e.explicitRoot):e.operatorOrigin?e.receiverTeamfile:await J(t,r=>_D(r,e.sender.teamfile)??e.receiverTeamfile)}function _D(t,e){let r=t.listRootTeams().slice().sort(gD);for(let n of r)if(wD(t,n.teamfile_path,e))return n.teamfile_path;return null}function gD(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 wD(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 yD(t,e){return await J(t,r=>gE({rootTeamfile:e.rootTeamfile,fromTeamfile:e.sender.teamfile,fromAlias:e.sender.alias,toTeamfile:e.receiverTeamfile,toAlias:e.receiverAlias,registry:ED(r,e.sender.teamfile,e.receiverTeamfile)}))}function ED(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=>bD(o,t)),connections:s.map(o=>({sourceTeamfile:o.source_teamfile,targetTeamfile:o.target_teamfile,targetName:o.target_name}))}}function bD(t,e){let r=cs(t,e),n=pt(r);return{teamfile:t,aliases:r.members.map(s=>s.alias),leadAlias:n?.alias??null}}async function TD(t,e){let r=new Date().toISOString(),n=new Date(Date.now()-SE()).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 SD(t,e){try{await J(t,r=>{r.releaseAgentInflight(e)})}catch(r){t.stderr.write(`warning: failed to release chat in-flight slot: ${r instanceof Error?r.message:String(r)}
1723
+ `)}}function kD(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function SE(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return EE;let r=Number(e);return!Number.isFinite(r)||r<=0?EE:r}async function zu(t,e){let r=TE(e.message),n=e.response===null?null:TE(e.response);try{await J(t,s=>{s.insertTeamChatLog({root_teamfile:e.root_teamfile,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,message:r.text,response:n?.text??null,status:e.status,error_detail:e.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()})})}catch(s){t.stderr.write(`warning: failed to record chat log: ${s instanceof Error?s.message:String(s)}
1724
1724
  `)}}function TE(t){return t.length<=yE?{text:t,truncated:!1}:{text:t.slice(0,yE),truncated:!0}}function kE(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 vD(t,e,r){r.kind==="tool_use"?t.stderr.write(`[${e}] tool_use ${r.tool??"tool"}${r.summary?`: ${r.summary}`:""}
1725
1725
  `):r.kind==="tool_result"?t.stderr.write(`[${e}] tool_result${r.status?` ${r.status}`:""}${r.summary?`: ${r.summary}`:""}
1726
1726
  `):r.kind==="api_retry"&&t.stderr.write(`[${e}] api_retry${r.summary?`: ${r.summary}`:""}
@@ -1732,12 +1732,12 @@ ${bE}
1732
1732
  [--permission-mode plan|yolo] [--idle-timeout <duration>]
1733
1733
  [--from <teamfile>:<alias>] [--root <teamfile>] [--force]
1734
1734
 
1735
- Send a prompt to a team member or raw provider session, or answer a paused run.`});var ds,CK,zu=E(()=>{"use strict";ds=[{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}],CK=ds.length});import{spawn as ID}from"node:child_process";async function $E(t,e,r){let n=ND.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 xD(n.name,s)}function xD(t,e){return t==="lmctl_chat"?jD(e):{status:"error",code:404,message:`unknown local tool: ${t}`}}function jD(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),AD(c,u)}function AD(t,e){return new Promise(r=>{let n=!1,s=l=>{n||(n=!0,r(l))},o=ID("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 NE(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:$D),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 $D,ND,Zu=E(()=>{"use strict";zu();$D="http://127.0.0.1:8787",ND=new Map(ds.map(t=>[t.name,t]))});async function CD(t,e){let r=t.id===void 0,n=t.id??null;if(t.method==="exit")return r||e.io.write(Qu({jsonrpc:"2.0",id:n,result:null})),{kind:"exit"};if(t.method==="initialize")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{protocolVersion:RD,capabilities:{tools:{listChanged:!1}},serverInfo:{name:OD,version:LD}}}};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:ds.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 $E(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 Qu(t){return`${JSON.stringify(t)}
1736
- `}async function xE(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(Qu({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 CD(l,t);c.kind==="response"?t.io.write(Qu(c.message)):c.kind==="exit"&&(s=!0)};return new Promise(i=>{let a=Promise.resolve(),l=!1,c=d=>{l||(l=!0,i(d))},u=()=>{let d=n.indexOf(`
1735
+ Send a prompt to a team member or raw provider session, or answer a paused run.`});var ds,CK,Zu=E(()=>{"use strict";ds=[{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}],CK=ds.length});import{spawn as ID}from"node:child_process";async function $E(t,e,r){let n=ND.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 xD(n.name,s)}function xD(t,e){return t==="lmctl_chat"?jD(e):{status:"error",code:404,message:`unknown local tool: ${t}`}}function jD(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),AD(c,u)}function AD(t,e){return new Promise(r=>{let n=!1,s=l=>{n||(n=!0,r(l))},o=ID("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 NE(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:$D),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 $D,ND,Qu=E(()=>{"use strict";Zu();$D="http://127.0.0.1:8787",ND=new Map(ds.map(t=>[t.name,t]))});async function CD(t,e){let r=t.id===void 0,n=t.id??null;if(t.method==="exit")return r||e.io.write(ed({jsonrpc:"2.0",id:n,result:null})),{kind:"exit"};if(t.method==="initialize")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{protocolVersion:RD,capabilities:{tools:{listChanged:!1}},serverInfo:{name:OD,version:LD}}}};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:ds.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 $E(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 ed(t){return`${JSON.stringify(t)}
1736
+ `}async function xE(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(ed({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 CD(l,t);c.kind==="response"?t.io.write(ed(c.message)):c.kind==="exit"&&(s=!0)};return new Promise(i=>{let a=Promise.resolve(),l=!1,c=d=>{l||(l=!0,i(d))},u=()=>{let d=n.indexOf(`
1737
1737
  `);for(;d!==-1;){let f=n.slice(0,d);n=n.slice(d+1),a=a.then(()=>o(f)).then(()=>{s&&c(0)}),d=n.indexOf(`
1738
1738
  `)}};e.setEncoding("utf8"),e.on("data",d=>{n+=d,u()}),e.on("end",()=>{n.trim().length>0&&(a=a.then(()=>o(n))),a.finally(()=>c(0))}),e.on("error",d=>{t.io.log?.(`mcp: stdin error: ${d.message}
1739
- `),a.finally(()=>c(1))})})}var RD,OD,LD,jE=E(()=>{"use strict";zu();Zu();RD="2025-06-18",OD="lmctl",LD="0.0.1"});var AE={};ie(AE,{runMcp:()=>DD});async function DD(t,e={stdout:process.stdout,stderr:process.stderr},r=process.stdin){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(MD),0;if(t.length>0)return e.stderr.write(`usage: lmctl mcp
1740
- `),2;let n=e.dal===void 0,s=e.dal??pe({path:de()});try{let o=NE(s,process.env);return await xE({io:{write:a=>e.stdout.write(a),log:a=>e.stderr.write(a)},dispatch:{config:o,dal:s}},r)}finally{n&&s.close()}}var MD,RE=E(()=>{"use strict";Me();Zu();jE();He();MD=`usage: lmctl mcp
1739
+ `),a.finally(()=>c(1))})})}var RD,OD,LD,jE=E(()=>{"use strict";Zu();Qu();RD="2025-06-18",OD="lmctl",LD="0.0.1"});var AE={};ie(AE,{runMcp:()=>DD});async function DD(t,e={stdout:process.stdout,stderr:process.stderr},r=process.stdin){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(MD),0;if(t.length>0)return e.stderr.write(`usage: lmctl mcp
1740
+ `),2;let n=e.dal===void 0,s=e.dal??pe({path:de()});try{let o=NE(s,process.env);return await xE({io:{write:a=>e.stdout.write(a),log:a=>e.stderr.write(a)},dispatch:{config:o,dal:s}},r)}finally{n&&s.close()}}var MD,RE=E(()=>{"use strict";Me();Qu();jE();He();MD=`usage: lmctl mcp
1741
1741
 
1742
1742
  Start the stdio MCP bridge. The bridge resolves api.url and api.token from
1743
1743
  local config, then uses stdin/stdout for JSON-RPC frames.
@@ -1797,22 +1797,22 @@ local config, then uses stdin/stdout for JSON-RPC frames.
1797
1797
 
1798
1798
  Scan the DB for stale runs, stuck jobs, overdue attentions, and overdue
1799
1799
  issues; emit findings as attentions for the operator/master to handle.
1800
- `});var WE={};ie(WE,{runDevice:()=>oP});import{readFileSync as KD}from"node:fs";import{homedir as YD}from"node:os";import{join as zD}from"node:path";import{CognitoIdentityClient as ZD,GetIdCommand as QD}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as eP}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as tP,ListObjectsV2Command as rP,PutObjectCommand as nP,S3Client as sP}from"@aws-sdk/client-s3";async function oP(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(ed),0;if(r==="init"){let n=Ju();return e.stdout.write(`${n.device_id}
1800
+ `});var WE={};ie(WE,{runDevice:()=>oP});import{readFileSync as KD}from"node:fs";import{homedir as YD}from"node:os";import{join as zD}from"node:path";import{CognitoIdentityClient as ZD,GetIdCommand as QD}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as eP}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as tP,ListObjectsV2Command as rP,PutObjectCommand as nP,S3Client as sP}from"@aws-sdk/client-s3";async function oP(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(td),0;if(r==="init"){let n=Xu();return e.stdout.write(`${n.device_id}
1801
1801
  `),0}if(r==="id"){let n=kr();return n===null?(e.stderr.write(`error: no device id initialized at ${Yi()}; run 'lmctl device init'
1802
1802
  `),1):(e.stdout.write(`${n.device_id}
1803
1803
  `),0)}return r==="login"?await iP(t.slice(1),e):r==="prompt"?await lP(t.slice(1),e):(e.stderr.write(`usage: lmctl device <id|init|login|prompt>
1804
1804
  `),1)}async function iP(t,e){let r=aP(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1805
- ${ed}`),2;let n=as();if(n.config===void 0)return e.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
1805
+ ${td}`),2;let n=as();if(n.config===void 0)return e.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
1806
1806
  `),1;gy({userId:r.userId,refreshToken:r.accessKey});let s,o,i;try{let c=await Bi({region:n.config.region,clientId:n.config.cognitoClientId??Ki,refreshToken:r.accessKey});s=c.idToken,o=c.accessToken,i=c.expiresAt}catch(c){let u=c instanceof Error?c.message:String(c);return e.stderr.write(`error: could not authenticate access key: ${u}
1807
1807
  `),1}let a=ns(s);if(a!==null&&a!==r.userId)return e.stderr.write(`error: access key belongs to user-id ${a}, not ${r.userId}
1808
- `),1;xu({idToken:s,...o!==void 0?{accessToken:o}:{},refreshToken:r.accessKey,...i!==void 0?{expiresAt:i}:{}});let l=kr()??Ju();return e.stdout.write(`logged in as ${r.userId}
1808
+ `),1;ju({idToken:s,...o!==void 0?{accessToken:o}:{},refreshToken:r.accessKey,...i!==void 0?{expiresAt:i}:{}});let l=kr()??Xu();return e.stdout.write(`logged in as ${r.userId}
1809
1809
  device id: ${l.device_id}
1810
1810
  mailbox prefix: ${r.userId}/${l.device_id}/
1811
1811
  access key stored at ${ss()}
1812
1812
  `),0}function aP(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 lP(t,e){let r=cP(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1813
- ${ed}`),2;let n=as();if(n.config===void 0)return e.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
1813
+ ${td}`),2;let n=as();if(n.config===void 0)return e.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
1814
1814
  `),1;let s=dP();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 uP({region:n.config.region,identityPoolId:n.config.identityPoolId,idpProvider:i,idToken:o}),l=eP({identityId:a,logins:{[i]:o},clientConfig:{region:n.config.region}}),c=n.config.deviceId??kr()?.device_id,u=ns(o)??void 0,d=new Tr({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 sP({region:n.config.region,credentials:l}),commands:{ListObjectsV2Command:rP,GetObjectCommand:tP,PutObjectCommand:nP},selfRole:"browser",onMessage:async()=>{}}),f=iy({root_teamfile:r.root,text:r.text,...r.promptId!==void 0?{prompt_id:r.promptId}:{}}),m=await d.putMessage({conversation_id:oy,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 cP(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 uP(t){let r=await new ZD({region:t.region}).send(new QD({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 dP(t=process.env.LMCTL_TOKEN_PATH??zD(YD(),".lmctl","cli-tokens.json")){try{return JSON.parse(KD(t,"utf8"))}catch{return null}}var ed,BE=E(()=>{"use strict";Xu();Uu();Ii();vu();Iu();ju();$u();ed=`usage: lmctl device <id|init>
1815
+ `),0}function cP(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 uP(t){let r=await new ZD({region:t.region}).send(new QD({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 dP(t=process.env.LMCTL_TOKEN_PATH??zD(YD(),".lmctl","cli-tokens.json")){try{return JSON.parse(KD(t,"utf8"))}catch{return null}}var td,BE=E(()=>{"use strict";Gu();Wu();Ii();Iu();$u();Au();Nu();td=`usage: lmctl device <id|init>
1816
1816
  lmctl device login --user-id <sub> --access-key <refreshToken>
1817
1817
  lmctl device prompt --root <teamfile> --text <prompt> [--prompt-id <id>]
1818
1818
 
@@ -1829,7 +1829,7 @@ token). The access key is stored in ~/.lmctl/device-auth.json (chmod 600).
1829
1829
  `)}${s.length>0?`
1830
1830
  `:""}`),0}function wP(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: team show <name> [--json]");let o=r.findTeamByName(s);if(o===null)return w(e,`team not found: ${s}`);let i=r.listTeamMembers(o.id);if(M(n,"--json"))W(e,{team:o,members:i});else{e.stdout.write(`team ${o.name}
1831
1831
  `);for(let a of i)e.stdout.write(`- ${a.alias} ${ke(a)} ${a.sessionid??"(unseeded)"}
1832
- `)}return 0}function yP(t,e,r){let n=P(t,["--alias","--provider","--model","--role","--sessiondir"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: team add-member <team-name> --alias A --provider P [--model M] [--role R] [--sessiondir D]");let o=r.findTeamByName(s);if(o===null)return w(e,`team not found: ${s}`);let i=j(n,"--alias"),a=j(n,"--provider");if(i===void 0||a===void 0)return w(e,"team add-member requires --alias and --provider");let l=r.insertTeamMember({team_id:o.id,alias:i,provider:a,model:j(n,"--model")??null,role:j(n,"--role")??"agent",sessiondir:j(n,"--sessiondir")??fP(rr(),"sessions",o.name,i)});return M(n,"--json")?W(e,l):e.stdout.write(`added member ${l.alias} to ${o.name}
1832
+ `)}return 0}function yP(t,e,r){let n=P(t,["--alias","--provider","--model","--role","--sessiondir"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: team add-member <team-name> --alias A --provider P [--model M] [--role R] [--sessiondir D]");let o=r.findTeamByName(s);if(o===null)return w(e,`team not found: ${s}`);let i=j(n,"--alias"),a=j(n,"--provider");if(i===void 0||a===void 0)return w(e,"team add-member requires --alias and --provider");let l=r.insertTeamMember({team_id:o.id,alias:i,provider:a,model:j(n,"--model")??null,role:j(n,"--role")??"agent",sessiondir:j(n,"--sessiondir")??fP(nr(),"sessions",o.name,i)});return M(n,"--json")?W(e,l):e.stdout.write(`added member ${l.alias} to ${o.name}
1833
1833
  `),0}async function qE(t,e,r,n){let s=P(t,["--alias"]);if(s.error!==void 0)return w(e,s.error);let[o]=s.positionals;if(o===void 0)return w(e,n?"usage: team refresh <team-name> --alias A":"usage: team seed <team-name> [--alias A]");let i=r.findTeamByName(o);if(i===null)return w(e,`team not found: ${o}`);let a=j(s,"--alias");if(n&&a===void 0)return w(e,"team refresh requires --alias");if(n&&a!==void 0&&a.trim().toLowerCase()==="lead")return w(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let l=EP(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=ig(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))vo(f,r),$o(f);let u=[],d=!1;for(let f of l){let m=await Pr({member:f,dal:r}),p=r.updateTeamMemberSession(f.id,m.sessionid);if(p!==null){let h=p.role_prompt??"",g=h.length>0?`${h}
1834
1834
 
1835
1835
  ${Br}`:Br;r.setMemberPromptSnapshot(f.id,g),u.push(p);let _=qr(ke(p),m.sessionid);_!==null&&e.stderr.write(`[seeded ${p.alias}] customize/compact in its native TUI:
@@ -1837,7 +1837,7 @@ ${Br}`:Br;r.setMemberPromptSnapshot(f.id,g),u.push(p);let _=qr(ke(p),m.sessionid
1837
1837
  `);try{await Po({dal:r,member:p,stderr:e.stderr})}catch(T){d=!0,e.stderr.write(`error: ${T instanceof Error?T.message:String(T)}
1838
1838
  `)}}}return M(s,"--json")?W(e,u):e.stdout.write(`seeded ${u.length} member(s)
1839
1839
  `),d?1:0}function EP(t,e,r){return t.filter(n=>e!==void 0&&n.alias!==e?!1:r||n.sessionid===null)}function bP(t,e,r){let n=P(t,["--interpreter","--of"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: team companion <team-name> --interpreter A --of B[,C]");let o=r.findTeamByName(s);if(o===null)return w(e,`team not found: ${s}`);let i=j(n,"--interpreter"),a=j(n,"--of")?.split(",").map(c=>c.trim()).filter(Boolean);if(i===void 0||a===void 0||a.length===0)return w(e,"team companion requires --interpreter and --of");let l=r.findTeamMemberByAlias(o.id,i);if(l===null)return w(e,`member not found: ${i}`);for(let c of a){let u=r.findTeamMemberByAlias(o.id,c);if(u===null)return w(e,`member not found: ${c}`);r.insertTeamMemberCompanion({interpreter_id:l.id,companion_id:u.id})}return e.stdout.write(`recorded ${a.length} companion link(s)
1840
- `),0}var mP,JE=E(()=>{"use strict";He();io();Ln();Ml();Me();Hr();Kl();_i();Se();Dl();mP=`usage: lmctl team <create|list|show|add-member|seed|refresh|companion|list-roots>
1840
+ `),0}var mP,JE=E(()=>{"use strict";He();io();Ln();Dl();Me();Hr();Yl();_i();Se();Pl();mP=`usage: lmctl team <create|list|show|add-member|seed|refresh|companion|list-roots>
1841
1841
 
1842
1842
  Manage DB-backed teams, members, and provider session lifecycle. Use seed or
1843
1843
  refresh to create/update native provider sessions for team members.
@@ -1845,8 +1845,8 @@ refresh to create/update native provider sessions for team members.
1845
1845
  Root team registry:
1846
1846
  list-roots [--json] List .lmctl root teams registered by lmctl seed.
1847
1847
  `});var YE={};ie(YE,{renderMessage:()=>VE,runTail:()=>IP});async function IP(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${vP}
1848
- `),0;let r=P(t,["--lines","--watch-interval","--provider","--session","--run"],["--watch","--help"]);if(r.error!==void 0)return w(e,r.error);let n=j(r,"--lines"),s=n===void 0?SP:Number.parseInt(n,10);if(!Number.isFinite(s)||s<1)return w(e,`invalid --lines "${n}" (expected a positive integer)`);let o=M(r,"--watch"),i=j(r,"--watch-interval"),a=i===void 0?kP:Number.parseInt(i.replace(/s$/,""),10);if(!Number.isFinite(a)||a<1)return w(e,`invalid --watch-interval "${i}" (expected <N>s, N\u22651)`);if(r.positionals.length>2)return w(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let l=j(r,"--run");if(l!==void 0){if(r.positionals.length>0)return w(e,"--run is mutually exclusive with positional [target] [alias]");if(j(r,"--session")!==void 0)return w(e,"--run is mutually exclusive with --session");if(j(r,"--provider")!==void 0)return w(e,"--run is mutually exclusive with --provider");let f=Number.parseInt(l,10);if(!Number.isFinite(f)||f<=0||String(f)!==l)return w(e,`invalid --run "${l}" (expected a positive integer run id)`);try{return await J(e,async m=>$P(e,m,f,s,o,a))}catch(m){return fe(e,m)}}let c=Zt(TP,{target:r.positionals[0],alias:r.positionals[1],flags:{session:j(r,"--session"),provider:j(r,"--provider")}});if(c.mode==="error")return w(e,c.message);if(c.mode==="managed")return w(e,"tail managed mode requires --run <id>");let u;if(c.mode==="ai-team")if(c.alias===void 0){let f;try{f=Ne(c.teamfile)}catch(p){return w(e,`tail: ${p instanceof Error?p.message:String(p)}`)}let m=pt(f);if(m===void 0)return w(e,`tail: ${c.teamfile} has no Lead member; pass <tf>:<alias>`);try{let p=Ot(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=Ot(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 xo(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 XE(e,u.provider,u.sessionId,s,-1);return d<0?1:o?await new Promise(f=>{let m=async()=>{try{let g=await XE(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 XE(t,e,r,n,s){let o;try{o=await _r(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=j(r,"--lines"),s=n===void 0?SP:Number.parseInt(n,10);if(!Number.isFinite(s)||s<1)return w(e,`invalid --lines "${n}" (expected a positive integer)`);let o=M(r,"--watch"),i=j(r,"--watch-interval"),a=i===void 0?kP:Number.parseInt(i.replace(/s$/,""),10);if(!Number.isFinite(a)||a<1)return w(e,`invalid --watch-interval "${i}" (expected <N>s, N\u22651)`);if(r.positionals.length>2)return w(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let l=j(r,"--run");if(l!==void 0){if(r.positionals.length>0)return w(e,"--run is mutually exclusive with positional [target] [alias]");if(j(r,"--session")!==void 0)return w(e,"--run is mutually exclusive with --session");if(j(r,"--provider")!==void 0)return w(e,"--run is mutually exclusive with --provider");let f=Number.parseInt(l,10);if(!Number.isFinite(f)||f<=0||String(f)!==l)return w(e,`invalid --run "${l}" (expected a positive integer run id)`);try{return await J(e,async m=>$P(e,m,f,s,o,a))}catch(m){return fe(e,m)}}let c=Qt(TP,{target:r.positionals[0],alias:r.positionals[1],flags:{session:j(r,"--session"),provider:j(r,"--provider")}});if(c.mode==="error")return w(e,c.message);if(c.mode==="managed")return w(e,"tail managed mode requires --run <id>");let u;if(c.mode==="ai-team")if(c.alias===void 0){let f;try{f=Ne(c.teamfile)}catch(p){return w(e,`tail: ${p instanceof Error?p.message:String(p)}`)}let m=pt(f);if(m===void 0)return w(e,`tail: ${c.teamfile} has no Lead member; pass <tf>:<alias>`);try{let p=Ot(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=Ot(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 xo(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 XE(e,u.provider,u.sessionId,s,-1);return d<0?1:o?await new Promise(f=>{let m=async()=>{try{let g=await XE(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 XE(t,e,r,n,s){let o;try{o=await gr(r,e)}catch(l){return t.stderr.write(`tail: failed to load session: ${l instanceof Error?l.message:String(l)}
1850
1850
  `),-1}if(o===null)return t.stderr.write(`tail: session not found: ${r} (provider=${e})
1851
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(`${VE(i[l])}
1852
1852
  `);return i.length-1}function VE(t){let e=KE(t.timestamp),r=e?`${e} ${t.role}`:t.role,s=(t.content??"").replace(/\r\n/g,`
@@ -1863,7 +1863,7 @@ ${i.map(a=>` ${a}`).join(`
1863
1863
  [--lines N] [--watch] [--watch-interval Ns] [--provider <name>]
1864
1864
 
1865
1865
  Print or watch provider session messages, or follow a managed run timeline.`});var ZE={};ie(ZE,{runInfo:()=>AP});function jP(t){return t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${Math.round(t/1e3)}K`:String(t)}async function AP(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${xP}
1866
- `),0;let r=P(t,["--provider","--run"],["--json","--help"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>2)return w(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let n=M(r,"--json"),s=j(r,"--run");if(s!==void 0){if(r.positionals.length>0)return w(e,"--run is mutually exclusive with positional [target] [alias]");if(j(r,"--provider")!==void 0)return w(e,"--run is mutually exclusive with --provider");let c=Number.parseInt(s,10);if(!Number.isFinite(c)||c<=0||String(c)!==s)return w(e,`invalid --run "${s}" (expected a positive integer run id)`);try{return await J(e,async u=>OP(e,u,c,n))}catch(u){return fe(e,u)}}let o=Zt(NP,{target:r.positionals[0],alias:r.positionals[1],flags:{provider:j(r,"--provider")}});if(o.mode==="error")return w(e,o.message);if(o.mode==="managed")return w(e,"info managed mode requires --run <id>");if(o.mode==="ai-team"&&o.alias===void 0)return LP(e,o.teamfile,n);let i,a,l;if(o.mode==="ai-team")try{let c=Ot(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 xo(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 RP(e,i,a,l,n)}async function RP(t,e,r,n,s){let o;try{o=await _r(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=M(r,"--json"),s=j(r,"--run");if(s!==void 0){if(r.positionals.length>0)return w(e,"--run is mutually exclusive with positional [target] [alias]");if(j(r,"--provider")!==void 0)return w(e,"--run is mutually exclusive with --provider");let c=Number.parseInt(s,10);if(!Number.isFinite(c)||c<=0||String(c)!==s)return w(e,`invalid --run "${s}" (expected a positive integer run id)`);try{return await J(e,async u=>OP(e,u,c,n))}catch(u){return fe(e,u)}}let o=Qt(NP,{target:r.positionals[0],alias:r.positionals[1],flags:{provider:j(r,"--provider")}});if(o.mode==="error")return w(e,o.message);if(o.mode==="managed")return w(e,"info managed mode requires --run <id>");if(o.mode==="ai-team"&&o.alias===void 0)return LP(e,o.teamfile,n);let i,a,l;if(o.mode==="ai-team")try{let c=Ot(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 xo(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 RP(e,i,a,l,n)}async function RP(t,e,r,n,s){let o;try{o=await gr(r,e)}catch(a){return w(t,`info: failed to load session: ${a instanceof Error?a.message:String(a)}`)}if(o===null)return w(t,`info: session not found: ${r} (provider=${e})`);let i={provider:o.provider,sessionId:o.sessionId,cwd:o.cwd,messageCount:o.messageCount,...o.model!==void 0?{model:o.model}:{},...n!==void 0?{alias:n}:{},totalInputTokens:o.totalInputTokens??0,totalOutputTokens:o.totalOutputTokens??0,...o.totalCachedInputTokens!==void 0?{totalCachedInputTokens:o.totalCachedInputTokens}:{},createdAt:o.createdAt.toISOString(),modifiedAt:o.modifiedAt.toISOString()};return s?(W(t,i),0):(t.stdout.write(`Session: ${o.sessionId}
1867
1867
  `),t.stdout.write(` Provider: ${o.provider}
1868
1868
  `),n!==void 0&&t.stdout.write(` Alias: ${n}
1869
1869
  `),t.stdout.write(` CWD: ${o.cwd}
@@ -1872,7 +1872,7 @@ Print or watch provider session messages, or follow a managed run timeline.`});v
1872
1872
  `),t.stdout.write(` Tokens: ${i.totalInputTokens} in / ${i.totalOutputTokens} out`),i.totalCachedInputTokens!==void 0&&t.stdout.write(` (cached: ${i.totalCachedInputTokens})`),t.stdout.write(`
1873
1873
  `),t.stdout.write(` Created: ${i.createdAt}
1874
1874
  `),t.stdout.write(` Modified: ${i.modifiedAt}
1875
- `),0)}async function OP(t,e,r,n){let s=mr(e,r);if(s===null)return w(t,`info: run ${r}: not found`);let o=Ur(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 OP(t,e,r,n){let s=pr(e,r);if(s===null)return w(t,`info: run ${r}: not found`);let o=Ur(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}
1876
1876
  `),t.stdout.write(` Workflow: ${s.workflow?.name??"(unknown)"}
1877
1877
  `),t.stdout.write(` Team: ${s.team?.name??"(unknown)"}
1878
1878
  `),t.stdout.write(` State: ${s.current_state??"(none)"}${s.terminal_state!==null?` (terminal: ${s.terminal_state})`:""}
@@ -1882,7 +1882,7 @@ Print or watch provider session messages, or follow a managed run timeline.`});v
1882
1882
  `),t.stdout.write(` Steps: ${s.steps.length}
1883
1883
  `),t.stdout.write(` AgentCalls: ${i.agentCallCount}
1884
1884
  `),t.stdout.write(` Tokens: ${i.totalInputTokens} in / ${i.totalOutputTokens} out
1885
- `),0)}async function LP(t,e,r){let n;try{n=Ne(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 _r(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 LP(t,e,r){let n;try{n=Ne(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 gr(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)}
1886
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}
1887
1887
  `),t.stdout.write(` ${"SESSION".padEnd(i)} ${"ALIAS".padEnd(a)}${"PROVIDER".padEnd(l)}${"MODEL".padEnd(c)}${"MSGS".padStart(6)} ${"LAST CONTEXT".padStart(12)}
1888
1888
  `);for(let u of s){let d=u.lastContext!==void 0?jP(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)}
@@ -1892,8 +1892,8 @@ Print or watch provider session messages, or follow a managed run timeline.`});v
1892
1892
  lmctl info <sessionid> [--provider <name>]
1893
1893
  [--json]
1894
1894
 
1895
- Show provider session details, team rollups, or managed run state/token totals.`});var tb={};ie(tb,{runLs:()=>PP});import{resolve as td}from"node:path";function DP(t){let e=new Map;for(let r of t){let n=`${r.provider}:${r.sessionId}`,s=e.get(n);(s===void 0||r.modifiedAt.getTime()>s.modifiedAt.getTime())&&e.set(n,r)}return[...e.values()]}async function PP(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${CP}
1896
- `),0;let r=P(t,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let n=j(r,"--format"),s=M(r,"--json");if(M(r,"--runs")){for(let _ of["--provider","--sessiondir"])if(j(r,_)!==void 0)return w(e,`--runs is mutually exclusive with ${_}`);for(let _ of["--recursive","--all"])if(M(r,_))return w(e,`--runs is mutually exclusive with ${_}`);if(n==="teamfile")return w(e,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let p=j(r,"--limit"),h=MP;if(p!==void 0){let _=Number.parseInt(p,10);if(!Number.isFinite(_)||_<1||String(_)!==p)return w(e,`invalid --limit "${p}" (expected a positive integer)`);if(_>eb)return w(e,`--limit ${_} exceeds maximum (${eb})`);h=_}let g=n==="json"||s===!0?"json":"table";try{return await J(e,async _=>FP(e,_,h,g))}catch(_){return fe(e,_)}}let i=UP(n,s);if("error"in i)return w(e,i.error);let a=i.format,l=j(r,"--provider"),c=j(r,"--sessiondir"),u=M(r,"--recursive"),d=M(r,"--all"),f;try{f=await _l(l?{provider:l}:{})}catch(p){return w(e,`ls: discovery failed: ${p instanceof Error?p.message:String(p)}`)}if(!d){let p=c!==void 0?td(c):td(process.cwd());f=f.filter(h=>{let g=td(h.cwd);return u?g===p||g.startsWith(`${p}/`):g===p})}if(f=DP(f),a==="json")return W(e,f.map(p=>({provider:p.provider,sessionId:p.sessionId,cwd:p.cwd,messageCount:p.messageCount,modifiedAt:p.modifiedAt.toISOString(),...p.model!==void 0?{model:p.model}:{}}))),0;if(f.length===0){if(a==="table"){let p=d?"(all)":c??process.cwd(),h=u?"under":"in";e.stdout.write(`No native sessions found ${h} ${p}.
1895
+ Show provider session details, team rollups, or managed run state/token totals.`});var tb={};ie(tb,{runLs:()=>PP});import{resolve as rd}from"node:path";function DP(t){let e=new Map;for(let r of t){let n=`${r.provider}:${r.sessionId}`,s=e.get(n);(s===void 0||r.modifiedAt.getTime()>s.modifiedAt.getTime())&&e.set(n,r)}return[...e.values()]}async function PP(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${CP}
1896
+ `),0;let r=P(t,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let n=j(r,"--format"),s=M(r,"--json");if(M(r,"--runs")){for(let _ of["--provider","--sessiondir"])if(j(r,_)!==void 0)return w(e,`--runs is mutually exclusive with ${_}`);for(let _ of["--recursive","--all"])if(M(r,_))return w(e,`--runs is mutually exclusive with ${_}`);if(n==="teamfile")return w(e,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let p=j(r,"--limit"),h=MP;if(p!==void 0){let _=Number.parseInt(p,10);if(!Number.isFinite(_)||_<1||String(_)!==p)return w(e,`invalid --limit "${p}" (expected a positive integer)`);if(_>eb)return w(e,`--limit ${_} exceeds maximum (${eb})`);h=_}let g=n==="json"||s===!0?"json":"table";try{return await J(e,async _=>FP(e,_,h,g))}catch(_){return fe(e,_)}}let i=UP(n,s);if("error"in i)return w(e,i.error);let a=i.format,l=j(r,"--provider"),c=j(r,"--sessiondir"),u=M(r,"--recursive"),d=M(r,"--all"),f;try{f=await gl(l?{provider:l}:{})}catch(p){return w(e,`ls: discovery failed: ${p instanceof Error?p.message:String(p)}`)}if(!d){let p=c!==void 0?rd(c):rd(process.cwd());f=f.filter(h=>{let g=rd(h.cwd);return u?g===p||g.startsWith(`${p}/`):g===p})}if(f=DP(f),a==="json")return W(e,f.map(p=>({provider:p.provider,sessionId:p.sessionId,cwd:p.cwd,messageCount:p.messageCount,modifiedAt:p.modifiedAt.toISOString(),...p.model!==void 0?{model:p.model}:{}}))),0;if(f.length===0){if(a==="table"){let p=d?"(all)":c??process.cwd(),h=u?"under":"in";e.stdout.write(`No native sessions found ${h} ${p}.
1897
1897
  `)}return 0}if(a==="teamfile"){for(let p of f)e.stdout.write(`_MEMBER_ alias=- provider=${p.provider} sessionid=${p.sessionId} sessiondir=${p.cwd}
1898
1898
  `);return 0}let m=Math.max(14,...f.map(p=>p.sessionId.length));e.stdout.write(`${"SESSION".padEnd(m)} ${"PROVIDER".padEnd(10)} ${"SESSIONDIR".padEnd(36)} MODIFIED
1899
1899
  `);for(let p of f){let h=p.cwd.length>36?`\u2026${p.cwd.slice(-35)}`:p.cwd;e.stdout.write(`${p.sessionId.padEnd(m)} ${p.provider.padEnd(10)} ${h.padEnd(36)} ${p.modifiedAt.toISOString()}
@@ -1904,15 +1904,15 @@ Show provider session details, team rollups, or managed run state/token totals.`
1904
1904
  [--recursive] [--all] [--format table|teamfile|json] [--json]
1905
1905
  lmctl ls --runs [--limit N] [--format table|json] [--json]
1906
1906
 
1907
- List native provider sessions in scope, or list recent managed runs with --runs.`,MP=50,eb=500});import{existsSync as sb,readFileSync as ob}from"node:fs";import{homedir as WP}from"node:os";import{dirname as BP,resolve as ib}from"node:path";import{fileURLToPath as qP}from"node:url";function ab(t,e={}){let r=[],n=XP(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=YP(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: ${nb(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}": `+(na??"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: ${nb(i)}`)}return r}function XP(t){if(!t&&hs)return hs;let e=new Map,r,n=t??GP();if(!sb(n))return r=`${n} not found`,t||rd(e),t||(hs=e),t||(na=r),e;let s;try{s=ob(n,"utf-8")}catch(o){return r=`${n} could not be read: ${o instanceof Error?o.message:String(o)}`,t||rd(e),t||(hs=e),t||(na=r),e}for(let[o,i]of Object.entries(HP)){let a=VP(s,i),l=KP(a);l.length>0&&e.set(o,l)}return e.size===0&&(r=`${n} has no tested model rows`),!t&&e.size===0&&rd(e),t||(hs=e),t||(na=r),e}function GP(){let t=BP(qP(import.meta.url));return ib(t,"..","..","..","durable-memory","model_selection.md")}function rd(t){for(let[e,r]of Object.entries(JP))t.set(e,r)}function VP(t,e){let n=new RegExp(`^## ${ZP(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 KP(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 YP(t){let e=t??ib(WP(),".config","opencode","opencode.json"),r=Hf();if(!sb(e))return{available:!0,models:r};let n;try{n=JSON.parse(ob(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([...zP(n),...r])].sort();return s.length===0?{available:!1,models:s,reason:`${e} has no provider models`}:{available:!0,models:s}}function zP(t){if(!nd(t))return[];let e=ra(t.provider)??ra(t.providers);if(!e)return[];let r=new Set;for(let[n,s]of Object.entries(e)){if(!nd(s))continue;let o=ra(s.models)??ra(s.model);if(o)for(let i of Object.keys(o))r.add(i.startsWith(`${n}/`)?i:`${n}/${i}`)}return[...r].sort()}function ra(t){return nd(t)?t:null}function nd(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function nb(t){return t.length>0?t.join(", "):"(none)"}function ZP(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var HP,JP,hs,na,lb=E(()=>{"use strict";Pa();HP={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen",agy:"Antigravity"},JP={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"]},hs=null});function ht(t){try{return new URL(t).protocol==="https:"}catch{return!1}}function Qt(t){return/^[A-Za-z]:[\\/]/.test(t)?!1:/^[A-Za-z][A-Za-z0-9+.-]*:/.test(t)}function _s(t,e){return!Qt(t)||ht(t)?null:`${e} must use https://: ${t}`}async function gs(t,e){let r=_s(t,e.description);if(r!==null||!ht(t))throw new Error(r??`${e.description} must use https://: ${t}`);let n=e.timeoutMs??15e3,s=new AbortController,o=setTimeout(()=>s.abort(),n),i;try{i=await fetch(t,{signal:s.signal,redirect:"manual"})}catch(a){let c=a instanceof Error&&a.name==="AbortError"?`timed out after ${n}ms`:a instanceof Error?a.message:String(a);throw new Error(`failed to fetch ${e.description} ${t}: ${c}`)}finally{clearTimeout(o)}if(i.type==="opaqueredirect"||i.status>=300&&i.status<400)throw new Error(`refusing to follow redirect from ${e.description} ${t} (https-only: the URL must serve the content directly, not redirect)`);if(!i.ok)throw new Error(`failed to fetch ${e.description} ${t}: HTTP ${i.status}${i.statusText?` ${i.statusText}`:""}`);return Buffer.from(await i.arrayBuffer())}var sd=E(()=>{"use strict"});var Ts={};ie(Ts,{GEMINI_PROVIDER_NOTICE:()=>pb,_setSkillFileOpsForTests:()=>u1,_setTeamfileSeedForTests:()=>c1,buildRootTeamRegistrationRow:()=>wb,persistTeamConnections:()=>Eb,registerRootTeam:()=>yb,runHire:()=>f1,runLint:()=>d1,runRefresh:()=>m1,runSeed:()=>_b,sha256Text:()=>gb,skillNameFromSource:()=>ud,skillNameFromUrl:()=>N1});import{createHash as QP,randomUUID as e1}from"node:crypto";import{existsSync as t1,mkdirSync as r1,readFileSync as Es,realpathSync as id,renameSync as n1,unlinkSync as s1,writeFileSync as $r}from"node:fs";import{basename as o1,dirname as aa,isAbsolute as cb,join as ia,resolve as bs}from"node:path";function c1(t){hb=t??(async e=>{let{seed:r}=await Promise.resolve().then(()=>(kt(),wl)),n=await r(e);return n.success?{sessionId:n.sessionId}:{error:n.error??"provider seed failed"}})}function u1(t){ys=t===null?ad:{...ad,...t}}async function d1(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(a1),0;if(t.length!==1)return e.stderr.write(`usage: lmctl lint <teamfile.lmctl>
1908
- `),2;let r=t[0],n;try{n=Ne(r)}catch(i){return Le(e,`${r}: ${i instanceof Error?i.message:String(i)}`)}let s=Mu(n,aa(bs(r))),o=ab(n.members);for(let i of s)e.stderr.write(`error: ${i.field}: ${i.message}
1907
+ List native provider sessions in scope, or list recent managed runs with --runs.`,MP=50,eb=500});import{existsSync as sb,readFileSync as ob}from"node:fs";import{homedir as WP}from"node:os";import{dirname as BP,resolve as ib}from"node:path";import{fileURLToPath as qP}from"node:url";function ab(t,e={}){let r=[],n=XP(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=YP(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: ${nb(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}": `+(na??"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: ${nb(i)}`)}return r}function XP(t){if(!t&&hs)return hs;let e=new Map,r,n=t??GP();if(!sb(n))return r=`${n} not found`,t||nd(e),t||(hs=e),t||(na=r),e;let s;try{s=ob(n,"utf-8")}catch(o){return r=`${n} could not be read: ${o instanceof Error?o.message:String(o)}`,t||nd(e),t||(hs=e),t||(na=r),e}for(let[o,i]of Object.entries(HP)){let a=VP(s,i),l=KP(a);l.length>0&&e.set(o,l)}return e.size===0&&(r=`${n} has no tested model rows`),!t&&e.size===0&&nd(e),t||(hs=e),t||(na=r),e}function GP(){let t=BP(qP(import.meta.url));return ib(t,"..","..","..","durable-memory","model_selection.md")}function nd(t){for(let[e,r]of Object.entries(JP))t.set(e,r)}function VP(t,e){let n=new RegExp(`^## ${ZP(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 KP(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 YP(t){let e=t??ib(WP(),".config","opencode","opencode.json"),r=Hf();if(!sb(e))return{available:!0,models:r};let n;try{n=JSON.parse(ob(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([...zP(n),...r])].sort();return s.length===0?{available:!1,models:s,reason:`${e} has no provider models`}:{available:!0,models:s}}function zP(t){if(!sd(t))return[];let e=ra(t.provider)??ra(t.providers);if(!e)return[];let r=new Set;for(let[n,s]of Object.entries(e)){if(!sd(s))continue;let o=ra(s.models)??ra(s.model);if(o)for(let i of Object.keys(o))r.add(i.startsWith(`${n}/`)?i:`${n}/${i}`)}return[...r].sort()}function ra(t){return sd(t)?t:null}function sd(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function nb(t){return t.length>0?t.join(", "):"(none)"}function ZP(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var HP,JP,hs,na,lb=E(()=>{"use strict";Fa();HP={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen",agy:"Antigravity"},JP={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"]},hs=null});function ht(t){try{return new URL(t).protocol==="https:"}catch{return!1}}function er(t){return/^[A-Za-z]:[\\/]/.test(t)?!1:/^[A-Za-z][A-Za-z0-9+.-]*:/.test(t)}function _s(t,e){return!er(t)||ht(t)?null:`${e} must use https://: ${t}`}async function gs(t,e){let r=_s(t,e.description);if(r!==null||!ht(t))throw new Error(r??`${e.description} must use https://: ${t}`);let n=e.timeoutMs??15e3,s=new AbortController,o=setTimeout(()=>s.abort(),n),i;try{i=await fetch(t,{signal:s.signal,redirect:"manual"})}catch(a){let c=a instanceof Error&&a.name==="AbortError"?`timed out after ${n}ms`:a instanceof Error?a.message:String(a);throw new Error(`failed to fetch ${e.description} ${t}: ${c}`)}finally{clearTimeout(o)}if(i.type==="opaqueredirect"||i.status>=300&&i.status<400)throw new Error(`refusing to follow redirect from ${e.description} ${t} (https-only: the URL must serve the content directly, not redirect)`);if(!i.ok)throw new Error(`failed to fetch ${e.description} ${t}: HTTP ${i.status}${i.statusText?` ${i.statusText}`:""}`);return Buffer.from(await i.arrayBuffer())}var od=E(()=>{"use strict"});var Ts={};ie(Ts,{GEMINI_PROVIDER_NOTICE:()=>pb,_setSkillFileOpsForTests:()=>u1,_setTeamfileSeedForTests:()=>c1,buildRootTeamRegistrationRow:()=>wb,persistTeamConnections:()=>Eb,registerRootTeam:()=>yb,runHire:()=>f1,runLint:()=>d1,runRefresh:()=>m1,runSeed:()=>_b,sha256Text:()=>gb,skillNameFromSource:()=>dd,skillNameFromUrl:()=>N1});import{createHash as QP,randomUUID as e1}from"node:crypto";import{existsSync as t1,mkdirSync as r1,readFileSync as Es,realpathSync as ad,renameSync as n1,unlinkSync as s1,writeFileSync as $r}from"node:fs";import{basename as o1,dirname as aa,isAbsolute as cb,join as ia,resolve as bs}from"node:path";function c1(t){hb=t??(async e=>{let{seed:r}=await Promise.resolve().then(()=>(kt(),yl)),n=await r(e);return n.success?{sessionId:n.sessionId}:{error:n.error??"provider seed failed"}})}function u1(t){ys=t===null?ld:{...ld,...t}}async function d1(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(a1),0;if(t.length!==1)return e.stderr.write(`usage: lmctl lint <teamfile.lmctl>
1908
+ `),2;let r=t[0],n;try{n=Ne(r)}catch(i){return Le(e,`${r}: ${i instanceof Error?i.message:String(i)}`)}let s=Du(n,aa(bs(r))),o=ab(n.members);for(let i of s)e.stderr.write(`error: ${i.field}: ${i.message}
1909
1909
  `);if(s.length===0)try{Sr(r)}catch(i){return e.stderr.write(`error: connect: ${i instanceof Error?i.message:String(i)}
1910
- `),1}for(let i of n.members)cd([i],e),i.session!==void 0&&i.session.length<ws&&o.push(`${i.alias}: sessionid is shorter than ${ws} chars; run lmctl seed to refresh it`);for(let i of o)e.stderr.write(`warning: ${i}
1910
+ `),1}for(let i of n.members)ud([i],e),i.session!==void 0&&i.session.length<ws&&o.push(`${i.alias}: sessionid is shorter than ${ws} chars; run lmctl seed to refresh it`);for(let i of o)e.stderr.write(`warning: ${i}
1911
1911
  `);return await J(e,i=>{fE(r,i,a=>e.stderr.write(`${a}
1912
1912
  `))}),s.length>0?1:(e.stdout.write(`ok
1913
1913
  `),0)}async function _b(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(l1),0;if(t.length!==1)return e.stderr.write(`usage: lmctl seed <teamfile.lmctl>
1914
- `),2;let r=t[0],n=bs(r),s;try{s=id(n)}catch(S){return Le(e,`${r}: ${S instanceof Error?S.message:String(S)}`)}let o=aa(n),i;try{i=Ne(n)}catch(S){return Le(e,`${r}: ${S instanceof Error?S.message:String(S)}`)}let a=Mu(i,o);if(a.length>0){cd(i.members,e);for(let S of a)e.stderr.write(`error: ${S.field}: ${S.message}
1915
- `);return 1}let l;try{l=Sr(n)}catch(S){return Le(e,`connect: ${S instanceof Error?S.message:String(S)}`)}cd(i.members,e);let c=await k1(i.skillUrls,o,e);if(c!==0)return c;let u=Es(n,"utf8"),d=u.split(`
1914
+ `),2;let r=t[0],n=bs(r),s;try{s=ad(n)}catch(S){return Le(e,`${r}: ${S instanceof Error?S.message:String(S)}`)}let o=aa(n),i;try{i=Ne(n)}catch(S){return Le(e,`${r}: ${S instanceof Error?S.message:String(S)}`)}let a=Du(i,o);if(a.length>0){ud(i.members,e);for(let S of a)e.stderr.write(`error: ${S.field}: ${S.message}
1915
+ `);return 1}let l;try{l=Sr(n)}catch(S){return Le(e,`connect: ${S instanceof Error?S.message:String(S)}`)}ud(i.members,e);let c=await k1(i.skillUrls,o,e);if(c!==0)return c;let u=Es(n,"utf8"),d=u.split(`
1916
1916
  `),f=h1(d),m=0,p=i.members.filter(S=>S.teamfile!==void 0?!1:S.session===void 0||S.session.length<ws);for(let S of p)if(!Tb(S.provider))return e.stderr.write(`error: ${S.alias}: invalid provider "${S.provider}"
1917
1917
  `),1;let h=i.members.find(S=>S.alias.toLowerCase()==="lead");if(h!==void 0){Or("lmctl","lmctl_chat",{warn:I=>e.stderr.write(`${I}
1918
1918
  `)});let S=h.sessiondir??o;try{S1(S)&&e.stdout.write(`.mcp.json installed in ${S}
@@ -1923,15 +1923,15 @@ List native provider sessions in scope, or list recent managed runs with --runs.
1923
1923
  `),1;let R=db(d[k],"sessionid",v.sessionId);S.sessiondir===void 0&&(R=db(R,"sessiondir",o)),d[k]=R,m+=1,$r(n,d.join(`
1924
1924
  `),"utf8"),e.stdout.write(`${S.alias}: seeded ${v.sessionId}
1925
1925
  `)}let g=d.join(`
1926
- `),_=b1(g,id(n));_!==g&&$r(n,_,"utf8"),m===0&&e.stdout.write(`no members needed seeding
1927
- `);let T=new Date().toISOString();return await J(e,S=>{yb(S,{teamfilePath:s,name:i.name,rawText:_,now:T}),Eb(S,l,T)}),0}async function f1(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(oa),0;let r=P(t,["--provider","--sessiondir"],[]);if(r.error!==void 0)return od(e,r.error,oa);if(r.positionals.length!==2)return od(e,"expected <teamfile.lmctl> and <alias>",oa);let[n,s]=r.positionals;if(!w1(s))return Le(e,`invalid alias "${s}"`);if(s.toLowerCase()==="lead")return Le(e,"hire only applies to non-Lead members");let o=j(r,"--provider");if(o===void 0)return od(e,"missing value for --provider",oa);if(!Tb(o))return Le(e,`invalid provider "${o}"`);let i=bs(n),a;try{a=Es(i,"utf8")}catch(d){return Le(e,`${n}: ${d instanceof Error?d.message:String(d)}`)}if(g1(a,s))return Le(e,`${s}: alias already exists in ${i}`);let l=j(r,"--sessiondir")??aa(i),c=`_MEMBER_ alias=${ld(s)} provider=${o} sessiondir=${ld(l)}`,u=E1(a,c);return $r(i,u,"utf8"),e.stdout.write(`Hired ${s} (${o}) -> ${i}
1926
+ `),_=b1(g,ad(n));_!==g&&$r(n,_,"utf8"),m===0&&e.stdout.write(`no members needed seeding
1927
+ `);let T=new Date().toISOString();return await J(e,S=>{yb(S,{teamfilePath:s,name:i.name,rawText:_,now:T}),Eb(S,l,T)}),0}async function f1(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(oa),0;let r=P(t,["--provider","--sessiondir"],[]);if(r.error!==void 0)return id(e,r.error,oa);if(r.positionals.length!==2)return id(e,"expected <teamfile.lmctl> and <alias>",oa);let[n,s]=r.positionals;if(!w1(s))return Le(e,`invalid alias "${s}"`);if(s.toLowerCase()==="lead")return Le(e,"hire only applies to non-Lead members");let o=j(r,"--provider");if(o===void 0)return id(e,"missing value for --provider",oa);if(!Tb(o))return Le(e,`invalid provider "${o}"`);let i=bs(n),a;try{a=Es(i,"utf8")}catch(d){return Le(e,`${n}: ${d instanceof Error?d.message:String(d)}`)}if(g1(a,s))return Le(e,`${s}: alias already exists in ${i}`);let l=j(r,"--sessiondir")??aa(i),c=`_MEMBER_ alias=${cd(s)} provider=${o} sessiondir=${cd(l)}`,u=E1(a,c);return $r(i,u,"utf8"),e.stdout.write(`Hired ${s} (${o}) -> ${i}
1928
1928
  `),e.stdout.write(`Run: lmctl seed ${i}
1929
1929
  `),0}async function m1(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(ub),0;if(t.length!==2)return e.stderr.write(ub),2;let[r,n]=t;if(n.toLowerCase()==="lead")return Le(e,"refresh only applies to non-Lead members");let s=bs(r),o;try{o=Es(s,"utf8")}catch(c){return Le(e,`${r}: ${c instanceof Error?c.message:String(c)}`)}let i=o.split(`
1930
1930
  `),a=_1(i,n);if(a===void 0)return Le(e,`${n}: no active _MEMBER_ entry found`);let l=i[a];return la(l,"teamfile")!==void 0?Le(e,`${n}: refresh only applies to provider-backed members, not teamfile= members`):(i[a]=y1(l,"sessionid"),a>0&&/^\s*#CreationTime:/u.test(i[a-1])&&i.splice(a-1,1),$r(s,i.join(`
1931
1931
  `),"utf8"),_b([s],e))}function gb(t){return QP("sha256").update(t).digest("hex")}function wb(t,e){return{teamfile_path:e.teamfilePath,name:e.name,raw_text:e.rawText,raw_sha256:gb(e.rawText),registered_at:t?.registered_at??e.now,last_seeded_at:e.now}}function yb(t,e){let r=wb(t.getRootTeam(e.teamfilePath),e);return t.upsertRootTeam(r),r}function Eb(t,e,r){for(let n of e.snapshots)t.replaceTeamConnections(n.source_teamfile,n.connections.map(s=>({target_name:s.target_name,target_teamfile:s.target_teamfile,created_at:r})))}function p1(t,e,r){let n=r.filter(o=>o.alias.toLowerCase()!=="lead").map(o=>{let i=o.teamfile!==void 0?`teamfile=${o.teamfile}`:`provider=${o.provider}`;return`- ${o.alias}: ${i}`}),s=n.length>0?n.join(`
1932
1932
  `):"- (no non-Lead members)";return["lmctl seed initial connection only. Create or pin this provider session, then stop.","Do not inspect files, run commands, infer a task, delegate, edit, or begin work.","",`Teamfile path: ${t}`,"You are alias Lead for this AI-managed .lmctl team.","","Use only the lmctl_chat MCP tool for member pings and delegation.","","Team members:",s,"","Example MCP calls:",...r.filter(o=>o.alias.toLowerCase()!=="lead").map(o=>`lmctl_chat(team="${t}", alias="${o.alias}", prompt="your task here")`),"","Full teamfile document at seed time:","```lmctl",e.trimEnd(),"```","","Remember this teamfile path. Do not ask the operator for it when asked to ping or delegate to members.","Reply exactly: ACK: teamfile context recorded."].join(`
1933
1933
  `)}function h1(t){let e=new Map;for(let r=0;r<t.length;r+=1){let n=t[r];if(!/^\s*_MEMBER_\s+\S/.test(n))continue;let s=la(n,"alias");s!==void 0&&e.set(s.toLowerCase(),r)}return e}function _1(t,e){for(let r=0;r<t.length;r+=1){let n=t[r];if(/^\s*_MEMBER_\s+\S/u.test(n)&&la(n,"alias")===e)return r}}function g1(t,e){for(let r of t.split(`
1934
- `))if(/^\s*#?\s*_MEMBER_\s+\S/u.test(r)&&la(r,"alias")===e)return!0;return!1}function w1(t){return/^[A-Za-z][A-Za-z0-9_-]*$/u.test(t)}function la(t,e){let n=new RegExp(`(?:^|\\s)${e}=(?:"([^"]*)"|(\\S*))`).exec(t);return n===null?void 0:n[1]??n[2]??""}function db(t,e,r){let n=`${e}=${ld(r)}`,s=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return s.test(t)?t.replace(s,(o,i)=>`${i}${n}`):`${t.trimEnd()} ${n}`}function y1(t,e){let r=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return t.replace(r,"").replace(/\s+/gu," ").trimEnd()}function ld(t){return/[\s"]/u.test(t)?`"${t.replace(/"/g,'\\"')}"`:t}function E1(t,e){let r=t.split(`
1934
+ `))if(/^\s*#?\s*_MEMBER_\s+\S/u.test(r)&&la(r,"alias")===e)return!0;return!1}function w1(t){return/^[A-Za-z][A-Za-z0-9_-]*$/u.test(t)}function la(t,e){let n=new RegExp(`(?:^|\\s)${e}=(?:"([^"]*)"|(\\S*))`).exec(t);return n===null?void 0:n[1]??n[2]??""}function db(t,e,r){let n=`${e}=${cd(r)}`,s=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return s.test(t)?t.replace(s,(o,i)=>`${i}${n}`):`${t.trimEnd()} ${n}`}function y1(t,e){let r=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return t.replace(r,"").replace(/\s+/gu," ").trimEnd()}function cd(t){return/[\s"]/u.test(t)?`"${t.replace(/"/g,'\\"')}"`:t}function E1(t,e){let r=t.split(`
1935
1935
  `),n=-1;for(let a=r.length-1;a>=0;a-=1)if(/^\s*(?:_MEMBER_|_CONNECT_|_SKILL_)(?:\s|$)/u.test(r[a])){n=a;break}if(n>=0)return r.splice(n+1,0,e),r.join(`
1936
1936
  `);let s=r.length;for(;s>0&&r[s-1]==="";)s-=1;let o=r.slice(0,s).join(`
1937
1937
  `),i=r.slice(s).join(`
@@ -1951,11 +1951,11 @@ ${t}`:`${r}
1951
1951
  ${i.body}${i.body.endsWith(`
1952
1952
  `)?"":`
1953
1953
  `}`;try{ys.mkdirSync(n,{recursive:!0}),$1(n,i.name,a)}catch(l){return Le(r,`skill ${i.source}: ${l instanceof Error?l.message:String(l)}`)}r.stdout.write(`skill ${i.name}: wrote durable-memory/skills/${i.name}.md
1954
- `)}return 0}async function bb(t,e,r,n,s){if(s>sa)throw new Error(`skill ${t}: _SKILL_ expansion depth exceeded ${sa}`);let o=await v1(t,e),i=I1(o.text,o.source);if(i.length===0){if(r.leafSources.has(o.id)){r.warnings.push(`skill ${o.source}: already provisioned; skipping duplicate`);return}r.leafSources.add(o.id),n.push({id:o.id,source:o.source,name:ud(o.source),body:o.text});return}if(r.visitedSkillsets.has(o.id)){r.warnings.push(`skillset ${o.source}: already visited; skipping`);return}if(r.visitedSkillsets.add(o.id),s>=sa)throw new Error(`skill ${o.source}: _SKILL_ expansion depth exceeded ${sa}`);for(let a of i)await bb(a,o.base,r,n,s+1)}async function v1(t,e){if(e.kind==="https"){if(Qt(t)||!cb(t)){let o=fb(t,e),i;try{i=await gs(o,{description:"_SKILL_ URL"})}catch(a){throw new Error(`skill ${o}: ${a instanceof Error?a.message:String(a)}`)}return{kind:"https",id:dn(o),source:dn(o),base:{kind:"https",baseUrl:new URL(".",o).href},text:i.toString("utf8")}}throw new Error(`skill ${t}: remote _SKILL_ members must be https:// URLs or relative URL paths`)}if(Qt(t)){let o=fb(t,e),i;try{i=await gs(o,{description:"_SKILL_ URL"})}catch(a){throw new Error(`skill ${o}: ${a instanceof Error?a.message:String(a)}`)}return{kind:"https",id:dn(o),source:dn(o),base:{kind:"https",baseUrl:new URL(".",o).href},text:i.toString("utf8")}}let r=cb(t)?t:bs(e.kind==="file"?e.baseDir:".",t),n,s;try{n=id(r),s=Es(n,"utf8")}catch(o){throw new Error(`skill ${t}: ${o instanceof Error?o.message:String(o)}`)}return{kind:"file",id:n,source:n,base:{kind:"file",baseDir:aa(n)},text:s}}function fb(t,e){if(Qt(t)){if(!ht(t))throw new Error(`skill ${t}: _SKILL_ URL must use https:// or a local path: ${t}`);return dn(t)}if(e.kind!=="https")throw new Error(`skill ${t}: _SKILL_ URL must use https:// or a local path: ${t}`);let r=new URL(t,e.baseUrl).href;if(!ht(r))throw new Error(`skill ${t}: _SKILL_ URL must use https:// or a local path: ${t}`);return dn(r)}function I1(t,e){let r=[],n=t.split(/\r?\n/u);for(let s=0;s<n.length;s+=1){let o=n[s];if(!/^\s*_SKILL_(?:\s|$)/u.test(o))continue;let i=o.replace(/^\s*_SKILL_\s*/u,"").trim(),a=i.length===0?[]:i.split(/\s+/u);if(a.length!==1)throw new Error(`skill ${e}: line ${s+1}: _SKILL_ requires exactly one https:// URL or local path`);let l=a[0];if(Qt(l)&&!ht(l))throw new Error(`skill ${e}: line ${s+1}: _SKILL_ URL must use https:// or a local path: ${l}`);r.push(l)}return r}function dn(t){return new URL(t).href}function $1(t,e,r){let n=ia(t,`${e}.md`),s=ia(t,`${e}.${process.pid}.${e1().slice(0,8)}.tmp`);try{ys.writeFileSync(s,r,{encoding:"utf8",flag:"wx"}),ys.renameSync(s,n)}catch(o){try{ys.unlinkSync(s)}catch{}throw o}}function N1(t){return ud(t)}function ud(t){let e=ht(t)?new URL(t).pathname:t;e.endsWith("/")&&(e=e.slice(0,-1));let n=(o1(e)||"skill").replace(/\.[^.]*$/u,""),s=n;try{s=decodeURIComponent(n)}catch{s=n}return s.trim().replace(/[^A-Za-z0-9_-]+/gu,"-").replace(/^-+|-+$/gu,"").toLowerCase().slice(0,i1).replace(/-+$/gu,"")||"skill"}function mb(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Tb(t){return t==="claude"||t==="codex"||t==="gemini"||t==="copilot"||t==="opencode"||t==="qwen"||t==="agy"||t==="ClaudeMock"}function Le(t,e){return t.stderr.write(`error: ${e}
1955
- `),1}function od(t,e,r){return t.stderr.write(`error: ${e}
1956
- ${r}`),2}function cd(t,e){for(let r of t)r.teamfile!==void 0&&e.stderr.write(`warning: member "${r.alias}" uses deprecated member-level teamfile=; migrate to team-level _CONNECT_ (alias=${r.alias} teamfile=${r.teamfile})
1954
+ `)}return 0}async function bb(t,e,r,n,s){if(s>sa)throw new Error(`skill ${t}: _SKILL_ expansion depth exceeded ${sa}`);let o=await v1(t,e),i=I1(o.text,o.source);if(i.length===0){if(r.leafSources.has(o.id)){r.warnings.push(`skill ${o.source}: already provisioned; skipping duplicate`);return}r.leafSources.add(o.id),n.push({id:o.id,source:o.source,name:dd(o.source),body:o.text});return}if(r.visitedSkillsets.has(o.id)){r.warnings.push(`skillset ${o.source}: already visited; skipping`);return}if(r.visitedSkillsets.add(o.id),s>=sa)throw new Error(`skill ${o.source}: _SKILL_ expansion depth exceeded ${sa}`);for(let a of i)await bb(a,o.base,r,n,s+1)}async function v1(t,e){if(e.kind==="https"){if(er(t)||!cb(t)){let o=fb(t,e),i;try{i=await gs(o,{description:"_SKILL_ URL"})}catch(a){throw new Error(`skill ${o}: ${a instanceof Error?a.message:String(a)}`)}return{kind:"https",id:dn(o),source:dn(o),base:{kind:"https",baseUrl:new URL(".",o).href},text:i.toString("utf8")}}throw new Error(`skill ${t}: remote _SKILL_ members must be https:// URLs or relative URL paths`)}if(er(t)){let o=fb(t,e),i;try{i=await gs(o,{description:"_SKILL_ URL"})}catch(a){throw new Error(`skill ${o}: ${a instanceof Error?a.message:String(a)}`)}return{kind:"https",id:dn(o),source:dn(o),base:{kind:"https",baseUrl:new URL(".",o).href},text:i.toString("utf8")}}let r=cb(t)?t:bs(e.kind==="file"?e.baseDir:".",t),n,s;try{n=ad(r),s=Es(n,"utf8")}catch(o){throw new Error(`skill ${t}: ${o instanceof Error?o.message:String(o)}`)}return{kind:"file",id:n,source:n,base:{kind:"file",baseDir:aa(n)},text:s}}function fb(t,e){if(er(t)){if(!ht(t))throw new Error(`skill ${t}: _SKILL_ URL must use https:// or a local path: ${t}`);return dn(t)}if(e.kind!=="https")throw new Error(`skill ${t}: _SKILL_ URL must use https:// or a local path: ${t}`);let r=new URL(t,e.baseUrl).href;if(!ht(r))throw new Error(`skill ${t}: _SKILL_ URL must use https:// or a local path: ${t}`);return dn(r)}function I1(t,e){let r=[],n=t.split(/\r?\n/u);for(let s=0;s<n.length;s+=1){let o=n[s];if(!/^\s*_SKILL_(?:\s|$)/u.test(o))continue;let i=o.replace(/^\s*_SKILL_\s*/u,"").trim(),a=i.length===0?[]:i.split(/\s+/u);if(a.length!==1)throw new Error(`skill ${e}: line ${s+1}: _SKILL_ requires exactly one https:// URL or local path`);let l=a[0];if(er(l)&&!ht(l))throw new Error(`skill ${e}: line ${s+1}: _SKILL_ URL must use https:// or a local path: ${l}`);r.push(l)}return r}function dn(t){return new URL(t).href}function $1(t,e,r){let n=ia(t,`${e}.md`),s=ia(t,`${e}.${process.pid}.${e1().slice(0,8)}.tmp`);try{ys.writeFileSync(s,r,{encoding:"utf8",flag:"wx"}),ys.renameSync(s,n)}catch(o){try{ys.unlinkSync(s)}catch{}throw o}}function N1(t){return dd(t)}function dd(t){let e=ht(t)?new URL(t).pathname:t;e.endsWith("/")&&(e=e.slice(0,-1));let n=(o1(e)||"skill").replace(/\.[^.]*$/u,""),s=n;try{s=decodeURIComponent(n)}catch{s=n}return s.trim().replace(/[^A-Za-z0-9_-]+/gu,"-").replace(/^-+|-+$/gu,"").toLowerCase().slice(0,i1).replace(/-+$/gu,"")||"skill"}function mb(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Tb(t){return t==="claude"||t==="codex"||t==="gemini"||t==="copilot"||t==="opencode"||t==="qwen"||t==="agy"||t==="ClaudeMock"}function Le(t,e){return t.stderr.write(`error: ${e}
1955
+ `),1}function id(t,e,r){return t.stderr.write(`error: ${e}
1956
+ ${r}`),2}function ud(t,e){for(let r of t)r.teamfile!==void 0&&e.stderr.write(`warning: member "${r.alias}" uses deprecated member-level teamfile=; migrate to team-level _CONNECT_ (alias=${r.alias} teamfile=${r.teamfile})
1957
1957
  `),r.provider==="gemini"&&e.stderr.write(`${pb.replace("%s",r.alias)}
1958
- `)}var ws,i1,sa,a1,l1,oa,ub,pb,ad,hb,ys,Ss=E(()=>{"use strict";Rt();lb();Bs();Se();Qi();sd();ws=5,i1=80,sa=16,a1=`usage: lmctl lint <teamfile.lmctl>
1958
+ `)}var ws,i1,sa,a1,l1,oa,ub,pb,ld,hb,ys,Ss=E(()=>{"use strict";Rt();lb();Bs();Se();Qi();od();ws=5,i1=80,sa=16,a1=`usage: lmctl lint <teamfile.lmctl>
1959
1959
 
1960
1960
  Validate an lmctl teamfile and warn about stale or placeholder session ids.
1961
1961
  `,l1=`usage: lmctl seed <teamfile.lmctl>
@@ -1970,12 +1970,12 @@ after editing to create the provider session.
1970
1970
 
1971
1971
  Replace a non-Lead member's provider session by clearing its sessionid and
1972
1972
  running lmctl seed for the teamfile.
1973
- `,pb='notice: member "%s" uses provider=gemini \u2014 the Gemini CLI requires an API/enterprise Google account; personal Google subscriptions should use provider=agy (Antigravity).',ad={mkdirSync:r1,writeFileSync:$r,renameSync:n1,unlinkSync:s1},hb=async t=>{let{seed:e}=await Promise.resolve().then(()=>(kt(),wl)),r=await e(t);return r.success?{sessionId:r.sessionId}:{error:r.error??"provider seed failed"}},ys=ad});var Nb={};ie(Nb,{runConnect:()=>R1});import{existsSync as Sb,readFileSync as x1,realpathSync as dd,writeFileSync as kb}from"node:fs";import{dirname as Ib,relative as j1,resolve as fd}from"node:path";async function R1(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(A1),0;if(t.length!==3)return e.stderr.write(`usage: lmctl connect <from.lmctl> <to.lmctl> <name>
1973
+ `,pb='notice: member "%s" uses provider=gemini \u2014 the Gemini CLI requires an API/enterprise Google account; personal Google subscriptions should use provider=agy (Antigravity).',ld={mkdirSync:r1,writeFileSync:$r,renameSync:n1,unlinkSync:s1},hb=async t=>{let{seed:e}=await Promise.resolve().then(()=>(kt(),yl)),r=await e(t);return r.success?{sessionId:r.sessionId}:{error:r.error??"provider seed failed"}},ys=ld});var Nb={};ie(Nb,{runConnect:()=>R1});import{existsSync as Sb,readFileSync as x1,realpathSync as fd,writeFileSync as kb}from"node:fs";import{dirname as Ib,relative as j1,resolve as md}from"node:path";async function R1(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(A1),0;if(t.length!==3)return e.stderr.write(`usage: lmctl connect <from.lmctl> <to.lmctl> <name>
1974
1974
  `),2;let[r,n,s]=t;if(!vb.test(s))return e.stderr.write(`error: invalid connection name "${s}" (must match ${vb.source})
1975
- `),2;let o=fd(r),i=fd(n);if(!o.endsWith(".lmctl")||!i.endsWith(".lmctl"))return e.stderr.write(`error: from_lmctl and to_lmctl must both end with .lmctl
1975
+ `),2;let o=md(r),i=md(n);if(!o.endsWith(".lmctl")||!i.endsWith(".lmctl"))return e.stderr.write(`error: from_lmctl and to_lmctl must both end with .lmctl
1976
1976
  `),2;if(!Sb(o))return e.stderr.write(`error: source teamfile not found: ${o}
1977
1977
  `),1;if(!Sb(i))return e.stderr.write(`error: target teamfile not found: ${i}
1978
- `),1;let a=dd(o),l=dd(i);if(a===l)return e.stderr.write(`error: ${Hi}
1978
+ `),1;let a=fd(o),l=fd(i);if(a===l)return e.stderr.write(`error: ${Hi}
1979
1979
  `),1;try{O1(o,"source")}catch(m){return e.stderr.write(`error: ${m instanceof Error?m.message:String(m)}
1980
1980
  `),1}let c=x1(o,"utf8"),u=L1(o,i),d=`_CONNECT_ alias=${s} teamfile=${U1(u)}`;if(D1(c,Ib(o),s,l))return e.stderr.write(`error: _CONNECT_ alias "${s}" to ${l} already exists in ${o}
1981
1981
  `),1;let f=C1(c,d);kb(o,f,"utf8");try{Sr(o)}catch(m){return kb(o,c,"utf8"),e.stderr.write(`error: connect validation failed; source restored: ${m instanceof Error?m.message:String(m)}
@@ -1985,7 +1985,7 @@ running lmctl seed for the teamfile.
1985
1985
  `),0}function O1(t,e){let r=Ne(t);if(r.parseErrors.length>0)throw new Error(`${e} teamfile parse error: ${r.parseErrors.join("; ")}`);if(pt(r)===void 0)throw new Error(`${e} teamfile has no Lead: ${t}`)}function L1(t,e){let r=j1(Ib(t),e).replace(/\\/g,"/");return r.startsWith(".")?r:`./${r}`}function C1(t,e){let r=t.split(`
1986
1986
  `),n=M1(r),s=n>=0?n+1:F1(r);return r.splice(s,0,e),r.join(`
1987
1987
  `)}function M1(t){for(let e=t.length-1;e>=0;e-=1)if(/^\s*(?:_MEMBER_|_CONNECT_)(?:\s|$)/.test(t[e]))return e;return-1}function D1(t,e,r,n){return t.split(`
1988
- `).some(s=>/^\s*_CONNECT_(?:\s|$)/.test(s)&&$b(s,"alias")===r&&P1(e,s)===n)}function P1(t,e){let r=$b(e,"teamfile");if(r===void 0||r.length===0)return null;try{return dd(fd(t,r))}catch{return null}}function F1(t){let e=t.length;for(;e>0&&t[e-1]==="";)e-=1;return e}function $b(t,e){let r=new RegExp(`(?:^|\\s)${e}=(?:"([^"]*)"|(\\S*))`).exec(t);return r===null?void 0:r[1]??r[2]??""}function U1(t){return/[\s"]/u.test(t)?`"${t.replace(/"/g,'\\"')}"`:t}var A1,vb,xb=E(()=>{"use strict";Rt();A1=`usage: lmctl connect <from.lmctl> <to.lmctl> <name>
1988
+ `).some(s=>/^\s*_CONNECT_(?:\s|$)/.test(s)&&$b(s,"alias")===r&&P1(e,s)===n)}function P1(t,e){let r=$b(e,"teamfile");if(r===void 0||r.length===0)return null;try{return fd(md(t,r))}catch{return null}}function F1(t){let e=t.length;for(;e>0&&t[e-1]==="";)e-=1;return e}function $b(t,e){let r=new RegExp(`(?:^|\\s)${e}=(?:"([^"]*)"|(\\S*))`).exec(t);return r===null?void 0:r[1]??r[2]??""}function U1(t){return/[\s"]/u.test(t)?`"${t.replace(/"/g,'\\"')}"`:t}var A1,vb,xb=E(()=>{"use strict";Rt();A1=`usage: lmctl connect <from.lmctl> <to.lmctl> <name>
1989
1989
 
1990
1990
  Append a team-level _CONNECT_ edge to member <name> in the target teamfile.
1991
1991
  The sender is always the source team's Lead.
@@ -1993,14 +1993,14 @@ The sender is always the source team's Lead.
1993
1993
  After editing, run:
1994
1994
  lmctl lint <from.lmctl>
1995
1995
  lmctl seed <from.lmctl>
1996
- `,vb=/^[A-Za-z][A-Za-z0-9_-]*$/});var Ob={};ie(Ob,{runClone:()=>G1});import{existsSync as pd,mkdirSync as W1,readFileSync as B1,readdirSync as q1,statSync as Ab,writeFileSync as H1}from"node:fs";import{basename as jb,dirname as md,extname as J1,join as Rb,resolve as ca}from"node:path";async function G1(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(X1),0;if(t.length!==2)return e.stderr.write(`usage: lmctl clone <source> <dest>
1997
- `),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=ca(r);if(!pd(u))throw new Error(`source not found: ${r}`);let f=Ab(u).isDirectory()?V1(u):u;s=B1(f,"utf8"),o=md(f),i=f}}catch(u){return e.stderr.write(`error: ${u instanceof Error?u.message:String(u)}
1998
- `),1}let a=ca(n),l=K1(a,i,n);if(pd(l))return e.stderr.write(`error: ${l} already exists.
1999
- `),1;let c=Y1(s);return o!==null&&(c=z1(c,o,md(l))),W1(md(l),{recursive:!0}),H1(l,c,"utf8"),e.stdout.write(`Cloned ${r} -> ${l}
1996
+ `,vb=/^[A-Za-z][A-Za-z0-9_-]*$/});var Ob={};ie(Ob,{runClone:()=>G1});import{existsSync as hd,mkdirSync as W1,readFileSync as B1,readdirSync as q1,statSync as Ab,writeFileSync as H1}from"node:fs";import{basename as jb,dirname as pd,extname as J1,join as Rb,resolve as ca}from"node:path";async function G1(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(X1),0;if(t.length!==2)return e.stderr.write(`usage: lmctl clone <source> <dest>
1997
+ `),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=ca(r);if(!hd(u))throw new Error(`source not found: ${r}`);let f=Ab(u).isDirectory()?V1(u):u;s=B1(f,"utf8"),o=pd(f),i=f}}catch(u){return e.stderr.write(`error: ${u instanceof Error?u.message:String(u)}
1998
+ `),1}let a=ca(n),l=K1(a,i,n);if(hd(l))return e.stderr.write(`error: ${l} already exists.
1999
+ `),1;let c=Y1(s);return o!==null&&(c=z1(c,o,pd(l))),W1(pd(l),{recursive:!0}),H1(l,c,"utf8"),e.stdout.write(`Cloned ${r} -> ${l}
2000
2000
  `),e.stdout.write(`Edit ${l}; only _MEMBER_ lines are parsed, everything else is free-form.
2001
2001
  `),e.stdout.write(`After editing, run: lmctl lint ${l}
2002
2002
  `),e.stdout.write(`Then run: lmctl seed ${l}
2003
- `),0}function V1(t){let e=q1(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 Rb(t,e[0])}function K1(t,e,r){if(r.endsWith("/")||pd(t)&&Ab(t).isDirectory()){let n=jb(e).endsWith(".lmctl")?jb(e):"team.lmctl";return Rb(t,n)}return J1(t)?t:`${t}.lmctl`}function Y1(t){return t.split(`
2003
+ `),0}function V1(t){let e=q1(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 Rb(t,e[0])}function K1(t,e,r){if(r.endsWith("/")||hd(t)&&Ab(t).isDirectory()){let n=jb(e).endsWith(".lmctl")?jb(e):"team.lmctl";return Rb(t,n)}return J1(t)?t:`${t}.lmctl`}function Y1(t){return t.split(`
2004
2004
  `).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(`
2005
2005
  `)}function z1(t,e,r){let n=ca(e),s=ca(r);return n===s?t:t.split(`
2006
2006
  `).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(`
@@ -2044,9 +2044,12 @@ _MEMBER_ alias=Reviewer2 provider=${n} sessiondir=${r}
2044
2044
  _MEMBER_ alias=Reviewer3 provider=agy sessiondir=${r}
2045
2045
 
2046
2046
  # durable-memory/
2047
- When a task is done, create or update docs in durable-memory/ to
2048
- capture durable project knowledge. Keep durable-memory/index.md current
2049
- so new agents can quickly discover and understand the project.
2047
+ durable-memory/ is the team's shared, provider-agnostic memory - its brain.
2048
+ Every member, whatever its provider (Claude, Codex, Gemini, ...), reads it as
2049
+ context, so knowledge is shared across agents and survives fresh sessions: a
2050
+ refreshed or swapped-in agent loses its chat history but NOT what's written
2051
+ here. When a task is done, record durable project knowledge in durable-memory/
2052
+ and keep durable-memory/index.md current so any agent can get up to speed fast.
2050
2053
  `}var nF,Pb=E(()=>{"use strict";Se();nF=`usage: lmctl plan [options] <directory>
2051
2054
 
2052
2055
  Generate a starter lmctl team document template for a directory.
@@ -2062,7 +2065,7 @@ Examples:
2062
2065
 
2063
2066
  # Same shape, codex for the Lead and Reviewer2
2064
2067
  lmctl plan ./backend --provider codex
2065
- `});var Wb={};ie(Wb,{SIZE_WARN_EST_TOKENS:()=>ks,estimateTokens:()=>Ub,runTerminal:()=>dF});import{spawn as lF}from"node:child_process";import{statSync as cF}from"node:fs";async function dF(t,e){if(t.includes("--help")||t.includes("-h"))return _F(e);let r=P(t,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(r.error!==void 0)return w(e,r.error);let n=j(r,"--run");if(n!==void 0){let s=Number.parseInt(n,10);if(!Number.isFinite(s)||s<=0||String(s)!==n)return w(e,`invalid --run "${n}" (expected a positive integer run id)`);if(r.positionals.length>0)return w(e,"--run is mutually exclusive with positional <teamfile>[:alias]");let o=["--team","--project","--size","--json"];for(let i of o)if(i==="--size"||i==="--json"?M(r,i):j(r,i)!==void 0)return w(e,`--run is mutually exclusive with ${i}`);try{return await J(e,async i=>{let a=j(r,"--alias"),l=iw(i,s,a);return"err"in l?w(e,l.err):hd(e,{provider:l.ok.provider,sessionid:l.ok.sessionid,sessiondir:l.ok.sessiondir})})}catch(i){return fe(e,i)}}if(r.positionals.length>0){let s=["--team","--project","--size","--alias","--json"];for(let l of s)if(l==="--size"||l==="--json"?M(r,l):j(r,l)!==void 0)return w(e,`positional <teamfile>[:alias] is mutually exclusive with ${l} (alias is the SECOND POSITIONAL: \`terminal <teamfile> <alias>\`).`);if(r.positionals.length>2)return w(e,`too many positionals (${r.positionals.length}); expected <teamfile>[:alias] [alias]`);let o=r.positionals[0],i=r.positionals[1],a=Zt(uF,{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=>fF(e,a.teamfile,a.alias,l))}try{return await J(e,async s=>{let o=mF(e,s,r);if(typeof o=="number")return o;let i=j(r,"--alias");return M(r,"--size")?hF(e,s,o,i,M(r,"--json")):pF(e,s,o,i)})}catch(s){return fe(e,s)}}async function fF(t,e,r,n){let s;try{s=Ot(e,r,n)}catch(o){return o instanceof ge?w(t,o.message):fe(t,o)}return hd(t,{provider:s.provider,sessionid:s.sessionid,sessiondir:s.sessiondir})}async function hd(t,e){let{provider:r,sessionid:n,sessiondir:s}=e;if(!No(r))return w(t,`no resume incantation for provider "${r}"`);if(!vp.test(n))return w(t,"refusing to resume: malformed sessionid");let o=Ul(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=lF(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 mF(t,e,r){let n=j(r,"--team");if(n!==void 0){let i=e.findTeamByName(n);return i===null?w(t,`team not found: ${n}`):i}let s=Fo(t,e,j(r,"--project"));return typeof s=="number"?s:Uo(t,e,s,void 0)}async function pF(t,e,r,n){let s=Wo(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`):hd(t,{provider:ke(s),sessionid:o,sessiondir:s.sessiondir})}function Ub(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=cF(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 hF(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;No(c)&&(u=await _r(l,c));let d=Ub(u),f=d.est>ks;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?qr(c,l):null})}if(s)return W(t,{estimate:!0,legend:Fb,guide_tokens:ks,members:i}),0;t.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
2068
+ `});var Wb={};ie(Wb,{SIZE_WARN_EST_TOKENS:()=>ks,estimateTokens:()=>Ub,runTerminal:()=>dF});import{spawn as lF}from"node:child_process";import{statSync as cF}from"node:fs";async function dF(t,e){if(t.includes("--help")||t.includes("-h"))return _F(e);let r=P(t,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(r.error!==void 0)return w(e,r.error);let n=j(r,"--run");if(n!==void 0){let s=Number.parseInt(n,10);if(!Number.isFinite(s)||s<=0||String(s)!==n)return w(e,`invalid --run "${n}" (expected a positive integer run id)`);if(r.positionals.length>0)return w(e,"--run is mutually exclusive with positional <teamfile>[:alias]");let o=["--team","--project","--size","--json"];for(let i of o)if(i==="--size"||i==="--json"?M(r,i):j(r,i)!==void 0)return w(e,`--run is mutually exclusive with ${i}`);try{return await J(e,async i=>{let a=j(r,"--alias"),l=iw(i,s,a);return"err"in l?w(e,l.err):_d(e,{provider:l.ok.provider,sessionid:l.ok.sessionid,sessiondir:l.ok.sessiondir})})}catch(i){return fe(e,i)}}if(r.positionals.length>0){let s=["--team","--project","--size","--alias","--json"];for(let l of s)if(l==="--size"||l==="--json"?M(r,l):j(r,l)!==void 0)return w(e,`positional <teamfile>[:alias] is mutually exclusive with ${l} (alias is the SECOND POSITIONAL: \`terminal <teamfile> <alias>\`).`);if(r.positionals.length>2)return w(e,`too many positionals (${r.positionals.length}); expected <teamfile>[:alias] [alias]`);let o=r.positionals[0],i=r.positionals[1],a=Qt(uF,{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=>fF(e,a.teamfile,a.alias,l))}try{return await J(e,async s=>{let o=mF(e,s,r);if(typeof o=="number")return o;let i=j(r,"--alias");return M(r,"--size")?hF(e,s,o,i,M(r,"--json")):pF(e,s,o,i)})}catch(s){return fe(e,s)}}async function fF(t,e,r,n){let s;try{s=Ot(e,r,n)}catch(o){return o instanceof ge?w(t,o.message):fe(t,o)}return _d(t,{provider:s.provider,sessionid:s.sessionid,sessiondir:s.sessiondir})}async function _d(t,e){let{provider:r,sessionid:n,sessiondir:s}=e;if(!No(r))return w(t,`no resume incantation for provider "${r}"`);if(!vp.test(n))return w(t,"refusing to resume: malformed sessionid");let o=Wl(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=lF(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 mF(t,e,r){let n=j(r,"--team");if(n!==void 0){let i=e.findTeamByName(n);return i===null?w(t,`team not found: ${n}`):i}let s=Fo(t,e,j(r,"--project"));return typeof s=="number"?s:Uo(t,e,s,void 0)}async function pF(t,e,r,n){let s=Wo(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`):_d(t,{provider:ke(s),sessionid:o,sessiondir:s.sessiondir})}function Ub(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=cF(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 hF(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;No(c)&&(u=await gr(l,c));let d=Ub(u),f=d.est>ks;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?qr(c,l):null})}if(s)return W(t,{estimate:!0,legend:Fb,guide_tokens:ks,members:i}),0;t.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
2066
2069
  `),t.stdout.write(`${Fb}
2067
2070
  `);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)
2068
2071
  `),a.over_guide&&t.stdout.write(` \u26A0 ${a.alias}: estimated ~${a.est_tokens} tokens \u2014 ESTIMATE only, exceeds the 200K guide.
@@ -2100,40 +2103,40 @@ Examples:
2100
2103
  tokens it surfaces the resume incantation so YOU can
2101
2104
  open & self-compact. Nothing is ever changed
2102
2105
  automatically; ${ks} is a guide, not a gate.
2103
- `),0}var uF,ks,Fb,Bb=E(()=>{"use strict";Me();Hr();Se();Zl();us();Oi();uF={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},ks=2e5,Fb="est = rough local heuristic (~4 chars/token), NOT an exact provider token count \u2014 open the session to verify before acting."});import gF from"better-sqlite3";import{resolve as _d,dirname as Xb}from"node:path";function gd(t,e){let r=_d(t);for(;;){let n=wF(e,r);if(n!==null)return n;let s=Xb(r);if(s===r)return null;r=s}}function wF(t,e){return t.db.prepare("SELECT * FROM project WHERE local_path = ? LIMIT 1").get(e)??null}function ua(){return process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0}function da(){return process.env.LMCTL_WORKSPACE!==void 0&&process.env.LMCTL_WORKSPACE.length>0}function wd(t){if(t.io.dal!==void 0){let o=qb(t.io.dal,t.cwd,t.projectName);if(o===null)throw new ze(Hb(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(ua()||da()){let o=de(),i=pe({path:o}),a=qb(i,t.cwd,t.projectName);if(a===null)throw i.close(),new ze(Hb(t.projectName));return{dal:i,ownsDal:!0,dbPath:o,workspaceName:da()?process.env.LMCTL_WORKSPACE??null:null,project:a,matchedLocalPath:t.projectName===void 0?a.local_path:null,resolverMode:ua()?"explicit-db":"explicit-workspace"}}let e=t.projectName===void 0?Vb(t.cwd):yF(t.projectName),r=Kb(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 ze(`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 Gb(t){if(t.io.dal!==void 0)return{dal:t.io.dal,ownsDal:!1,dbPath:":injected:",workspaceName:null,resolverMode:"injected"};if(ua()||da()){let n=de();return{dal:pe({path:n}),ownsDal:!0,dbPath:n,workspaceName:da()?process.env.LMCTL_WORKSPACE??null:null,resolverMode:ua()?"explicit-db":"explicit-workspace"}}let e;try{e=Vb(t.cwd)}catch{throw new ze("job ids are workspace-local and cwd does not resolve to a workspace DB; use --workspace <name> or --db <path>")}let r=Kb(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 qb(t,e,r){return r!==void 0?t.findProjectByName(r):gd(e,t)}function Hb(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 yF(t){let e=[];for(let r of ya())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 ze(`project not found in any workspace DB: ${t}`);return e}function Vb(t){let e=EF(t),r=new Map;e.forEach((s,o)=>{r.set(s,e.length-o)});let n=[];for(let s of ya())for(let o of Yb(s)){let i=_d(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 ze("no lmctl project found for cwd in workspace DBs; pass --workspace and --project");return n}function Kb(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 ze(`job ids are workspace-local and cwd resolves ambiguously; use --workspace <name> or --db <path>
2106
+ `),0}var uF,ks,Fb,Bb=E(()=>{"use strict";Me();Hr();Se();Ql();us();Oi();uF={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},ks=2e5,Fb="est = rough local heuristic (~4 chars/token), NOT an exact provider token count \u2014 open the session to verify before acting."});import gF from"better-sqlite3";import{resolve as gd,dirname as Xb}from"node:path";function wd(t,e){let r=gd(t);for(;;){let n=wF(e,r);if(n!==null)return n;let s=Xb(r);if(s===r)return null;r=s}}function wF(t,e){return t.db.prepare("SELECT * FROM project WHERE local_path = ? LIMIT 1").get(e)??null}function ua(){return process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0}function da(){return process.env.LMCTL_WORKSPACE!==void 0&&process.env.LMCTL_WORKSPACE.length>0}function yd(t){if(t.io.dal!==void 0){let o=qb(t.io.dal,t.cwd,t.projectName);if(o===null)throw new ze(Hb(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(ua()||da()){let o=de(),i=pe({path:o}),a=qb(i,t.cwd,t.projectName);if(a===null)throw i.close(),new ze(Hb(t.projectName));return{dal:i,ownsDal:!0,dbPath:o,workspaceName:da()?process.env.LMCTL_WORKSPACE??null:null,project:a,matchedLocalPath:t.projectName===void 0?a.local_path:null,resolverMode:ua()?"explicit-db":"explicit-workspace"}}let e=t.projectName===void 0?Vb(t.cwd):yF(t.projectName),r=Kb(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 ze(`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 Gb(t){if(t.io.dal!==void 0)return{dal:t.io.dal,ownsDal:!1,dbPath:":injected:",workspaceName:null,resolverMode:"injected"};if(ua()||da()){let n=de();return{dal:pe({path:n}),ownsDal:!0,dbPath:n,workspaceName:da()?process.env.LMCTL_WORKSPACE??null:null,resolverMode:ua()?"explicit-db":"explicit-workspace"}}let e;try{e=Vb(t.cwd)}catch{throw new ze("job ids are workspace-local and cwd does not resolve to a workspace DB; use --workspace <name> or --db <path>")}let r=Kb(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 qb(t,e,r){return r!==void 0?t.findProjectByName(r):wd(e,t)}function Hb(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 yF(t){let e=[];for(let r of Ea())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 ze(`project not found in any workspace DB: ${t}`);return e}function Vb(t){let e=EF(t),r=new Map;e.forEach((s,o)=>{r.set(s,e.length-o)});let n=[];for(let s of Ea())for(let o of Yb(s)){let i=gd(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 ze("no lmctl project found for cwd in workspace DBs; pass --workspace and --project");return n}function Kb(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 ze(`job ids are workspace-local and cwd resolves ambiguously; use --workspace <name> or --db <path>
2104
2107
  ${Jb(n)}`):new ze(`ambiguous lmctl ${e} match; use --workspace <name> --project <name>
2105
2108
  ${Jb(n)}`)}function Jb(t){return t.map(e=>` workspace ${e.candidate.workspace_name??"(legacy)"} project ${e.project.name} ${e.project.local_path}`).join(`
2106
- `)}function EF(t){let e=[],r=_d(t);for(;;){e.push(r);let n=Xb(r);if(n===r)return e;r=n}}function Yb(t){let e=null;try{e=new gF(t.db_path,{readonly:!0,fileMustExist:!0});let r=Number(e.pragma("user_version",{simple:!0})??0);if(!Number.isInteger(r)||r<=0||r>va)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 ze,yd=E(()=>{"use strict";$a();Me();He();ze=class extends Error{constructor(e){super(e),this.name="CliContextError"}}});var Id={};ie(Id,{assertNoCrossWorkflowSubflowCycle:()=>nT,firstUnregisteredArchetype:()=>vd,runWorkflow:()=>OF});import{createHash as Sd,randomUUID as bF}from"node:crypto";import{existsSync as TF,readFileSync as ma,readdirSync as SF,writeFileSync as kF}from"node:fs";import{basename as vF,join as IF,resolve as $F}from"node:path";import{pathToFileURL as NF}from"node:url";function kd(t,e){return{source_uri:NF($F(t)).href,source_sha256:Sd("sha256").update(e).digest("hex")}}function Zb(t){return Sd("sha256").update(t).digest("hex")}async function Qb(t){let e=await gs(t,{description:"remote workflow URL"});return{definition:e.toString("utf8"),source_uri:t,source_sha256:Zb(e),remote:!0}}async function Ed(t){let e=_s(t,"remote workflow URLs");if(e!==null)throw new Error(e);if(ht(t))return Qb(t);if(gr(t)){let n=await Cn(t),s=ma(n,"utf8");return{definition:s,source_uri:t,source_sha256:Zb(s),remote:!1}}let r=ma(t,"utf8");return{definition:r,...kd(t,r),remote:!1}}function eT(t){return Re(t.definition)}function tT(t){if(t.definition_schema_version!==3)return null;let e=vd(t);return e!==null?`unknown archetype \`${e.type}\` (step \`${e.id}\`) \u2014 not in the live archetype registry`:null}function RF(t){let e=new Set;if(t.definition_schema_version===3)for(let r of t.steps)e.add(r.type);else for(let r of Object.values(t.states))e.add(r.type);return Array.from(e).sort()}async function OF(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(AF),0;try{return r==="run"?await LF(n,e):await J(e,s=>{switch(r){case"load":return FF(n,e,s);case"author":return UF(n,e,s);case"list":return WF(n,e,s);case"sync":return BF(n,e,s);case"export":return qF(n,e,s);default:return w(e,"usage: lmctl workflow <load|author|list|sync|export|run>")}})}catch(s){return s instanceof ze?w(e,s.message):fe(e,s)}}async function LF(t,e){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(`${fa}
2107
- `),0;let r=P(t,["--workflow","--project","--inputs","--job"],["--json","--verbose","--yes","--no-prompt"]);if(r.error!==void 0)return er(e,r.error);if(r.positionals.length>1)return er(e,fa);let n=M(r,"--json"),s=j(r,"--workflow"),o=j(r,"--project"),i=j(r,"--job"),a=j(r,"--inputs"),l=M(r,"--verbose"),c=r.positionals[0],u=M(r,"--yes")||M(r,"--no-prompt");if(c!==void 0){if(s!==void 0||i!==void 0)return er(e,"remote workflow URL cannot be combined with --workflow or --job");if(!Qt(c))return er(e,fa);let m=_s(c,"remote workflow URLs");return m!==null?w(e,m):CF(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u})}if(s!==void 0&&i!==void 0)return er(e,"--workflow and --job are mutually exclusive");if(s===void 0&&i===void 0)return er(e,fa);if(i!==void 0&&(o!==void 0||a!==void 0))return er(e,"--job cannot be combined with --project or --inputs");if(i!==void 0){let m=MF(i);if(m===null)return er(e,`invalid --job: ${i}`);let p=Gb({cwd:process.cwd(),io:e});try{let h=await Zn({dal:p.dal,job_id:m,worker_id:bd()});return Td(e,h,{json:n,workflowName:null,projectName:null,workspaceName:p.workspaceName,dbPath:p.dbPath,verbose:l})}finally{p.ownsDal&&p.dal.close()}}let d=rT(a,e);if(d===pa)return 2;let f=wd({cwd:process.cwd(),io:e,projectName:o});try{let m=f.dal.getWorkflowByName(s);if(m===null)return w(e,`workflow not found: ${s}`);let p=f.dal.enqueueJob({project_id:f.project.id,workflow_id_override:m.id,source:"cli-workflow-run",payload:JSON.stringify(d),priority:0}),h=await Zn({dal:f.dal,job_id:p.id,worker_id:bd()});return Td(e,h,{json:n,workflowName:s,projectName:f.project.name,workspaceName:f.workspaceName,dbPath:f.dbPath,verbose:l})}finally{f.ownsDal&&f.dal.close()}}async function CF(t,e){let{io:r,json:n,projectName:s,inputsValue:o,verbose:i,yes:a}=e,l=rT(o,r);if(l===pa)return 2;let c,u;try{c=await Qb(t),u=eT(c)}catch(p){return w(r,p instanceof Error?p.message:String(p))}let d=tT(u);if(d!==null)return w(r,d);if(!await DF(r,c,u,a))return 1;let m=wd({cwd:process.cwd(),io:r,projectName:s});try{let p=m.dal.upsertWorkflow({name:u.name,definition_schema_version:u.definition_schema_version,definition:c.definition,source_uri:c.source_uri,source_sha256:c.source_sha256}),h=m.dal.enqueueJob({project_id:m.project.id,workflow_id_override:p.id,source:"cli-workflow-run",payload:JSON.stringify(l),priority:0}),g=await Zn({dal:m.dal,job_id:h.id,worker_id:bd()});return Td(r,g,{json:n,workflowName:p.name,projectName:m.project.name,workspaceName:m.workspaceName,dbPath:m.dbPath,verbose:i})}finally{m.ownsDal&&m.dal.close()}}function er(t,e){return t.stderr.write(`error: ${e}
2109
+ `)}function EF(t){let e=[],r=gd(t);for(;;){e.push(r);let n=Xb(r);if(n===r)return e;r=n}}function Yb(t){let e=null;try{e=new gF(t.db_path,{readonly:!0,fileMustExist:!0});let r=Number(e.pragma("user_version",{simple:!0})??0);if(!Number.isInteger(r)||r<=0||r>Ia)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 ze,Ed=E(()=>{"use strict";Na();Me();He();ze=class extends Error{constructor(e){super(e),this.name="CliContextError"}}});var Id={};ie(Id,{assertNoCrossWorkflowSubflowCycle:()=>nT,firstUnregisteredArchetype:()=>vd,runWorkflow:()=>LF});import{createHash as Sd,randomUUID as bF}from"node:crypto";import{existsSync as TF,readFileSync as pa,readdirSync as SF,writeFileSync as kF}from"node:fs";import{basename as vF,join as IF,resolve as $F}from"node:path";import{pathToFileURL as NF}from"node:url";function kd(t,e){return{source_uri:NF($F(t)).href,source_sha256:Sd("sha256").update(e).digest("hex")}}function Qb(t){return Sd("sha256").update(t).digest("hex")}async function RF(t){let e=await gs(t,{description:"remote workflow URL"});return{definition:e.toString("utf8"),source_uri:t,source_sha256:Qb(e),remote:!0}}async function ma(t){if(Jt(t)){let n=await Cn(t),s=pa(n,"utf8");return{definition:s,source_uri:t,source_sha256:Qb(s),remote:!1}}let e=_s(t,"remote workflow URLs");if(e!==null)throw new Error(e);if(ht(t))return RF(t);let r=pa(t,"utf8");return{definition:r,...kd(t,r),remote:!1}}function eT(t){return Re(t.definition)}function tT(t){if(t.definition_schema_version!==3)return null;let e=vd(t);return e!==null?`unknown archetype \`${e.type}\` (step \`${e.id}\`) \u2014 not in the live archetype registry`:null}function OF(t){let e=new Set;if(t.definition_schema_version===3)for(let r of t.steps)e.add(r.type);else for(let r of Object.values(t.states))e.add(r.type);return Array.from(e).sort()}async function LF(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(AF),0;try{return r==="run"?await CF(n,e):await J(e,s=>{switch(r){case"load":return FF(n,e,s);case"author":return UF(n,e,s);case"list":return WF(n,e,s);case"sync":return BF(n,e,s);case"export":return qF(n,e,s);default:return w(e,"usage: lmctl workflow <load|author|list|sync|export|run>")}})}catch(s){return s instanceof ze?w(e,s.message):fe(e,s)}}async function CF(t,e){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(`${fa}
2110
+ `),0;let r=P(t,["--workflow","--project","--inputs","--job"],["--json","--verbose","--yes","--no-prompt"]);if(r.error!==void 0)return tr(e,r.error);if(r.positionals.length>1)return tr(e,fa);let n=M(r,"--json"),s=j(r,"--workflow"),o=j(r,"--project"),i=j(r,"--job"),a=j(r,"--inputs"),l=M(r,"--verbose"),c=r.positionals[0],u=M(r,"--yes")||M(r,"--no-prompt");if(c!==void 0){if(s!==void 0||i!==void 0)return tr(e,"remote workflow URL cannot be combined with --workflow or --job");if(!er(c))return tr(e,fa);if(Jt(c))return zb(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u});let m=_s(c,"remote workflow URLs");return m!==null?w(e,m):zb(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u})}if(s!==void 0&&i!==void 0)return tr(e,"--workflow and --job are mutually exclusive");if(s===void 0&&i===void 0)return tr(e,fa);if(i!==void 0&&(o!==void 0||a!==void 0))return tr(e,"--job cannot be combined with --project or --inputs");if(i!==void 0){let m=MF(i);if(m===null)return tr(e,`invalid --job: ${i}`);let p=Gb({cwd:process.cwd(),io:e});try{let h=await Zn({dal:p.dal,job_id:m,worker_id:bd()});return Td(e,h,{json:n,workflowName:null,projectName:null,workspaceName:p.workspaceName,dbPath:p.dbPath,verbose:l})}finally{p.ownsDal&&p.dal.close()}}let d=rT(a,e);if(d===ha)return 2;let f=yd({cwd:process.cwd(),io:e,projectName:o});try{let m=f.dal.getWorkflowByName(s);if(m===null)return w(e,`workflow not found: ${s}`);let p=f.dal.enqueueJob({project_id:f.project.id,workflow_id_override:m.id,source:"cli-workflow-run",payload:JSON.stringify(d),priority:0}),h=await Zn({dal:f.dal,job_id:p.id,worker_id:bd()});return Td(e,h,{json:n,workflowName:s,projectName:f.project.name,workspaceName:f.workspaceName,dbPath:f.dbPath,verbose:l})}finally{f.ownsDal&&f.dal.close()}}async function zb(t,e){let{io:r,json:n,projectName:s,inputsValue:o,verbose:i,yes:a}=e,l=rT(o,r);if(l===ha)return 2;let c,u;try{c=await ma(t),u=eT(c)}catch(m){return w(r,m instanceof Error?m.message:String(m))}let d=tT(u);if(d!==null)return w(r,d);if(c.remote&&!await DF(r,c,u,a))return 1;let f=yd({cwd:process.cwd(),io:r,projectName:s});try{let m=f.dal.upsertWorkflow({name:u.name,definition_schema_version:u.definition_schema_version,definition:c.definition,source_uri:c.source_uri,source_sha256:c.source_sha256}),p=f.dal.enqueueJob({project_id:f.project.id,workflow_id_override:m.id,source:"cli-workflow-run",payload:JSON.stringify(l),priority:0}),h=await Zn({dal:f.dal,job_id:p.id,worker_id:bd()});return Td(r,h,{json:n,workflowName:m.name,projectName:f.project.name,workspaceName:f.workspaceName,dbPath:f.dbPath,verbose:i})}finally{f.ownsDal&&f.dal.close()}}function tr(t,e){return t.stderr.write(`error: ${e}
2108
2111
  `),2}function rT(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)}
2109
- `),pa}return r===null||typeof r!="object"||Array.isArray(r)?(e.stderr.write(`error: --inputs must be a JSON object
2110
- `),pa):r}function MF(t){if(!/^[1-9][0-9]*$/.test(t))return null;let e=Number(t);return Number.isSafeInteger(e)?e:null}function bd(){return`cli-${process.pid}-${bF().slice(0,8)}`}function Td(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})`:""}
2112
+ `),ha}return r===null||typeof r!="object"||Array.isArray(r)?(e.stderr.write(`error: --inputs must be a JSON object
2113
+ `),ha):r}function MF(t){if(!/^[1-9][0-9]*$/.test(t))return null;let e=Number(t);return Number.isSafeInteger(e)?e:null}function bd(){return`cli-${process.pid}-${bF().slice(0,8)}`}function Td(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})`:""}
2111
2114
  `),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}
2112
2115
  `):e.status==="failed"?t.stderr.write(`workflow failed job=${e.job_id}
2113
2116
  `):(t.stdout.write(`workflow completed job=${e.job_id} run=${e.run_id} terminal_state=${e.terminal_state??"null"}
2114
2117
  `),e.terminal_state!==null&&e.terminal_state!=="done"&&e.terminal_state!=="success"&&t.stderr.write(`warning: workflow terminal_state=${e.terminal_state}
2115
- `)),e.status==="failed"?1:0}async function DF(t,e,r,n){let s=RF(r);if(t.stderr.write(["remote workflow trust check:",` source: ${e.source_uri}`,` sha256: ${e.source_sha256}`,` workflow: ${r.name}@${r.version}`,` step archetypes: ${s.length>0?s.join(", "):"(none)"}`].join(`
2118
+ `)),e.status==="failed"?1:0}async function DF(t,e,r,n){let s=OF(r);if(t.stderr.write(["remote workflow trust check:",` source: ${e.source_uri}`,` sha256: ${e.source_sha256}`,` workflow: ${r.name}@${r.version}`,` step archetypes: ${s.length>0?s.join(", "):"(none)"}`].join(`
2116
2119
  `)+`
2117
2120
  `),n)return!0;let o=t.stdin??process.stdin;if(o.isTTY!==!0)return!0;t.stderr.write("Run remote workflow? [y/N] ");let i=await PF(o),a=/^(y|yes)$/i.test(i.trim());return a||t.stderr.write(`aborted remote workflow run
2118
- `),a}function PF(t){return new Promise(e=>{t.setEncoding?.("utf8"),t.resume?.(),t.once("data",r=>{t.pause?.(),e(typeof r=="string"?r:r.toString("utf8"))})})}async function FF(t,e,r){let[n,s]=t;if(n===void 0||s===void 0)return w(e,"usage: workflow load <name> <path-to-json | lmctl://workflow/<name> | https://...>");let o;if(gr(s))try{o=await Ed(s)}catch(c){return w(e,c instanceof Error?c.message:String(c))}else if(ht(s))try{o=await Ed(s)}catch(c){return w(e,c instanceof Error?c.message:String(c))}else{let c=_s(s,"remote workflow URLs");if(c!==null)return w(e,c);o=await Ed(s)}let i;try{i=eT(o)}catch(c){if(o.remote)return w(e,c instanceof Error?c.message:String(c));throw c}let a=o.remote?tT(i):null;if(a!==null)return w(e,a);let l=r.upsertWorkflow({name:n,definition_schema_version:i.definition_schema_version,definition:o.definition,source_uri:o.source_uri,source_sha256:o.source_sha256});return e.stdout.write(`loaded workflow ${l.name}@${l.version}
2121
+ `),a}function PF(t){return new Promise(e=>{t.setEncoding?.("utf8"),t.resume?.(),t.once("data",r=>{t.pause?.(),e(typeof r=="string"?r:r.toString("utf8"))})})}async function FF(t,e,r){let[n,s]=t;if(n===void 0||s===void 0)return w(e,"usage: workflow load <name> <path-to-json | lmctl://workflow/<name> | https://...>");let o;if(Jt(s))try{o=await ma(s)}catch(c){return w(e,c instanceof Error?c.message:String(c))}else if(ht(s))try{o=await ma(s)}catch(c){return w(e,c instanceof Error?c.message:String(c))}else{let c=_s(s,"remote workflow URLs");if(c!==null)return w(e,c);o=await ma(s)}let i;try{i=eT(o)}catch(c){if(o.remote)return w(e,c instanceof Error?c.message:String(c));throw c}let a=o.remote?tT(i):null;if(a!==null)return w(e,a);let l=r.upsertWorkflow({name:n,definition_schema_version:i.definition_schema_version,definition:o.definition,source_uri:o.source_uri,source_sha256:o.source_sha256});return e.stdout.write(`loaded workflow ${l.name}@${l.version}
2119
2122
  `),o.remote&&e.stdout.write(`source: ${o.source_uri}
2120
2123
  sha256: ${o.source_sha256}
2121
- `),0}function vd(t){let e=mi();for(let r of t.steps)if(e.get(r.type)===void 0)return{id:r.id,type:r.type};return null}function zb(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 nT(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 UF(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=ma(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=vd(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{nT(u,zb(l),m=>{let p=r.getWorkflowByName(m);if(p===null)return null;try{return zb(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,...kd(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:Sd("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)
2124
+ `),0}function vd(t){let e=mi();for(let r of t.steps)if(e.get(r.type)===void 0)return{id:r.id,type:r.type};return null}function Zb(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 nT(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 UF(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=pa(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=vd(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{nT(u,Zb(l),m=>{let p=r.getWorkflowByName(m);if(p===null)return null;try{return Zb(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,...kd(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:Sd("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)
2122
2125
  `),0}function WF(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let s=r.listWorkflows();return M(n,"--json")?W(e,s):e.stdout.write(`${s.map(o=>`${o.name}@${o.version}`).join(`
2123
2126
  `)}${s.length>0?`
2124
- `:""}`),0}function BF(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);Lo({swallow:!0});let s=Ap(),o=[];try{o=TF(s)?SF(s).filter(c=>xF.some(u=>c.endsWith(u))):[]}catch{o=[]}let i=0,a=0,l=0;for(let c of[...o].sort()){let u=IF(s,c),d=ma(u,"utf8"),f;try{f=Re(d)}catch(v){return w(e,`compile failed for ${c}: ${v instanceof Error?v.message:String(v)}`)}let m=f.name,p=typeof m=="string"&&m.length>0?m:vF(c).replace(/\.(compound\.json|lmctl)$/i,""),h=c.endsWith(".lmctl"),g=h?JSON.stringify(f):d,_=h?3:f.definition_schema_version,T=kd(u,d),S=r.getWorkflowByName(p);if(S!==null&&S.source_sha256===T.source_sha256){l+=1;continue}let I=S===null;r.upsertWorkflow({name:p,definition_schema_version:_,definition:g,...T}),I?i+=1:a+=1}return M(n,"--json")?W(e,{total:o.length,created:i,updated:a,unchanged:l}):e.stdout.write(`synced ${o.length} template(s): ${i} created, ${a} updated, ${l} unchanged
2127
+ `:""}`),0}function BF(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);Lo({swallow:!0});let s=Ap(),o=[];try{o=TF(s)?SF(s).filter(c=>xF.some(u=>c.endsWith(u))):[]}catch{o=[]}let i=0,a=0,l=0;for(let c of[...o].sort()){let u=IF(s,c),d=pa(u,"utf8"),f;try{f=Re(d)}catch(v){return w(e,`compile failed for ${c}: ${v instanceof Error?v.message:String(v)}`)}let m=f.name,p=typeof m=="string"&&m.length>0?m:vF(c).replace(/\.(compound\.json|lmctl)$/i,""),h=c.endsWith(".lmctl"),g=h?JSON.stringify(f):d,_=h?3:f.definition_schema_version,T=kd(u,d),S=r.getWorkflowByName(p);if(S!==null&&S.source_sha256===T.source_sha256){l+=1;continue}let I=S===null;r.upsertWorkflow({name:p,definition_schema_version:_,definition:g,...T}),I?i+=1:a+=1}return M(n,"--json")?W(e,{total:o.length,created:i,updated:a,unchanged:l}):e.stdout.write(`synced ${o.length} template(s): ${i} created, ${a} updated, ${l} unchanged
2125
2128
  `),0}function qF(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:jF,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)}
2126
2129
  `,c=j(n,"--out");return c!==void 0?(kF(c,l),e.stdout.write(`exported ${o.name}@${o.version} \u2192 ${c} (inspection-only; NOT re-importable)
2127
- `)):e.stdout.write(l),0}var xF,jF,AF,fa,pa,$d=E(()=>{"use strict";Dc();zr();Mo();Hl();Se();yd();sd();Qn();xF=[".compound.json",".lmctl"],jF="INSPECTION ONLY \u2014 NOT a re-importable workflow source. Edit the basedir template then `lmctl workflow sync`; do NOT `workflow load` this file.",AF=`usage: lmctl workflow <load|author|list|sync|export|run>
2130
+ `)):e.stdout.write(l),0}var xF,jF,AF,fa,ha,$d=E(()=>{"use strict";Pc();zr();Mo();Jl();Se();Ed();od();Qn();xF=[".compound.json",".lmctl"],jF="INSPECTION ONLY \u2014 NOT a re-importable workflow source. Edit the basedir template then `lmctl workflow sync`; do NOT `workflow load` this file.",AF=`usage: lmctl workflow <load|author|list|sync|export|run>
2128
2131
 
2129
2132
  Load, author, list, synchronize, inspect, or run workflow definitions. The
2130
2133
  load subcommand accepts local JSON, lmctl:// workflow URIs, and https:// JSON
2131
2134
  URLs. The run subcommand executes a loaded workflow/job, or one-shot runs a
2132
2135
  remote https:// workflow after a trust prompt.
2133
- `,fa="usage: workflow run (<https-url> [--project <name>] [--inputs <json-object>] [--yes] | --workflow <name> [--project <name>] [--inputs <json-object>] | --job <id>) [--json]";pa=Symbol("inputs-error")});var oT={};ie(oT,{CANDIDATE_PROVIDERS:()=>ha,parseInitArgs:()=>sT,probeProvider:()=>vs,probeProviderWithAuth:()=>jd,runInit:()=>XF});import{spawnSync as HF}from"node:child_process";import{existsSync as JF}from"node:fs";import{homedir as Nd}from"node:os";import{join as xd}from"node:path";async function XF(t,e={stdout:process.stdout,stderr:process.stderr},r={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${eU()}
2136
+ `,fa="usage: workflow run (<https-url | lmctl://workflow/<name>> [--project <name>] [--inputs <json-object>] [--yes] | --workflow <name> [--project <name>] [--inputs <json-object>] | --job <id>) [--json]";ha=Symbol("inputs-error")});var oT={};ie(oT,{CANDIDATE_PROVIDERS:()=>_a,parseInitArgs:()=>sT,probeProvider:()=>vs,probeProviderWithAuth:()=>jd,runInit:()=>XF});import{spawnSync as HF}from"node:child_process";import{existsSync as JF}from"node:fs";import{homedir as Nd}from"node:os";import{join as xd}from"node:path";async function XF(t,e={stdout:process.stdout,stderr:process.stderr},r={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${eU()}
2134
2137
  `),0;let n=sT(t);if(typeof n=="string")return e.stderr.write(`error: ${n}
2135
2138
  `),2;let s=r.spawn??zF,o=r.env??ZF,i=r.fileExists??JF,a=r.isTty??(!!process.stdin.isTTY&&!n.yes),l=r.promptYesNo??QF;try{return await J(e,async c=>{e.stdout.write(`Detecting providers...
2136
- `);let u=await Promise.all(ha.map(f=>jd(f,{spawn:s,env:o,fileExists:i})));if(a)for(let f=0;f<u.length;f+=1){let m=u[f],p=Ad[m.provider];m.status==="ok"||m.status==="skipped"||p.optional&&m.status==="missing"||p.optional&&m.status==="unauthed"||(e.stderr.write(`
2139
+ `);let u=await Promise.all(_a.map(f=>jd(f,{spawn:s,env:o,fileExists:i})));if(a)for(let f=0;f<u.length;f+=1){let m=u[f],p=Ad[m.provider];m.status==="ok"||m.status==="skipped"||p.optional&&m.status==="missing"||p.optional&&m.status==="unauthed"||(e.stderr.write(`
2137
2140
  ${m.provider}: ${YF(m)}
2138
2141
  `),m.status==="missing"?(e.stderr.write(` install: ${p.install_hint}
2139
2142
  `),e.stderr.write(` fix: ${p.install_remediation}
@@ -2148,28 +2151,28 @@ Setup complete. ${d.length} provider${d.length===1?"":"s"} active: ${d.join(", "
2148
2151
  `),n.json&&e.stdout.write(`${JSON.stringify({active:d,results:u},null,2)}
2149
2152
  `),0)})}catch(c){return e.stderr.write(`init failed: ${c instanceof Error?c.message:String(c)}
2150
2153
  `),1}}function vs(t,e){let r=Ad[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 jd(t,e){let r=vs(t,e.spawn);if(r.status==="missing"||r.status==="skipped"||r.status==="unverified")return r;let n=Ad[t],s=GF[t];if(s.kind==="spawn"){let a=e.spawn(s.cmd,s.args),l=(a.stdout??"").toString(),c=(a.stderr??"").toString(),u=`${l}
2151
- ${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 VF(t,e){let r=Math.max(...ha.map(n=>n.length));for(let n of e){let s=KF(n.status),o=n.provider.padEnd(r," ");t.stdout.write(` ${o} ${s} ${n.detail}
2152
- `)}}function KF(t){switch(t){case"ok":return"\u2713";case"unauthed":return"\u26A0";case"unverified":return"?";case"missing":return"\u2717";case"skipped":return"-"}}function YF(t){return t.detail}function zF(t,e){return HF(t,e,{encoding:"utf8",timeout:5e3,maxBuffer:1024*1024})}function ZF(t){return process.env[t]}async function QF(t){return process.stderr.write(t),new Promise(e=>{let r=n=>{let s=(typeof n=="string"?n:n.toString("utf8")).trim().toLowerCase();process.stdin.removeListener("data",r);try{process.stdin.pause()}catch{}e(s===""||s==="y"||s==="yes")};try{process.stdin.resume()}catch{}process.stdin.once("data",r)})}function sT(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 eU(){return["usage: lmctl init [options]","","One-time provider lifecycle setup. Detects which provider CLIs",`(${ha.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(`
2153
- `)}var ha,Ad,GF,Rd=E(()=>{"use strict";Se();ha=["claude","codex","gemini","opencode","qwen","copilot","agy"],Ad={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"}};GF={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:[xd(Nd(),".gemini","oauth_creds.json")]},copilot:{kind:"env-or-file",envVars:["COPILOT_GITHUB_TOKEN","GH_TOKEN","GITHUB_TOKEN"],filePaths:[xd(Nd(),".copilot","credentials.json")]},agy:{kind:"env-or-file",envVars:["GEMINI_API_KEY","GOOGLE_API_KEY","GOOGLE_GENAI_API_KEY"],filePaths:[xd(Nd(),".gemini","oauth_creds.json")]}}});var fT={};ie(fT,{initWorkspace:()=>uT,runWorkspace:()=>aU,setWorkspaceProvider:()=>dT});import{copyFileSync as tU,cpSync as rU,existsSync as Ce,mkdirSync as tr,readdirSync as Ld,renameSync as nU,rmSync as _a,statSync as ga,writeFileSync as sU}from"node:fs";import{spawnSync as oU}from"node:child_process";import{homedir as iT}from"node:os";import{dirname as Cd,join as Is}from"node:path";async function aU(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(iU),0;switch(r){case"list":return lU(n,e);case"create":return cU(n,e);case"use":return uU(n,e);case"show":return dU(n,e);case"delete":return fU(n,e);case"migrate":return mU(n,e);case"init":return uT(n,e);case"set-provider":return dT(n,e);default:return w(e,"usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>")}}function lT(){let t=Ns(),e=[],r=new Set,n=sr.default,s=Ce(pn()),o=Ce(wt(n));if((s||o||t===null||t===n)&&(e.push({name:n,db_path:o?Lt(n):pn(),active:t===null||t===n,legacy:!o&&s}),r.add(n)),Ce(nr())){let i;try{i=Ld(nr())}catch{i=[]}for(let a of i.sort()){if(r.has(a)||!Fe(a))continue;let l=!1;try{l=ga(wt(a)).isDirectory()}catch{l=!1}l&&(e.push({name:a,db_path:Lt(a),active:t===a,legacy:!1}),r.add(a))}}return e}function lU(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=lT();if(M(r,"--json"))return W(e,n),0;for(let s of n){let o=s.active?"*":" ",i=s.legacy?" (legacy)":"";e.stdout.write(`${o} ${s.name} ${s.db_path}${i}
2154
- `)}return 0}function cU(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(!Fe(n))return w(e,`invalid workspace name: ${n} (allowed: letters, digits, '.', '-', '_'; must start with alnum; \u226464 chars)`);let s=wt(n);if(Ce(s))return w(e,`workspace already exists: ${n} (${s})`);let o=j(r,"--docroot")??Ea(n);tr(s,{recursive:!0}),tr(o,{recursive:!0});let i=Lt(n);tr(Cd(i),{recursive:!0});let a=pe({path:i});try{a.setConfig("project.docroot",o)}finally{a.close()}let l={name:n,dir:s,db_path:i,docroot:o};return M(r,"--json")?W(e,l):e.stdout.write(`created workspace ${n} at ${s}
2155
- `),0}function uU(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(!Fe(n))return w(e,`invalid workspace name: ${n}`);if(n!==sr.default&&!Ce(wt(n)))return w(e,`workspace not found: ${n} (run \`lmctl workspace create ${n}\` first)`);let s=$s();return tr(Cd(s),{recursive:!0}),sU(s,`${n}
2154
+ ${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 VF(t,e){let r=Math.max(..._a.map(n=>n.length));for(let n of e){let s=KF(n.status),o=n.provider.padEnd(r," ");t.stdout.write(` ${o} ${s} ${n.detail}
2155
+ `)}}function KF(t){switch(t){case"ok":return"\u2713";case"unauthed":return"\u26A0";case"unverified":return"?";case"missing":return"\u2717";case"skipped":return"-"}}function YF(t){return t.detail}function zF(t,e){return HF(t,e,{encoding:"utf8",timeout:5e3,maxBuffer:1024*1024})}function ZF(t){return process.env[t]}async function QF(t){return process.stderr.write(t),new Promise(e=>{let r=n=>{let s=(typeof n=="string"?n:n.toString("utf8")).trim().toLowerCase();process.stdin.removeListener("data",r);try{process.stdin.pause()}catch{}e(s===""||s==="y"||s==="yes")};try{process.stdin.resume()}catch{}process.stdin.once("data",r)})}function sT(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 eU(){return["usage: lmctl init [options]","","One-time provider lifecycle setup. Detects which provider CLIs",`(${_a.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(`
2156
+ `)}var _a,Ad,GF,Rd=E(()=>{"use strict";Se();_a=["claude","codex","gemini","opencode","qwen","copilot","agy"],Ad={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"}};GF={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:[xd(Nd(),".gemini","oauth_creds.json")]},copilot:{kind:"env-or-file",envVars:["COPILOT_GITHUB_TOKEN","GH_TOKEN","GITHUB_TOKEN"],filePaths:[xd(Nd(),".copilot","credentials.json")]},agy:{kind:"env-or-file",envVars:["GEMINI_API_KEY","GOOGLE_API_KEY","GOOGLE_GENAI_API_KEY"],filePaths:[xd(Nd(),".gemini","oauth_creds.json")]}}});var fT={};ie(fT,{initWorkspace:()=>uT,runWorkspace:()=>aU,setWorkspaceProvider:()=>dT});import{copyFileSync as tU,cpSync as rU,existsSync as Ce,mkdirSync as rr,readdirSync as Ld,renameSync as nU,rmSync as ga,statSync as wa,writeFileSync as sU}from"node:fs";import{spawnSync as oU}from"node:child_process";import{homedir as iT}from"node:os";import{dirname as Cd,join as Is}from"node:path";async function aU(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(iU),0;switch(r){case"list":return lU(n,e);case"create":return cU(n,e);case"use":return uU(n,e);case"show":return dU(n,e);case"delete":return fU(n,e);case"migrate":return mU(n,e);case"init":return uT(n,e);case"set-provider":return dT(n,e);default:return w(e,"usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>")}}function lT(){let t=Ns(),e=[],r=new Set,n=or.default,s=Ce(pn()),o=Ce(wt(n));if((s||o||t===null||t===n)&&(e.push({name:n,db_path:o?Lt(n):pn(),active:t===null||t===n,legacy:!o&&s}),r.add(n)),Ce(sr())){let i;try{i=Ld(sr())}catch{i=[]}for(let a of i.sort()){if(r.has(a)||!Fe(a))continue;let l=!1;try{l=wa(wt(a)).isDirectory()}catch{l=!1}l&&(e.push({name:a,db_path:Lt(a),active:t===a,legacy:!1}),r.add(a))}}return e}function lU(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=lT();if(M(r,"--json"))return W(e,n),0;for(let s of n){let o=s.active?"*":" ",i=s.legacy?" (legacy)":"";e.stdout.write(`${o} ${s.name} ${s.db_path}${i}
2157
+ `)}return 0}function cU(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(!Fe(n))return w(e,`invalid workspace name: ${n} (allowed: letters, digits, '.', '-', '_'; must start with alnum; \u226464 chars)`);let s=wt(n);if(Ce(s))return w(e,`workspace already exists: ${n} (${s})`);let o=j(r,"--docroot")??ba(n);rr(s,{recursive:!0}),rr(o,{recursive:!0});let i=Lt(n);rr(Cd(i),{recursive:!0});let a=pe({path:i});try{a.setConfig("project.docroot",o)}finally{a.close()}let l={name:n,dir:s,db_path:i,docroot:o};return M(r,"--json")?W(e,l):e.stdout.write(`created workspace ${n} at ${s}
2158
+ `),0}function uU(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(!Fe(n))return w(e,`invalid workspace name: ${n}`);if(n!==or.default&&!Ce(wt(n)))return w(e,`workspace not found: ${n} (run \`lmctl workspace create ${n}\` first)`);let s=$s();return rr(Cd(s),{recursive:!0}),sU(s,`${n}
2156
2159
  `),M(r,"--json")?W(e,{active:n,path:s}):e.stdout.write(`active workspace set to ${n}
2157
- `),0}function dU(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(!Fe(n))return w(e,`invalid workspace name: ${n}`);let s=lT().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)?ga(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 M(r,"--json")?W(e,c):e.stdout.write(`${JSON.stringify(c,null,2)}
2158
- `),0}function fU(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(!Fe(n))return w(e,`invalid workspace name: ${n}`);if(!M(r,"--confirm"))return w(e,`refusing to delete workspace ${n} without --confirm`);if(n===sr.default&&!M(r,"--force"))return w(e,"refusing to delete the default workspace without --force");if(Ns()===n&&!M(r,"--force"))return w(e,`refusing to delete the active workspace (${n}) without --force`);let o=wt(n);return Ce(o)?(_a(o,{recursive:!0,force:!0}),M(r,"--json")?W(e,{deleted:n,dir:o}):e.stdout.write(`deleted workspace ${n}
2160
+ `),0}function dU(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(!Fe(n))return w(e,`invalid workspace name: ${n}`);let s=lT().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)?wa(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 M(r,"--json")?W(e,c):e.stdout.write(`${JSON.stringify(c,null,2)}
2161
+ `),0}function fU(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(!Fe(n))return w(e,`invalid workspace name: ${n}`);if(!M(r,"--confirm"))return w(e,`refusing to delete workspace ${n} without --confirm`);if(n===or.default&&!M(r,"--force"))return w(e,"refusing to delete the default workspace without --force");if(Ns()===n&&!M(r,"--force"))return w(e,`refusing to delete the active workspace (${n}) without --force`);let o=wt(n);return Ce(o)?(ga(o,{recursive:!0,force:!0}),M(r,"--json")?W(e,{deleted:n,dir:o}):e.stdout.write(`deleted workspace ${n}
2159
2162
  `),0):w(e,`workspace not found: ${n}`)}function Od(t,e,r){try{nU(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
2160
- `),ga(t).isDirectory()?rU(t,e,{recursive:!0}):tU(t,e),!Ce(e))throw new Error(`migration copy verification failed: ${e} not present after copy`);_a(t,{recursive:!0,force:!0})}function mU(t,e){let r=P(t,[],["--json"]);if(r.error!==void 0)return w(e,r.error);let n=M(r,"--json"),s=ba(),o=nr(),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}
2163
+ `),wa(t).isDirectory()?rU(t,e,{recursive:!0}):tU(t,e),!Ce(e))throw new Error(`migration copy verification failed: ${e} not present after copy`);ga(t,{recursive:!0,force:!0})}function mU(t,e){let r=P(t,[],["--json"]);if(r.error!==void 0)return w(e,r.error);let n=M(r,"--json"),s=Ta(),o=sr(),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}
2161
2164
  `);e.stdout.write(f?`migration complete
2162
2165
  `:`${m??"nothing to migrate"}
2163
- `)}return 0};if(!Ce(s))return a(!1,"no legacy ~/.lmctl/profiles/ found; nothing to migrate");let l;try{l=Ld(s).sort()}catch{l=[]}let c=l.filter(f=>{try{return ga(Is(s,f)).isDirectory()}catch{return!1}});if(c.length===0)_a(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`);else if(!Ce(o))Od(s,o,e),i.push(`renamed ${s} -> ${o}`);else{let f=c.filter(m=>Ce(Is(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\`)`);tr(o,{recursive:!0});for(let m of c)Od(Is(s,m),Is(o,m),e),i.push(`moved ${m} -> workspaces/${m}`);try{Ld(s).length===0&&(_a(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`))}catch{}}let u=zd(),d=$s();return Ce(u)&&(Ce(d)?i.push("left active-profile in place (active-workspace already exists; not clobbering)"):(Od(u,d,e),i.push("renamed active-profile -> active-workspace"))),a(!0)}function cT(t,e){return oU(t,e,{encoding:"utf8",timeout:5e3,maxBuffer:1024*1024})}function _U(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 aT(t){return t==="~"?iT():t.startsWith("~/")?Is(iT(),t.slice(2)):t}async function uT(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: ${fn.join(", ")}.`].join(`
2166
+ `)}return 0};if(!Ce(s))return a(!1,"no legacy ~/.lmctl/profiles/ found; nothing to migrate");let l;try{l=Ld(s).sort()}catch{l=[]}let c=l.filter(f=>{try{return wa(Is(s,f)).isDirectory()}catch{return!1}});if(c.length===0)ga(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`);else if(!Ce(o))Od(s,o,e),i.push(`renamed ${s} -> ${o}`);else{let f=c.filter(m=>Ce(Is(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\`)`);rr(o,{recursive:!0});for(let m of c)Od(Is(s,m),Is(o,m),e),i.push(`moved ${m} -> workspaces/${m}`);try{Ld(s).length===0&&(ga(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`))}catch{}}let u=zd(),d=$s();return Ce(u)&&(Ce(d)?i.push("left active-profile in place (active-workspace already exists; not clobbering)"):(Od(u,d,e),i.push("renamed active-profile -> active-workspace"))),a(!0)}function cT(t,e){return oU(t,e,{encoding:"utf8",timeout:5e3,maxBuffer:1024*1024})}function _U(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 aT(t){return t==="~"?iT():t.startsWith("~/")?Is(iT(),t.slice(2)):t}async function uT(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: ${fn.join(", ")}.`].join(`
2164
2167
  `)+`
2165
2168
  `),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??cT,a=fn.map(k=>vs(k,o)).filter(k=>k.status==="ok"||k.status==="unverified").map(k=>k.provider);if(a.length===0)return e.stderr.write(`error: no provider CLI found on PATH; install/auth ${fn.join("|")} first (see \`lmctl init\`)
2166
2169
  `),2;let l=r.isTty??!!process.stdin.isTTY,c=r.promptLine??_U,u=r.promptLine!==void 0||l,d=k=>(e.stderr.write(`error: ${k} is required in non-interactive mode (no TTY); pass it explicitly
2167
2170
  `),2),f,m=j(s,"--name");if(m!==void 0){if(!Fe(m))return e.stderr.write(`error: invalid workspace name: ${m}
2168
2171
  `),2;f=m}else{if(!u)return d("--name");for(;;){let k=(await c("Workspace name [default]: ")).trim(),R=k.length===0?"default":k;if(Fe(R)){f=R;break}e.stderr.write(`invalid workspace name: ${R} (letters/digits/.-_, start alnum, \u226464)
2169
2172
  `)}}let p=wt(f);if(Ce(p))return e.stderr.write(`error: workspace already exists: ${f} (${p}) \u2014 refusing to overwrite
2170
- `),2;let h,g=j(s,"--basedir"),_=Ea(f);if(g!==void 0)h=aT(g);else{if(!u)return d("--basedir");let k=(await c(`Base directory for this workspace's projects [${_}]: `)).trim();h=k.length===0?_:aT(k)}let T={};for(let k of["provider1","provider2","provider3"]){let R=j(s,`--${k}`),L=pU[k],B=a.includes(L)?L:a[0];if(R!==void 0){if(!a.includes(R))return e.stderr.write(`error: --${k} ${R} is not an available provider (available: ${a.join(", ")})
2173
+ `),2;let h,g=j(s,"--basedir"),_=ba(f);if(g!==void 0)h=aT(g);else{if(!u)return d("--basedir");let k=(await c(`Base directory for this workspace's projects [${_}]: `)).trim();h=k.length===0?_:aT(k)}let T={};for(let k of["provider1","provider2","provider3"]){let R=j(s,`--${k}`),L=pU[k],B=a.includes(L)?L:a[0];if(R!==void 0){if(!a.includes(R))return e.stderr.write(`error: --${k} ${R} is not an available provider (available: ${a.join(", ")})
2171
2174
  `),2;T[k]=R;continue}if(!u)return d(`--${k}`);for(;;){let ee=(await c(`${k} (${hU[k]}) [${B}]: `)).trim(),x=ee.length===0?B:ee;if(a.includes(x)){T[k]=x;break}e.stderr.write(`not an available provider: ${x} (available: ${a.join(", ")})
2172
- `)}}tr(p,{recursive:!0}),tr(h,{recursive:!0});let S=Lt(f);tr(Cd(S),{recursive:!0});let I=pe({path:S});try{I.setConfig("project.docroot",h),I.setConfig("workspace.provider1",T.provider1),I.setConfig("workspace.provider2",T.provider2),I.setConfig("workspace.provider3",T.provider3)}finally{I.close()}let v={name:f,dir:p,db_path:S,basedir:h,providers:{...T}};return M(s,"--json")?W(e,v):(e.stdout.write(`created workspace ${f} at ${p}
2175
+ `)}}rr(p,{recursive:!0}),rr(h,{recursive:!0});let S=Lt(f);rr(Cd(S),{recursive:!0});let I=pe({path:S});try{I.setConfig("project.docroot",h),I.setConfig("workspace.provider1",T.provider1),I.setConfig("workspace.provider2",T.provider2),I.setConfig("workspace.provider3",T.provider3)}finally{I.close()}let v={name:f,dir:p,db_path:S,basedir:h,providers:{...T}};return M(s,"--json")?W(e,v):(e.stdout.write(`created workspace ${f} at ${p}
2173
2176
  `),e.stdout.write(` basedir: ${h}
2174
2177
  `),e.stdout.write(` provider1=${T.provider1} provider2=${T.provider2} provider3=${T.provider3}
2175
2178
  `),e.stdout.write(`activate it with: lmctl workspace use ${f}
@@ -2178,12 +2181,12 @@ ${c}`;return a.status===0&&(s.successPattern?s.successPattern.test(u):!0)?{provi
2178
2181
  `),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)
2179
2182
  `),2;let c=r.spawn??cT,u=fn.map(p=>vs(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 ${fn.join("|")} first (see \`lmctl init\`)
2180
2183
  `),2;if(!u.includes(i))return e.stderr.write(`error: ${i} is not an available provider (available: ${u.join(", ")})
2181
- `),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=hn()??sr.default;return e.stdout.write(`workspace.${l} = ${i} (workspace: ${m})
2184
+ `),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=hn()??or.default;return e.stdout.write(`workspace.${l} = ${i} (workspace: ${m})
2182
2185
  `),0}var iU,fn,pU,hU,mT=E(()=>{"use strict";Me();Rd();Se();He();iU=`usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>
2183
2186
 
2184
2187
  Manage isolated workspace state directories, active workspace selection,
2185
2188
  legacy profile migration, and configured provider slots.
2186
- `;fn=["claude","codex","gemini","qwen"],pU={provider1:"claude",provider2:"codex",provider3:"gemini"},hU={provider1:"primary implementer",provider2:"independent reviewer",provider3:"auxiliary / tie-break"}});var _T={};ie(_T,{runProject:()=>EU});import{existsSync as gU,statSync as wU}from"node:fs";import{join as hT}from"node:path";async function EU(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(yU),0;try{return await J(e,s=>{switch(r){case"create":return xU(n,e,s);case"list":return jU(n,e,s);case"show":return $U(n,e,s);case"status":return NU(n,e,s);case"workflow":return bU(n,e,s);default:return w(e,"usage: lmctl project <create|list|show|status|workflow>")}})}catch(s){return fe(e,s)}}function bU(t,e,r){let[n,...s]=t;switch(n){case"add":return TU(s,e,r);case"list":return SU(s,e,r);case"show":return kU(s,e,r);case"remove":return vU(s,e,r);case"enable":return pT(s,e,r,!0);case"disable":return pT(s,e,r,!1);default:return w(e,"usage: lmctl project workflow <add|list|show|remove|enable|disable>")}}function TU(t,e,r){let n=P(t,["--condition","--params","--priority"]);if(n.error!==void 0)return w(e,n.error);let[s,o]=n.positionals;if(s===void 0||o===void 0||n.positionals.length!==2)return w(e,"usage: project workflow add <project> <workflow> [--condition JEXL] [--params JSON] [--priority N]");let i=r.findProjectByName(s);if(i===null)return w(e,`project not found: ${s}`);let a=r.getWorkflowByName(o);if(a===null)return w(e,`workflow not found: ${o}`);let l=j(n,"--condition")??null;if(l!==null)try{Jt(l)}catch{return w(e,"invalid --condition JEXL")}let c=IU(j(n,"--params"));if(typeof c=="string")return w(e,c);let u=j(n,"--priority"),d=u===void 0?100:Number(u);if(!Number.isInteger(d))return w(e,`invalid --priority: ${u??""}`);let f=r.insertProjectWorkflow({project_id:i.id,workflow_id:a.id,condition:l,parameters_override:c?.json??null,priority:d});return M(n,"--json")?W(e,f):e.stdout.write(`added project workflow ${f.id}
2189
+ `;fn=["claude","codex","gemini","qwen"],pU={provider1:"claude",provider2:"codex",provider3:"gemini"},hU={provider1:"primary implementer",provider2:"independent reviewer",provider3:"auxiliary / tie-break"}});var _T={};ie(_T,{runProject:()=>EU});import{existsSync as gU,statSync as wU}from"node:fs";import{join as hT}from"node:path";async function EU(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(yU),0;try{return await J(e,s=>{switch(r){case"create":return xU(n,e,s);case"list":return jU(n,e,s);case"show":return $U(n,e,s);case"status":return NU(n,e,s);case"workflow":return bU(n,e,s);default:return w(e,"usage: lmctl project <create|list|show|status|workflow>")}})}catch(s){return fe(e,s)}}function bU(t,e,r){let[n,...s]=t;switch(n){case"add":return TU(s,e,r);case"list":return SU(s,e,r);case"show":return kU(s,e,r);case"remove":return vU(s,e,r);case"enable":return pT(s,e,r,!0);case"disable":return pT(s,e,r,!1);default:return w(e,"usage: lmctl project workflow <add|list|show|remove|enable|disable>")}}function TU(t,e,r){let n=P(t,["--condition","--params","--priority"]);if(n.error!==void 0)return w(e,n.error);let[s,o]=n.positionals;if(s===void 0||o===void 0||n.positionals.length!==2)return w(e,"usage: project workflow add <project> <workflow> [--condition JEXL] [--params JSON] [--priority N]");let i=r.findProjectByName(s);if(i===null)return w(e,`project not found: ${s}`);let a=r.getWorkflowByName(o);if(a===null)return w(e,`workflow not found: ${o}`);let l=j(n,"--condition")??null;if(l!==null)try{Xt(l)}catch{return w(e,"invalid --condition JEXL")}let c=IU(j(n,"--params"));if(typeof c=="string")return w(e,c);let u=j(n,"--priority"),d=u===void 0?100:Number(u);if(!Number.isInteger(d))return w(e,`invalid --priority: ${u??""}`);let f=r.insertProjectWorkflow({project_id:i.id,workflow_id:a.id,condition:l,parameters_override:c?.json??null,priority:d});return M(n,"--json")?W(e,f):e.stdout.write(`added project workflow ${f.id}
2187
2190
  `),0}function SU(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0||n.positionals.length!==1)return w(e,"usage: project workflow list <project>");let o=r.findProjectByName(s);if(o===null)return w(e,`project not found: ${s}`);let i=r.listProjectWorkflows(o.id);return M(n,"--json")?W(e,i):e.stdout.write(`${i.map(a=>`${a.id} ${a.workflow_id} ${a.priority} ${a.enabled} ${a.condition??""}`).join(`
2188
2191
  `)}${i.length>0?`
2189
2192
  `:""}`),0}function kU(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let s=Md(n.positionals[0]);if(typeof s=="string"||n.positionals.length!==1)return w(e,"usage: project workflow show <id>");let o=r.getProjectWorkflow(s);return o===null?w(e,`project workflow not found: ${s}`):(M(n,"--json")?W(e,o):e.stdout.write(`${JSON.stringify(o,null,2)}
@@ -2216,12 +2219,12 @@ per-project workflow bindings and routing conditions.
2216
2219
  `:`# source=${f}
2217
2220
  # tail_lines=${d.tail_lines}
2218
2221
  `;await s("intents/recent.log",`${m}${d.tail}${d.tail.length>0?`
2219
- `:""}`)}if(await s("README.md",PU(t)),t.sanitized)for(let d of n){let f=await MU(d.absPath);try{rf(d.bundlePath,f.toString("utf8"))}catch(m){throw await ST(e,{recursive:!0,force:!0}),m instanceof or,m}}let i=await yT(n),a=ET({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 Pd(kT(t.outputPath),{recursive:!0});let l=bT("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=bT("stat",["-c","%s",t.outputPath],{encoding:"utf8"}),u=Number.parseInt((c.stdout??"0").trim(),10)||0;return await ST(e,{recursive:!0,force:!0}),{outputPath:t.outputPath,manifest:a,bundleSizeBytes:u}}function PU(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(`
2222
+ `:""}`)}if(await s("README.md",PU(t)),t.sanitized)for(let d of n){let f=await MU(d.absPath);try{rf(d.bundlePath,f.toString("utf8"))}catch(m){throw await ST(e,{recursive:!0,force:!0}),m instanceof ir,m}}let i=await yT(n),a=ET({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 Pd(kT(t.outputPath),{recursive:!0});let l=bT("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=bT("stat",["-c","%s",t.outputPath],{encoding:"utf8"}),u=Number.parseInt((c.stdout??"0").trim(),10)||0;return await ST(e,{recursive:!0,force:!0}),{outputPath:t.outputPath,manifest:a,bundleSizeBytes:u}}function PU(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(`
2220
2223
  `)}var IT=E(()=>{"use strict";Dd();xs()});import{spawnSync as FU}from"node:child_process";import{stat as UU}from"node:fs/promises";async function $T(t){try{if(!(await UU(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 WU(t);case"hq":return BU(t)}}function WU(t){let r=FU("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 BU(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 NT=E(()=>{"use strict"});var jT={};ie(jT,{parseDiagnoseArgs:()=>xT,runDiagnose:()=>JU});import{tmpdir as qU}from"node:os";import{join as HU}from"node:path";async function JU(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${VU()}
2221
2224
  `),0;let r=xT(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
2222
2225
  `),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)
2223
2226
  `),2;if(r.upload&&r.internalS3)return e.stderr.write(`error: pick one of --upload (HQ) or --internal-s3, not both
2224
- `),2;let n=wT(),s=r.outputPath??GU(n),o=r.internalS3?"internal-s3":r.upload?"hq":"local";try{return await J(e,async i=>{let a=await sf({dal:i,include:r.include,dbPath:de(),intentLog:process.env.LMCTL_INTENT_LOG}),l;try{l=await vT({ticketId:n,data:a,outputPath:s,lmctlNextVersion:ir(),sanitized:!r.noSanitize})}catch(d){if(d instanceof or)return e.stderr.write(`sanitization failed: ${d.message}
2227
+ `),2;let n=wT(),s=r.outputPath??GU(n),o=r.internalS3?"internal-s3":r.upload?"hq":"local";try{return await J(e,async i=>{let a=await sf({dal:i,include:r.include,dbPath:de(),intentLog:process.env.LMCTL_INTENT_LOG}),l;try{l=await vT({ticketId:n,data:a,outputPath:s,lmctlNextVersion:ar(),sanitized:!r.noSanitize})}catch(d){if(d instanceof ir)return e.stderr.write(`sanitization failed: ${d.message}
2225
2228
  `),2;throw d}let c=await $T({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)}
2226
2229
  `):(e.stdout.write(`ticket: ${n}
2227
2230
  `),e.stdout.write(`bundle: ${l.outputPath} (${l.bundleSizeBytes} bytes, ${l.manifest.files.length} files)
@@ -2235,10 +2238,10 @@ per-project workflow bindings and routing conditions.
2235
2238
  `),e.stderr.write(`${RT()}
2236
2239
  `),2;let n=r[0];try{return await J(e,s=>(e.stdout.write(LT(s,n)),0))}catch(s){return e.stderr.write(`diagnose-prompt failed: ${s instanceof Error?s.message:String(s)}
2237
2240
  `),1}}function RT(){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(`
2238
- `)}var OT,Ud,Wd,FT=E(()=>{"use strict";du();Se();OT=["Coder","Reviewer1","Polisher"],Ud=3e4,Wd=new Set(["attention_needed","paused","escalation"])});var qT={};ie(qT,{appendIntent:()=>BT,resolveIntentLogPath:()=>WT,runStatus:()=>iW});import{appendFileSync as ZU,mkdirSync as QU}from"node:fs";import{homedir as eW}from"node:os";import{dirname as tW,join as rW}from"node:path";function WT(){return process.env.LMCTL_INTENT_LOG??rW(eW(),".lmctl","recent-intents.log")}function BT(t){try{let e=WT();QU(tW(e),{recursive:!0});let r=JSON.stringify({ts:t.ts??new Date().toISOString(),cwd:t.cwd??process.cwd(),verb:t.verb,args:[...t.args]});ZU(e,`${r}
2241
+ `)}var OT,Ud,Wd,FT=E(()=>{"use strict";fu();Se();OT=["Coder","Reviewer1","Polisher"],Ud=3e4,Wd=new Set(["attention_needed","paused","escalation"])});var qT={};ie(qT,{appendIntent:()=>BT,resolveIntentLogPath:()=>WT,runStatus:()=>iW});import{appendFileSync as ZU,mkdirSync as QU}from"node:fs";import{homedir as eW}from"node:os";import{dirname as tW,join as rW}from"node:path";function WT(){return process.env.LMCTL_INTENT_LOG??rW(eW(),".lmctl","recent-intents.log")}function BT(t){try{let e=WT();QU(tW(e),{recursive:!0});let r=JSON.stringify({ts:t.ts??new Date().toISOString(),cwd:t.cwd??process.cwd(),verb:t.verb,args:[...t.args]});ZU(e,`${r}
2239
2242
  `)}catch{}}async function iW(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(oW),0;let r=P(t,["--project"],["--web","--json"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,`unknown argument: ${r.positionals[0]}`);let n=M(r,"--web"),s=j(r,"--project"),o=M(r,"--json");return n&&s!==void 0?w(e,"--web and --project are mutually exclusive"):J(e,i=>{let a=aW(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.
2240
2243
  `),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.
2241
- `),1;if(a.kind==="project-not-found")return w(e,`project not found: ${a.name}`);let l=a.project,c=lW(i,l,a.source);return o?W(e,c):e.stdout.write(pW(c)),BT({verb:"status",args:t}),0})}function aW(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=gd(e.cwd,t);return r===null?{kind:"no-cwd-match"}:{kind:"ok",project:r,source:"cwd"}}function lW(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=cW(t,e.id,sW),a=uW(t,e.id),l=dW(t,e.id,nW),c=fW(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:mW(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 cW(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 uW(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 dW(t,e,r){return t.db.prepare(`
2244
+ `),1;if(a.kind==="project-not-found")return w(e,`project not found: ${a.name}`);let l=a.project,c=lW(i,l,a.source);return o?W(e,c):e.stdout.write(pW(c)),BT({verb:"status",args:t}),0})}function aW(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=wd(e.cwd,t);return r===null?{kind:"no-cwd-match"}:{kind:"ok",project:r,source:"cwd"}}function lW(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=cW(t,e.id,sW),a=uW(t,e.id),l=dW(t,e.id,nW),c=fW(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:mW(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 cW(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 uW(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 dW(t,e,r){return t.db.prepare(`
2242
2245
  SELECT r.*, w.name AS workflow_name
2243
2246
  FROM run r
2244
2247
  JOIN job j ON j.id = r.job_id
@@ -2247,7 +2250,7 @@ per-project workflow bindings and routing conditions.
2247
2250
  ORDER BY r.id DESC
2248
2251
  LIMIT ?
2249
2252
  `).all(e,r)}function fW(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 mW(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 UT(o,100)}}}catch{}return UT(t,100)}function UT(t,e){return t.length<=e?t:`${t.slice(0,e-1)}\u2026`}function pW(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(`
2250
- `)}var nW,sW,oW,HT=E(()=>{"use strict";Se();yd();nW=5,sW=10,oW=`usage: lmctl status [--project NAME|--web] [--json]
2253
+ `)}var nW,sW,oW,HT=E(()=>{"use strict";Se();Ed();nW=5,sW=10,oW=`usage: lmctl status [--project NAME|--web] [--json]
2251
2254
 
2252
2255
  Show the current project context, active run, unacked attentions, recent runs,
2253
2256
  and active providers. Defaults to resolving the project from the current
@@ -2284,7 +2287,7 @@ Teams & sessions:
2284
2287
 
2285
2288
  Workflows & projects:
2286
2289
  workflow Load, author, list, sync, export, or run workflow definitions.
2287
- run Run a workflow (alias for 'workflow run'); accepts an https:// URL.
2290
+ run Run a workflow (alias for 'workflow run'); accepts an https:// or lmctl:// URL.
2288
2291
  project Create, inspect, and manage projects and project-workflow bindings.
2289
2292
  workspace Manage isolated workspace state directories and provider slots.
2290
2293
  plan Generate a starter lmctl team document for a directory.
@@ -2299,8 +2302,8 @@ Run 'lmctl help <command>' for command-specific help.
2299
2302
  ${Hd}Run 'lmctl help' for usage.
2300
2303
  `),2}function XT(t,e){return t.stderr.write(`error: unknown command: ${e}
2301
2304
  ${Hd}Run 'lmctl help' for usage.
2302
- `),1}async function gW(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 qd(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 qd(e,"missing value for --workspace");if(!Fe(l))return qd(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 ${ir()}
2303
- `),0;if(n==="--help"||n==="-h"||n===void 0)return e.stdout.write(Bd),0;if(n==="help"){let[i,...a]=r.slice(1);return i===void 0||i==="--help"||i==="-h"?(e.stdout.write(Bd),0):_W.has(i)?JT(i,[...a,"--help"],e):XT(e,i)}Yd(de(),e.stderr),Zd(e.stderr);let[s,...o]=r;return s===void 0?(e.stdout.write(Bd),0):JT(s,o,e)}async function JT(t,e,r){switch(t){case"api":{let{runApi:n}=await Promise.resolve().then(()=>(Ll(),yp));return n(e,r)}case"code":{let{runCode:n}=await Promise.resolve().then(()=>(Zl(),Vp));return n(e,r)}case"serve":{let{runServe:n}=await Promise.resolve().then(()=>(oE(),sE));return n(e,r)}case"intake":{let{runIntake:n}=await Promise.resolve().then(()=>(aE(),iE));return n(e,r)}case"chat":{let{runChat:n}=await Promise.resolve().then(()=>(IE(),vE));return n(e,r)}case"mcp":{let{runMcp:n}=await Promise.resolve().then(()=>(RE(),AE));return n(e,r)}case"monitor":{let{runMonitor:n}=await Promise.resolve().then(()=>(UE(),FE));return n(e,r)}case"device":{let{runDevice:n}=await Promise.resolve().then(()=>(BE(),WE));return n(e,r)}case"team":{let{runTeam:n}=await Promise.resolve().then(()=>(JE(),HE));return n(e,r)}case"tail":{let{runTail:n}=await Promise.resolve().then(()=>(zE(),YE));return n(e,r)}case"info":{let{runInfo:n}=await Promise.resolve().then(()=>(QE(),ZE));return n(e,r)}case"ls":{let{runLs:n}=await Promise.resolve().then(()=>(rb(),tb));return n(e,r)}case"lint":{let{runLint:n}=await Promise.resolve().then(()=>(Ss(),Ts));return n(e,r)}case"seed":{let{runSeed:n}=await Promise.resolve().then(()=>(Ss(),Ts));return n(e,r)}case"hire":{let{runHire:n}=await Promise.resolve().then(()=>(Ss(),Ts));return n(e,r)}case"refresh":{let{runRefresh:n}=await Promise.resolve().then(()=>(Ss(),Ts));return n(e,r)}case"connect":{let{runConnect:n}=await Promise.resolve().then(()=>(xb(),Nb));return n(e,r)}case"clone":{let{runClone:n}=await Promise.resolve().then(()=>(Lb(),Ob));return n(e,r)}case"plan":{let{runPlan:n}=await Promise.resolve().then(()=>(Pb(),Db));return n(e,r)}case"terminal":{let{runTerminal:n}=await Promise.resolve().then(()=>(Bb(),Wb));return n(e,r)}case"workflow":{let{runWorkflow:n}=await Promise.resolve().then(()=>($d(),Id));return n(e,r)}case"run":{let{runWorkflow:n}=await Promise.resolve().then(()=>($d(),Id));return n(["run",...e],r)}case"workspace":{let{runWorkspace:n}=await Promise.resolve().then(()=>(mT(),fT));return n(e,r)}case"project":{let{runProject:n}=await Promise.resolve().then(()=>(gT(),_T));return n(e,r)}case"diagnose":{let{runDiagnose:n}=await Promise.resolve().then(()=>(AT(),jT));return n(e,r)}case"diagnose-prompt":{let{runDiagnosePrompt:n}=await Promise.resolve().then(()=>(FT(),PT));return n(e,r)}case"init":{let{runInit:n}=await Promise.resolve().then(()=>(Rd(),oT));return n(e,r)}case"status":{let{runStatus:n}=await Promise.resolve().then(()=>(HT(),qT));return n(e,r)}case"db":return wW(e,r);default:return XT(r,t)}}function wW(t,e){let[r,...n]=t;return r==="--help"||r==="-h"||r==="help"?(e.stdout.write(`usage: lmctl db downgrade --to <version> --confirm
2305
+ `),1}async function gW(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 qd(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 qd(e,"missing value for --workspace");if(!Fe(l))return qd(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 ${ar()}
2306
+ `),0;if(n==="--help"||n==="-h"||n===void 0)return e.stdout.write(Bd),0;if(n==="help"){let[i,...a]=r.slice(1);return i===void 0||i==="--help"||i==="-h"?(e.stdout.write(Bd),0):_W.has(i)?JT(i,[...a,"--help"],e):XT(e,i)}Yd(de(),e.stderr),Zd(e.stderr);let[s,...o]=r;return s===void 0?(e.stdout.write(Bd),0):JT(s,o,e)}async function JT(t,e,r){switch(t){case"api":{let{runApi:n}=await Promise.resolve().then(()=>(Cl(),yp));return n(e,r)}case"code":{let{runCode:n}=await Promise.resolve().then(()=>(Ql(),Vp));return n(e,r)}case"serve":{let{runServe:n}=await Promise.resolve().then(()=>(oE(),sE));return n(e,r)}case"intake":{let{runIntake:n}=await Promise.resolve().then(()=>(aE(),iE));return n(e,r)}case"chat":{let{runChat:n}=await Promise.resolve().then(()=>(IE(),vE));return n(e,r)}case"mcp":{let{runMcp:n}=await Promise.resolve().then(()=>(RE(),AE));return n(e,r)}case"monitor":{let{runMonitor:n}=await Promise.resolve().then(()=>(UE(),FE));return n(e,r)}case"device":{let{runDevice:n}=await Promise.resolve().then(()=>(BE(),WE));return n(e,r)}case"team":{let{runTeam:n}=await Promise.resolve().then(()=>(JE(),HE));return n(e,r)}case"tail":{let{runTail:n}=await Promise.resolve().then(()=>(zE(),YE));return n(e,r)}case"info":{let{runInfo:n}=await Promise.resolve().then(()=>(QE(),ZE));return n(e,r)}case"ls":{let{runLs:n}=await Promise.resolve().then(()=>(rb(),tb));return n(e,r)}case"lint":{let{runLint:n}=await Promise.resolve().then(()=>(Ss(),Ts));return n(e,r)}case"seed":{let{runSeed:n}=await Promise.resolve().then(()=>(Ss(),Ts));return n(e,r)}case"hire":{let{runHire:n}=await Promise.resolve().then(()=>(Ss(),Ts));return n(e,r)}case"refresh":{let{runRefresh:n}=await Promise.resolve().then(()=>(Ss(),Ts));return n(e,r)}case"connect":{let{runConnect:n}=await Promise.resolve().then(()=>(xb(),Nb));return n(e,r)}case"clone":{let{runClone:n}=await Promise.resolve().then(()=>(Lb(),Ob));return n(e,r)}case"plan":{let{runPlan:n}=await Promise.resolve().then(()=>(Pb(),Db));return n(e,r)}case"terminal":{let{runTerminal:n}=await Promise.resolve().then(()=>(Bb(),Wb));return n(e,r)}case"workflow":{let{runWorkflow:n}=await Promise.resolve().then(()=>($d(),Id));return n(e,r)}case"run":{let{runWorkflow:n}=await Promise.resolve().then(()=>($d(),Id));return n(["run",...e],r)}case"workspace":{let{runWorkspace:n}=await Promise.resolve().then(()=>(mT(),fT));return n(e,r)}case"project":{let{runProject:n}=await Promise.resolve().then(()=>(gT(),_T));return n(e,r)}case"diagnose":{let{runDiagnose:n}=await Promise.resolve().then(()=>(AT(),jT));return n(e,r)}case"diagnose-prompt":{let{runDiagnosePrompt:n}=await Promise.resolve().then(()=>(FT(),PT));return n(e,r)}case"init":{let{runInit:n}=await Promise.resolve().then(()=>(Rd(),oT));return n(e,r)}case"status":{let{runStatus:n}=await Promise.resolve().then(()=>(HT(),qT));return n(e,r)}case"db":return wW(e,r);default:return XT(r,t)}}function wW(t,e){let[r,...n]=t;return r==="--help"||r==="-h"||r==="help"?(e.stdout.write(`usage: lmctl db downgrade --to <version> --confirm
2304
2307
 
2305
2308
  Database utilities. The downgrade command is currently a documented stub;
2306
2309
  restore from backup for rollback and use normal migrations for forward changes.