@lmctl-ai/lmctl 0.1.114 → 0.1.115
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 +276 -260
- package/package.json +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
var uI=Object.defineProperty;var b=(t,e)=>()=>(t&&(e=t(t=0)),e);var se=(t,e)=>{for(var r in e)uI(t,r,{get:e[r],enumerable:!0})};import{existsSync as Vr,readdirSync as dI,readFileSync as fI}from"node:fs";import{homedir as mI,platform as Bm}from"node:os";import{join as Mt}from"node:path";function vr(){let t=process.env.LMCTL_HOME;return t!==void 0&&t.length>0?t:Mt(mI(),pI)}function Gn(){return Mt(vr(),qm)}function kr(){return Mt(vr(),_I)}function Dt(t){return Mt(kr(),t)}function er(t){return Mt(Dt(t),qm)}function Nl(){let t=[],e=new Set,r=o=>{Vr(o.db_path)&&(e.has(o.db_path)||(e.add(o.db_path),t.push(o)))};r({workspace_name:null,db_path:Gn(),kind:"legacy"});let n=kr();if(!Vr(n))return t;let s;try{s=dI(n)}catch{return t}for(let o of s.sort())Ke(o)&&r({workspace_name:o,db_path:er(o),kind:"workspace"});return t}function
|
|
2
|
-
`)}function
|
|
3
|
-
`)}var pI,qm,_I,hI,Hm,gI,yI,Ir,Ve=b(()=>{"use strict";pI=".lmctl",qm="state.db",_I="workspaces",hI="active-workspace",Hm="default",gI="profiles",yI="active-profile";Ir={default:Hm}});function vI(t){for(let e of SI)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 kI(t){let e=t.toLowerCase();return!!(e==="::1"||e==="::"||e.startsWith("fe80:")||e.startsWith("fe80::"))}function
|
|
1
|
+
var uI=Object.defineProperty;var b=(t,e)=>()=>(t&&(e=t(t=0)),e);var se=(t,e)=>{for(var r in e)uI(t,r,{get:e[r],enumerable:!0})};import{existsSync as Vr,readdirSync as dI,readFileSync as fI}from"node:fs";import{homedir as mI,platform as Bm}from"node:os";import{join as Mt}from"node:path";function vr(){let t=process.env.LMCTL_HOME;return t!==void 0&&t.length>0?t:Mt(mI(),pI)}function Gn(){return Mt(vr(),qm)}function kr(){return Mt(vr(),_I)}function Dt(t){return Mt(kr(),t)}function er(t){return Mt(Dt(t),qm)}function Nl(){let t=[],e=new Set,r=o=>{Vr(o.db_path)&&(e.has(o.db_path)||(e.add(o.db_path),t.push(o)))};r({workspace_name:null,db_path:Gn(),kind:"legacy"});let n=kr();if(!Vr(n))return t;let s;try{s=dI(n)}catch{return t}for(let o of s.sort())Ke(o)&&r({workspace_name:o,db_path:er(o),kind:"workspace"});return t}function Al(t){return Mt(Dt(t),"projects")}function go(){return Mt(vr(),hI)}function Ke(t){return!(t.length===0||t.length>64||!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(t)||t==="."||t==="..")}function yo(){let t=go();if(!Vr(t))return null;try{let e=fI(t,"utf8").trim();return e.length===0||!Ke(e)?null:e}catch{return null}}function Kn(){let t=process.env.LMCTL_WORKSPACE;return t!==void 0&&t.length>0&&Ke(t)?t:yo()}function le(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=Kn();if(e!==null)return er(e);let r=Gn();return Vr(r)||!Vr(kr())?r:er(Hm)}function wI(t,e=Bm()){return e!=="linux"?!1:t.startsWith("/mnt/c/")||t==="/mnt/c"}function Jm(t,e=process.stderr,r=Bm()){wI(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 xl(){return Mt(vr(),gI)}function Xm(){return Mt(vr(),yI)}function EI(){try{return Vr(xl())}catch{return!1}}function Gm(t=process.stderr){EI()&&t.write(`note: legacy ~/.lmctl/profiles/ detected \u2014 run 'lmctl workspace migrate' to move it to ~/.lmctl/workspaces/
|
|
3
|
+
`)}var pI,qm,_I,hI,Hm,gI,yI,Ir,Ve=b(()=>{"use strict";pI=".lmctl",qm="state.db",_I="workspaces",hI="active-workspace",Hm="default",gI="profiles",yI="active-profile";Ir={default:Hm}});function vI(t){for(let e of SI)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 kI(t){let e=t.toLowerCase();return!!(e==="::1"||e==="::"||e.startsWith("fe80:")||e.startsWith("fe80::"))}function AI(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 Vn(t){let e=t;for(let{re:r,replacement:n}of bI)e=e.replace(r,n);return e=e.replace(II,r=>!AI(r)||vI(r)?r:Km),e=e.replace(NI,r=>kI(r)?r:Km),e}function Yn(t){return t.split(`
|
|
4
4
|
`).map(e=>Vn(e)).join(`
|
|
5
|
-
`)}function Ym(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:ut}:{key:t,value:Vn(e)}}function tr(t){if(typeof t=="string")return Vn(t);if(Array.isArray(t))return t.map(e=>tr(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"?ut:tr(n):e[r]=tr(n)}return e}return t}function zm(t,e){for(let{name:r,re:n}of
|
|
5
|
+
`)}function Ym(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:ut}:{key:t,value:Vn(e)}}function tr(t){if(typeof t=="string")return Vn(t);if(Array.isArray(t))return t.map(e=>tr(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"?ut:tr(n):e[r]=tr(n)}return e}return t}function zm(t,e){for(let{name:r,re:n}of xI){let s=e.match(n);if(s!==null&&!s[0].includes(ut))throw new Nr(t,r)}}var ut,TI,Km,Vm,bI,SI,II,NI,xI,Nr,wo=b(()=>{"use strict";ut="[REDACTED]",TI="[REDACTED_EMAIL]",Km="[REDACTED_IP]",Vm="[USER]",bI=[{re:/(authorization\s*[:=]\s*)(bearer\s+[^\s,;"']+)/gi,replacement:`$1Bearer ${ut}`},{re:/(authorization\s*[:=]\s*)(basic\s+[^\s,;"']+)/gi,replacement:`$1Basic ${ut}`},{re:/\b(Bearer\s+)[A-Za-z0-9_\-./+=]{8,}/g,replacement:`$1${ut}`},{re:/\bsk-ant-[A-Za-z0-9_\-]{8,}/g,replacement:ut},{re:/\bsk-[A-Za-z0-9_\-]{16,}/g,replacement:ut},{re:/\bgh[pousr]_[A-Za-z0-9]{30,}/g,replacement:ut},{re:/\bAKIA[0-9A-Z]{16}\b/g,replacement:ut},{re:/\b(api[_-]?key|token|secret|password|passwd)(\s*[:=]\s*"?)([A-Za-z0-9_\-./+=]{8,})("?)/gi,replacement:`$1$2${ut}$4`},{re:/(\/home\/)[^/\s"'`]+/g,replacement:`$1${Vm}`},{re:/(\/Users\/)[^/\s"'`]+/g,replacement:`$1${Vm}`},{re:/\b[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}\b/g,replacement:TI}],SI=["127.","10.","192.168.","0.0.0.0"];II=/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/g,NI=/\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;xI=[{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"'`]+/}],Nr=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 Rl}from"node:child_process";import{readFileSync as RI}from"node:fs";import{readFile as $l,stat as Zm}from"node:fs/promises";import{homedir as LI}from"node:os";import{join as $I}from"node:path";import{fileURLToPath as OI}from"node:url";function Tt(){try{let t=new URL("../../package.json",import.meta.url),e=JSON.parse(RI(OI(t),"utf8"));if(typeof e.version=="string")return e.version}catch{}return"0.0.0"}async function Qm(t){let e=new Set(t.include??Eo),r={};return e.has("serve")&&(r.serve=await CI(t)),e.has("db")&&(r.db=MI(t)),e.has("runs")&&(r.runs=DI(t)),e.has("jobs")&&(r.jobs=PI(t)),e.has("attentions")&&(r.attentions=FI(t)),e.has("env")&&(r.env=await UI(t)),e.has("intents")&&(r.intents=await BI(t)),r}async function CI(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 $l(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 $l(r,"utf8")).split(`
|
|
6
6
|
`),f=d.slice(Math.max(0,d.length-n));c=f.length,a=Yn(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 MI(t){let{dal:e}=t,r="unknown";try{r=e.query("PRAGMA integrity_check;").map(i=>i.integrity_check??JSON.stringify(i)).join(`
|
|
8
8
|
`)}catch(o){r=`integrity_check failed: ${o instanceof Error?o.message:String(o)}`}let n=0;try{n=e.query("PRAGMA user_version;")[0]?.user_version??0}catch{n=0}let s={};try{let o=e.query("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name");for(let{name:i}of o)try{let a=e.query(`SELECT COUNT(*) AS c FROM "${i.replace(/"/g,'""')}"`);s[i]=a[0]?.c??0}catch{s[i]=-1}}catch{}return{integrity_check:r,schema_version:n,table_counts:s}}function DI(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 ${Ll} FROM run ORDER BY id DESC LIMIT 50`),i=e.query(`SELECT ${Ll} FROM run WHERE paused_at IS NOT NULL AND terminal_state IS NULL ORDER BY paused_at DESC LIMIT 50`),a=e.query(`SELECT ${Ll} FROM run
|
|
@@ -12,9 +12,9 @@ var uI=Object.defineProperty;var b=(t,e)=>()=>(t&&(e=t(t=0)),e);var se=(t,e)=>{f
|
|
|
12
12
|
FROM attention WHERE acknowledged_at IS NULL ORDER BY created_at DESC LIMIT 100`);return{unacked:tr(r)}}async function UI(t){let e=Tt(),r=process.version,n=Rl("uname",["-a"],{encoding:"utf8"}),s=Yn((n.stdout??"").trim()),o=[],i=t.dbPath??process.env.LMCTL_DB;if(i!==void 0)try{await Zm(i);let u=Rl("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 Zm(a);let u=Rl("du",["-sh",a],{encoding:"utf8"});u.status===0&&o.push(u.stdout.trim())}catch{}let l=o.length===0?"(no paths configured)":Yn(o.join(`
|
|
13
13
|
`)),c=[];for(let u of jI){let d=process.env[u];if(d===void 0){c.push({key:u,value:"(unset)"});continue}c.push(Ym(u,d))}return{lmctl_next_version:e,node_version:r,os_info:s,disk_usage:l,env_keys_present:c}}function WI(){return process.env.LMCTL_INTENT_LOG??$I(LI(),".lmctl","recent-intents.log")}async function BI(t){let e=t.intentLog??WI(),r=t.intentLogTailLines??500;try{let s=(await $l(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:Yn(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 Eo,jI,Ll,zn=b(()=>{"use strict";wo();Eo=["serve","db","runs","jobs","attentions","env","intents"];jI=["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"];Ll=["id","job_id","workflow_id","team_id","current_state","terminal_state","started_at","ended_at","paused_at","parent_run_id","blocker"].join(", ")});import{readFileSync as rp,appendFileSync as qI,mkdirSync as HI,existsSync as
|
|
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 Eo,jI,Ll,zn=b(()=>{"use strict";wo();Eo=["serve","db","runs","jobs","attentions","env","intents"];jI=["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"];Ll=["id","job_id","workflow_id","team_id","current_state","terminal_state","started_at","ended_at","paused_at","parent_run_id","blocker"].join(", ")});import{readFileSync as rp,appendFileSync as qI,mkdirSync as HI,existsSync as $X,readdirSync as OX,unlinkSync as jX}from"node:fs";import{join as bo,dirname as JI}from"node:path";import{homedir as XI}from"node:os";function Ol(){return bo(XI(),".lmctl")}function np(){Yr=!0,process.env.LMCTL_DEBUG="1"}function sp(){return{cliDebug:Yr,lmctlDebugEnv:process.env.LMCTL_DEBUG}}function op(t){Yr=t.cliDebug,t.lmctlDebugEnv===void 0?delete process.env.LMCTL_DEBUG:process.env.LMCTL_DEBUG=t.lmctlDebugEnv}function ue(){if(Yr||process.env.LMCTL_DEBUG==="1")return!0;let t=Date.now();return t-tp>=GI&&(ep=YI(),tp=t),ep}function ip(){return Yr||process.env.LMCTL_DEBUG==="1"}function KI(){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 Oe(t,e){if(e?.verbose){if(!Yr)return}else if(!e?.always&&!ue())return;try{VI();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};qI(To,JSON.stringify(r)+`
|
|
16
16
|
`)}catch{}}function VI(){if(!To){let e=KI().slice(0,13).replace("T","-");To=bo(Ol(),`debug-${e}.log`)}HI(JI(To),{recursive:!0})}function je(...t){Oe({event:"legacy",msg:t.join(" ")})}function bt(...t){Oe({event:"legacy",msg:t.join(" ")},{verbose:!0})}function z(t){Oe(t,{always:!0})}function YI(){return zI()||ZI()}function zI(){try{let t=rp(bo(Ol(),"config.toml"),"utf-8");for(let e of t.split(`
|
|
17
|
-
`)){let r=e.trim();if(!r||r.startsWith("#"))continue;if(r.startsWith("["))break;let n=/^debug\s*=\s*(.+)$/.exec(r);if(n){let s=n[1].trim().toLowerCase().replace(/^["']|["']$/g,"");return s==="true"||s==="1"}}}catch{}return!1}function ZI(){try{let t=rp(bo(Ol(),"config.json"),"utf-8"),e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)&&e.debug===!0}catch{}return!1}var Yr,ep,tp,GI,To,ve=b(()=>{"use strict";Yr=!1,ep=!1,tp=0,GI=5e3;To=null});function Zn(t){try{return new URL(t).protocol==="https:"}catch{return!1}}function jl(t){return/^[A-Za-z]:[\\/]/.test(t)?!1:/^[A-Za-z][A-Za-z0-9+.-]*:/.test(t)}function Qn(t,e){return!jl(t)||Zn(t)?null:`${e} must use https://: ${t}`}async function So(t,e){let r=Qn(t,e.description);if(r!==null||!Zn(t))throw new Error(r??`${e.description} must use https://: ${t}`);let n=e.timeoutMs??15e3,s=new AbortController,o=setTimeout(()=>s.abort(),n);try{let i;try{i=await fetch(t,{signal:s.signal,redirect:"manual"})}catch(a){throw ap(t,e.description,n,a)}if(i.type==="opaqueredirect"||i.status>=300&&i.status<400)throw new Error(`refusing to follow redirect from ${e.description} ${t} (https-only: the URL must serve the content directly, not redirect)`);if(!i.ok)throw new Error(`failed to fetch ${e.description} ${t}: HTTP ${i.status}${i.statusText?` ${i.statusText}`:""}`);try{return Buffer.from(await i.arrayBuffer())}catch(a){throw ap(t,e.description,n,a)}}finally{clearTimeout(o)}}function ap(t,e,r,n){let o=n instanceof Error&&n.name==="AbortError"?`timed out after ${r}ms`:n instanceof Error?n.message:String(n);return new Error(`failed to fetch ${e} ${t}: ${o}`)}var Cl=b(()=>{"use strict"});function rr(t){if(!Number.isInteger(t)||(t??0)<=0)return!1;try{return process.kill(t,0),!0}catch(e){return(e!==null&&typeof e=="object"&&"code"in e?e.code:void 0)!=="ESRCH"}}var vo=b(()=>{"use strict"});import{hostname as _N}from"node:os";function nr(t,e){let r=new Date().toISOString(),n=new Date(Date.now()-e.ttlMs).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},o=t.getAgentInflight(e.receiver_teamfile,e.receiver_alias),i=o===null||o.holder_pid===null,a=t.tryAcquireAgentInflight(s,{...i?{stale_before:n}:{},force:e.force});if(a.acquired){let c=o===null?null:e.force===!0?"force":o.holder_pid===null&&o.started_at<n?"stale":null;return{acquired:!0,lease:a.current??s,previous:o,reclaimReason:c}}if(!dp(a.current,n))return{acquired:!1,current:a.current};let l=t.tryAcquireAgentInflight(s,a.current.holder_pid===null?{stale_before:n}:{reclaim_observed:{sender_teamfile:a.current.sender_teamfile,sender_alias:a.current.sender_alias,started_at:a.current.started_at,holder_pid:a.current.holder_pid}});return l.acquired?{acquired:!0,lease:l.current??s,previous:a.current,reclaimReason:a.current.holder_pid===null?"stale":"dead-pid"}:{acquired:!1,current:l.current}}function zr(t,e,r){let n=t.getTerminalLock(e,r);if(n!==null&&hN(n))return!0;let s=t.getAgentInflight(e,r);if(s===null)return!1;let o=new Date(Date.now()-gN()).toISOString();return!dp(s,o)}function hN(t){if(t.holder_host===_N())return rr(t.holder_pid);let e=Date.parse(t.last_heartbeat);return Number.isFinite(e)?Date.now()-e<=yN():!1}function dp(t,e){return t.holder_pid===null?t.started_at<e:!rr(t.holder_pid)}function gN(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return cp;let r=Number(e);return!Number.isFinite(r)||r<=0?cp:r}function yN(t=process.env){let e=t.LMCTL_TERMINAL_LOCK_STALE_MS;if(e===void 0||e.trim()==="")return up;let r=Number(e);return!Number.isFinite(r)||r<=0?up:r}var cp,up,es=b(()=>{"use strict";vo();cp=8*60*60*1e3,up=12e4});import{existsSync as wN}from"node:fs";import{createRequire as EN}from"node:module";function TN(){return Dl===null&&(Dl=EN(import.meta.url)("node:sqlite").DatabaseSync),Dl}function Pl(t){return t.length===1&&bN(t[0])?[t[0]]:t}function bN(t){if(!Wl(t))return!1;let e=Object.getPrototypeOf(t);return e===Object.prototype||e===null}function Wl(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Dl,Fl,ko,Ul,Bl=b(()=>{"use strict";Dl=null;Fl=class{name;handle;transactionDepth=0;savepointId=0;constructor(e,r={}){if(r.fileMustExist===!0&&e!==":memory:"&&!wN(e))throw new Error("unable to open database file");this.name=e,this.handle=new(TN())(e,{readOnly:r.readonly===!0}),this.exec("PRAGMA busy_timeout = 5000")}prepare(e){return new Ul(this.handle.prepare(e))}exec(e){this.handle.exec(e),this.updateTransactionDepth(e)}pragma(e,r){let n=`PRAGMA ${e}`;if(e.includes("=")){this.exec(n);return}let s=this.prepare(n).get();return r?.simple===!0?s===void 0?void 0:Object.values(s)[0]:s}transaction(e){return(...r)=>{if(this.transactionDepth===0){this.exec("BEGIN");try{let s=e(...r);return this.exec("COMMIT"),s}catch(s){throw this.inTransaction&&this.exec("ROLLBACK"),s}}let n=`lmctl_sp_${this.savepointId+=1}`;this.exec(`SAVEPOINT ${n}`);try{let s=e(...r);return this.exec(`RELEASE ${n}`),s}catch(s){throw this.inTransaction&&(this.exec(`ROLLBACK TO ${n}`),this.exec(`RELEASE ${n}`)),s}}}get inTransaction(){return this.transactionDepth>0}close(){this.handle.close()}updateTransactionDepth(e){let r=e.trim().match(/^([A-Za-z]+)/)?.[1]?.toUpperCase();if(r!==void 0){if(r==="BEGIN"||r==="SAVEPOINT"){this.transactionDepth+=1;return}if(r==="COMMIT"){this.transactionDepth=Math.max(0,this.transactionDepth-1);return}if(r==="RELEASE"){this.transactionDepth=Math.max(0,this.transactionDepth-1);return}r==="ROLLBACK"&&!/^ROLLBACK\s+TO\b/i.test(e.trim())&&(this.transactionDepth=0)}}},ko=Fl,Ul=class{handle;rawMode=!1;constructor(e){this.handle=e,this.handle.setAllowBareNamedParameters(!0)}get(...e){let r=this.handle.get(...Pl(e));return this.normalizeRow(r)}all(...e){return this.handle.all(...Pl(e)).map(r=>this.normalizeRow(r))}run(...e){let r=this.handle.run(...Pl(e));return{changes:Number(r.changes),lastInsertRowid:Number(r.lastInsertRowid)}}raw(){return this.rawMode=!0,this}normalizeRow(e){return e==null?e:this.rawMode&&Wl(e)?Object.values(e):Wl(e)?{...e}:e}}});import{existsSync as SN,mkdirSync as vN,readFileSync as mp}from"node:fs";import{homedir as kN}from"node:os";import{dirname as pp,join as IN,resolve as _p}from"node:path";import{fileURLToPath as NN,pathToFileURL as
|
|
17
|
+
`)){let r=e.trim();if(!r||r.startsWith("#"))continue;if(r.startsWith("["))break;let n=/^debug\s*=\s*(.+)$/.exec(r);if(n){let s=n[1].trim().toLowerCase().replace(/^["']|["']$/g,"");return s==="true"||s==="1"}}}catch{}return!1}function ZI(){try{let t=rp(bo(Ol(),"config.json"),"utf-8"),e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)&&e.debug===!0}catch{}return!1}var Yr,ep,tp,GI,To,ve=b(()=>{"use strict";Yr=!1,ep=!1,tp=0,GI=5e3;To=null});function Zn(t){try{return new URL(t).protocol==="https:"}catch{return!1}}function jl(t){return/^[A-Za-z]:[\\/]/.test(t)?!1:/^[A-Za-z][A-Za-z0-9+.-]*:/.test(t)}function Qn(t,e){return!jl(t)||Zn(t)?null:`${e} must use https://: ${t}`}async function So(t,e){let r=Qn(t,e.description);if(r!==null||!Zn(t))throw new Error(r??`${e.description} must use https://: ${t}`);let n=e.timeoutMs??15e3,s=new AbortController,o=setTimeout(()=>s.abort(),n);try{let i;try{i=await fetch(t,{signal:s.signal,redirect:"manual"})}catch(a){throw ap(t,e.description,n,a)}if(i.type==="opaqueredirect"||i.status>=300&&i.status<400)throw new Error(`refusing to follow redirect from ${e.description} ${t} (https-only: the URL must serve the content directly, not redirect)`);if(!i.ok)throw new Error(`failed to fetch ${e.description} ${t}: HTTP ${i.status}${i.statusText?` ${i.statusText}`:""}`);try{return Buffer.from(await i.arrayBuffer())}catch(a){throw ap(t,e.description,n,a)}}finally{clearTimeout(o)}}function ap(t,e,r,n){let o=n instanceof Error&&n.name==="AbortError"?`timed out after ${r}ms`:n instanceof Error?n.message:String(n);return new Error(`failed to fetch ${e} ${t}: ${o}`)}var Cl=b(()=>{"use strict"});function rr(t){if(!Number.isInteger(t)||(t??0)<=0)return!1;try{return process.kill(t,0),!0}catch(e){return(e!==null&&typeof e=="object"&&"code"in e?e.code:void 0)!=="ESRCH"}}var vo=b(()=>{"use strict"});import{hostname as _N}from"node:os";function nr(t,e){let r=new Date().toISOString(),n=new Date(Date.now()-e.ttlMs).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},o=t.getAgentInflight(e.receiver_teamfile,e.receiver_alias),i=o===null||o.holder_pid===null,a=t.tryAcquireAgentInflight(s,{...i?{stale_before:n}:{},force:e.force});if(a.acquired){let c=o===null?null:e.force===!0?"force":o.holder_pid===null&&o.started_at<n?"stale":null;return{acquired:!0,lease:a.current??s,previous:o,reclaimReason:c}}if(!dp(a.current,n))return{acquired:!1,current:a.current};let l=t.tryAcquireAgentInflight(s,a.current.holder_pid===null?{stale_before:n}:{reclaim_observed:{sender_teamfile:a.current.sender_teamfile,sender_alias:a.current.sender_alias,started_at:a.current.started_at,holder_pid:a.current.holder_pid}});return l.acquired?{acquired:!0,lease:l.current??s,previous:a.current,reclaimReason:a.current.holder_pid===null?"stale":"dead-pid"}:{acquired:!1,current:l.current}}function zr(t,e,r){let n=t.getTerminalLock(e,r);if(n!==null&&hN(n))return!0;let s=t.getAgentInflight(e,r);if(s===null)return!1;let o=new Date(Date.now()-gN()).toISOString();return!dp(s,o)}function hN(t){if(t.holder_host===_N())return rr(t.holder_pid);let e=Date.parse(t.last_heartbeat);return Number.isFinite(e)?Date.now()-e<=yN():!1}function dp(t,e){return t.holder_pid===null?t.started_at<e:!rr(t.holder_pid)}function gN(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return cp;let r=Number(e);return!Number.isFinite(r)||r<=0?cp:r}function yN(t=process.env){let e=t.LMCTL_TERMINAL_LOCK_STALE_MS;if(e===void 0||e.trim()==="")return up;let r=Number(e);return!Number.isFinite(r)||r<=0?up:r}var cp,up,es=b(()=>{"use strict";vo();cp=8*60*60*1e3,up=12e4});import{existsSync as wN}from"node:fs";import{createRequire as EN}from"node:module";function TN(){return Dl===null&&(Dl=EN(import.meta.url)("node:sqlite").DatabaseSync),Dl}function Pl(t){return t.length===1&&bN(t[0])?[t[0]]:t}function bN(t){if(!Wl(t))return!1;let e=Object.getPrototypeOf(t);return e===Object.prototype||e===null}function Wl(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Dl,Fl,ko,Ul,Bl=b(()=>{"use strict";Dl=null;Fl=class{name;handle;transactionDepth=0;savepointId=0;constructor(e,r={}){if(r.fileMustExist===!0&&e!==":memory:"&&!wN(e))throw new Error("unable to open database file");this.name=e,this.handle=new(TN())(e,{readOnly:r.readonly===!0}),this.exec("PRAGMA busy_timeout = 5000")}prepare(e){return new Ul(this.handle.prepare(e))}exec(e){this.handle.exec(e),this.updateTransactionDepth(e)}pragma(e,r){let n=`PRAGMA ${e}`;if(e.includes("=")){this.exec(n);return}let s=this.prepare(n).get();return r?.simple===!0?s===void 0?void 0:Object.values(s)[0]:s}transaction(e){return(...r)=>{if(this.transactionDepth===0){this.exec("BEGIN");try{let s=e(...r);return this.exec("COMMIT"),s}catch(s){throw this.inTransaction&&this.exec("ROLLBACK"),s}}let n=`lmctl_sp_${this.savepointId+=1}`;this.exec(`SAVEPOINT ${n}`);try{let s=e(...r);return this.exec(`RELEASE ${n}`),s}catch(s){throw this.inTransaction&&(this.exec(`ROLLBACK TO ${n}`),this.exec(`RELEASE ${n}`)),s}}}get inTransaction(){return this.transactionDepth>0}close(){this.handle.close()}updateTransactionDepth(e){let r=e.trim().match(/^([A-Za-z]+)/)?.[1]?.toUpperCase();if(r!==void 0){if(r==="BEGIN"||r==="SAVEPOINT"){this.transactionDepth+=1;return}if(r==="COMMIT"){this.transactionDepth=Math.max(0,this.transactionDepth-1);return}if(r==="RELEASE"){this.transactionDepth=Math.max(0,this.transactionDepth-1);return}r==="ROLLBACK"&&!/^ROLLBACK\s+TO\b/i.test(e.trim())&&(this.transactionDepth=0)}}},ko=Fl,Ul=class{handle;rawMode=!1;constructor(e){this.handle=e,this.handle.setAllowBareNamedParameters(!0)}get(...e){let r=this.handle.get(...Pl(e));return this.normalizeRow(r)}all(...e){return this.handle.all(...Pl(e)).map(r=>this.normalizeRow(r))}run(...e){let r=this.handle.run(...Pl(e));return{changes:Number(r.changes),lastInsertRowid:Number(r.lastInsertRowid)}}raw(){return this.rawMode=!0,this}normalizeRow(e){return e==null?e:this.rawMode&&Wl(e)?Object.values(e):Wl(e)?{...e}:e}}});import{existsSync as SN,mkdirSync as vN,readFileSync as mp}from"node:fs";import{homedir as kN}from"node:os";import{dirname as pp,join as IN,resolve as _p}from"node:path";import{fileURLToPath as NN,pathToFileURL as AN}from"node:url";function Hl(t){t.dbPath!==":memory:"&&vN(pp(t.dbPath),{recursive:!0});let e=new ko(t.dbPath);e.pragma("journal_mode = WAL"),e.pragma("synchronous = NORMAL"),e.pragma("foreign_keys = ON");let r=yp(e);return r===0&&(e.exec(mp(gp,"utf8")),e.pragma(`user_version = ${ql}`)),RN(e,r),e}function RN(t,e){let r=e;if(r<2&&r!==0&&(t.exec(`
|
|
18
18
|
CREATE TABLE IF NOT EXISTS session_size (
|
|
19
19
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
20
20
|
team_name TEXT NOT NULL,
|
|
@@ -583,7 +583,7 @@ var uI=Object.defineProperty;var b=(t,e)=>()=>(t&&(e=t(t=0)),e);var se=(t,e)=>{f
|
|
|
583
583
|
notified_at = COALESCE(ended_at, started_at)
|
|
584
584
|
WHERE status IN ('done', 'error', 'busy', 'cancelled')
|
|
585
585
|
AND notified_by IS NULL;
|
|
586
|
-
`),t.pragma("user_version = 49"),r=49),SN(
|
|
586
|
+
`),t.pragma("user_version = 49"),r=49),SN(xN)}function de(t,e){let r=t.prepare(`PRAGMA table_info(${e})`).all();return new Set(r.map(n=>n.name))}function ts(t,e){return t.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?").get(e)!==void 0}function Io(t,e){if(!ts(t,e)&&(t.exec(mp(gp,"utf8")),!ts(t,e)))throw new Error(`schema.sql did not create expected table: ${e}`)}function fp(t){let e=de(t,"team_chat_log");t.pragma("foreign_keys = OFF");try{t.exec(`
|
|
587
587
|
DROP TABLE IF EXISTS team_chat_log_v46;
|
|
588
588
|
CREATE TABLE team_chat_log_v46 (
|
|
589
589
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
@@ -612,7 +612,7 @@ var uI=Object.defineProperty;var b=(t,e)=>()=>(t&&(e=t(t=0)),e);var se=(t,e)=>{f
|
|
|
612
612
|
FROM team_chat_log;
|
|
613
613
|
DROP TABLE team_chat_log;
|
|
614
614
|
ALTER TABLE team_chat_log_v46 RENAME TO team_chat_log;
|
|
615
|
-
`)}finally{t.pragma("foreign_keys = ON")}}function yp(t){let e=t.pragma("user_version",{simple:!0});return typeof e=="number"?e:0}function LN(){return process.env.LMCTL_DB??IN(kN(),".lmctl","state.db")}var hp,gp,
|
|
615
|
+
`)}finally{t.pragma("foreign_keys = ON")}}function yp(t){let e=t.pragma("user_version",{simple:!0});return typeof e=="number"?e:0}function LN(){return process.env.LMCTL_DB??IN(kN(),".lmctl","state.db")}var hp,gp,xN,ql,Jl=b(()=>{"use strict";Bl();hp=pp(NN(import.meta.url)),gp=_p(hp,"schema.sql"),xN=_p(hp,"migrations"),ql=49;if(process.argv[1]&&import.meta.url===AN(process.argv[1]).href){let t=Hl({dbPath:process.argv[2]??LN()});try{process.stdout.write(`migrated user_version=${yp(t)}
|
|
616
616
|
`)}finally{t.close()}}});function wp(t){return{getAgentInflight:t.prepare("SELECT * FROM agent_inflight WHERE receiver_teamfile = ? AND receiver_alias = ?"),listAgentInflight:t.prepare("SELECT * FROM agent_inflight ORDER BY started_at ASC, receiver_teamfile ASC, receiver_alias ASC"),acquireAgentInflight:t.prepare(`
|
|
617
617
|
INSERT INTO agent_inflight (receiver_teamfile, receiver_alias, sender_teamfile, sender_alias, started_at, active_count, holder_pid)
|
|
618
618
|
VALUES (@receiver_teamfile, @receiver_alias, @sender_teamfile, @sender_alias, @started_at, 1, @holder_pid)
|
|
@@ -886,8 +886,8 @@ var uI=Object.defineProperty;var b=(t,e)=>()=>(t&&(e=t(t=0)),e);var se=(t,e)=>{f
|
|
|
886
886
|
AND delivering_at IS NULL
|
|
887
887
|
ORDER BY receiver_teamfile ASC, receiver_alias ASC, id ASC
|
|
888
888
|
`),deleteMailboxMessage:t.prepare("DELETE FROM agent_mailbox WHERE id = ?")}}function Xl(t){if(Buffer.byteLength(t,"utf8")<=65536)return t;let r=Buffer.byteLength(vp,"utf8"),n=Math.max(0,65536-r),s=Buffer.from(t,"utf8"),o=n;for(;o>0&&(s[o]&192)===128;)o-=1;return`${s.subarray(0,o).toString("utf8")}${vp}`}var vp,Ip=b(()=>{"use strict";vp=`
|
|
889
|
-
...[truncated]`});function ss(t,e){return JSON.stringify([t,e])}function Np(t){try{let e=JSON.parse(t);return typeof e.lock_id!="string"||typeof e.teamfile!="string"||typeof e.alias!="string"||typeof e.holder_pid!="number"||typeof e.holder_host!="string"||!Array.isArray(e.holder_ips)||!e.holder_ips.every(r=>typeof r=="string")||typeof e.started_at!="string"||typeof e.last_heartbeat!="string"?null:{lock_id:e.lock_id,teamfile:e.teamfile,alias:e.alias,holder_pid:e.holder_pid,holder_host:e.holder_host,holder_ips:e.holder_ips,started_at:e.started_at,last_heartbeat:e.last_heartbeat}}catch{return null}}var rs,ns,
|
|
890
|
-
`)}var
|
|
889
|
+
...[truncated]`});function ss(t,e){return JSON.stringify([t,e])}function Np(t){try{let e=JSON.parse(t);return typeof e.lock_id!="string"||typeof e.teamfile!="string"||typeof e.alias!="string"||typeof e.holder_pid!="number"||typeof e.holder_host!="string"||!Array.isArray(e.holder_ips)||!e.holder_ips.every(r=>typeof r=="string")||typeof e.started_at!="string"||typeof e.last_heartbeat!="string"?null:{lock_id:e.lock_id,teamfile:e.teamfile,alias:e.alias,holder_pid:e.holder_pid,holder_host:e.holder_host,holder_ips:e.holder_ips,started_at:e.started_at,last_heartbeat:e.last_heartbeat}}catch{return null}}var rs,ns,Ap=b(()=>{"use strict";rs="terminal_lock",ns="member"});function Zr(t){return typeof t=="string"&&$N.has(t)}function Lp(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: ${No[0]}`,` STANCE: ${No[1]}`,` STANCE: ${No[2]}`,` STANCE: ${xp}: <one short sentence: why no declared outcome fits>`,"Never invent a different outcome; never leave the STANCE line out."].join(`
|
|
890
|
+
`)}var xp,No,$N,os,Rp,Gl,Ao,is=b(()=>{"use strict";xp="other",No=["not_enough_information","dont_know","other_work"],$N=new Set([xp,...No]),os="@abort",Rp="invalid_decision",Gl="escalation_aborted",Ao="workflow_escalation"});import{randomUUID as $p}from"node:crypto";import{hostname as as}from"node:os";function xe(t){return t.provider_resolved??t.provider}function M(){return new Date().toISOString()}function he(t){return new Kl(Hl({dbPath:t.path}))}function Op(t,e,r){let n=jp(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 jp(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 jp(t){let e=ON(t),r=e===null?null:jN(e,"states");if(r===null)return[];let n=[];for(let s of Object.values(r))xo(s)&&s.type==="Subflow"&&typeof s.workflow_name=="string"&&s.workflow_name.length>0&&n.push(s.workflow_name);return n}function ON(t){try{let e=JSON.parse(t);return xo(e)?e:null}catch{return null}}function jN(t,e){let r=t[e];return xo(r)?r:null}function xo(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function CN(t){try{let e=JSON.parse(t);return!xo(e)||typeof e.lock_id!="string"||typeof e.holder_pid!="number"||typeof e.holder_host!="string"||typeof e.started_at!="string"||typeof e.last_heartbeat!="string"?null:{lock_id:e.lock_id,holder_pid:e.holder_pid,holder_host:e.holder_host,started_at:e.started_at,last_heartbeat:e.last_heartbeat}}catch{return null}}function MN(t,e){return t===null?!0:t.holder_host===as()?!rr(t.holder_pid):t.last_heartbeat<e}function DN(t,e){return t.delivering_at===null?!1:t.delivery_holder_host===as()&&PN(t.delivery_holder_pid)?!rr(t.delivery_holder_pid):t.delivering_at<e}function PN(t){return Number.isInteger(t)&&(t??0)>0}function FN(t){return{...kp(t),getRuntimeState:t.prepare("SELECT * FROM runtime_state WHERE scope = ? AND key = ? AND kind = ?"),upsertRuntimeState:t.prepare(`
|
|
891
891
|
INSERT INTO runtime_state (scope, key, kind, data, updated_at)
|
|
892
892
|
VALUES (?, ?, ?, ?, ?)
|
|
893
893
|
ON CONFLICT(scope, key, kind) DO UPDATE SET
|
|
@@ -1287,61 +1287,61 @@ var uI=Object.defineProperty;var b=(t,e)=>()=>(t&&(e=t(t=0)),e);var se=(t,e)=>{f
|
|
|
1287
1287
|
error_detail = ?,
|
|
1288
1288
|
truncated = ?
|
|
1289
1289
|
WHERE id = ?
|
|
1290
|
-
`),...bp(t),...wp(t)}}function UN(t,e){return e===void 0?{resumed:!1,reason:t}:{resumed:!1,reason:t,valid:e}}var Kl,Me=b(()=>{"use strict";Jl();Ep();Sp();Ip();xp();vo();is();Kl=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;recvMailboxMessagesTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=FN(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)=>UN("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!==xo)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!==os&&!a.includes(n))return{resumed:!1,reason:Rp};let c={};if(l.pending_escalation_decision!==null)try{let u=JSON.parse(l.pending_escalation_decision);u!==null&&typeof u=="object"&&!Array.isArray(u)&&(c=u)}catch{c={}}return c[i]=n,this.stmts.setRunPendingEscalationDecision.run(JSON.stringify(c),l.id),this.stmts.resumeRunState.run(i,l.id),this.stmts.requeuePausedJob.run(s,l.job_id),this.stmts.ackAttention.run(s,r),{resumed:!0,run:this.getRun(l.id),job:this.getJob(l.job_id)}}),this.tryAcquireAgentInflightTxn=(r,n={})=>{this.db.exec("BEGIN IMMEDIATE");try{let s=n.reclaim_observed,o=this.stmts.acquireAgentInflight.get({...r,holder_pid:process.pid,stale_before:n.stale_before??null,force:n.force===!0?1:0,reclaim_observed_sender_teamfile:s?.sender_teamfile??null,reclaim_observed_sender_alias:s?.sender_alias??null,reclaim_observed_started_at:s?.started_at??null,reclaim_observed_holder_pid:typeof s?.holder_pid=="number"?s.holder_pid:null}),i=o!==void 0?{acquired:!0,current:o}:{acquired:!1,current:this.getAgentInflight(r.receiver_teamfile,r.receiver_alias)??(()=>{throw new Error("agent_inflight conflict row disappeared during acquire")})()};return this.db.exec("COMMIT"),i}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}},this.recvMailboxMessagesTxn=e.transaction((r,n)=>{let s=this.stmts.listAllMailboxMessagesForReceiver.all(r,n);for(let o of s)this.stmts.deleteMailboxMessage.run(o.id);return 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){Op(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,C()),n=this.getWorkflow(Number(r.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(n.id,n.version,e.definition,e.author??null,C());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){Op(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,C());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,C())}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,C());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,C()),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,C(),e),this.stmts.getTriggerInstance.get(e)??null}setTriggerFailure(e,r){return this.stmts.setTriggerFailure.run(C(),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,C());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,C());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,C(),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,C());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",C());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,C());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=C(),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,C(),e)??null}claimIssue(e,r){return this.stmts.claimIssue.get(r,C(),e)??null}closeIssue(e,r,n){let s=C(),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,C(),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,C(),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=C();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,C(),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,C(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}createChatbotSession(e,r){let n=$p(),s=C();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=C(),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,C())}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??C(),e.dedupe_key??null,e.concurrency_key??null,C());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=C(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimTxn(e.worker_id,n,r)}claimNextJobWithConcurrency(e){let r=C(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimWithConcurrencyTxn(e.worker_id,n,r,e.evaluator)}claimJobByIdWithConcurrency(e){let r=C(),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:C();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,C()),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,C()),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??C(),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,C());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=C(),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,C(),e.id),this.getWebProject(e.id))}softDeleteWebProject(e){return this.stmts.softDeleteWebProject.run(C(),e).changes===1}loadMailboxCursor(e,r){return this.stmts.loadMailboxCursor.get(e,r)??null}saveMailboxCursor(e){this.stmts.saveMailboxCursor.run(e.user_id,e.mailbox_key,e.last_processed_version_id,e.last_processed_seq??null,e.last_processed_at)}addUsage(e){this.stmts.addUsage.run(e.user_id,e.device_id,e.period,e.put,e.get,e.list,e.updated_at)}loadUsage(e,r,n){return this.stmts.loadUsage.get(e,r,n)??null}sumUsageForPeriod(e,r){let n=this.stmts.sumUsageForPeriod.get(e,r);return{put:n?.put??0,get:n?.get??0,list:n?.list??0}}upsertRootTeam(e){this.stmts.upsertRootTeam.run(e.teamfile_path,e.name,e.raw_text,e.raw_sha256,e.registered_at,e.last_seeded_at)}getRootTeam(e){return this.stmts.getRootTeam.get(e)??null}listRootTeams(){return this.stmts.listRootTeams.all()}insertTeamChatLog(e){let r=this.stmts.insertTeamChatLog.run(e.root_teamfile,e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias,e.message,e.response,e.origin,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)}startTrackedInvocation(e){let r=e.started_at??C(),n=e.holder_host??as(),s=e.last_heartbeat_at??r,o=this.stmts.insertTrackedInvocation.run(e.kind,e.origin,e.scope_teamfile??null,e.from_identity,e.target_teamfile??null,e.target_alias??null,e.root_teamfile??null,e.cwd??null,Pt(e.command),r,e.holder_pid??null,n,s,Pt(e.meta));return this.getTrackedInvocation(Number(o.lastInsertRowid))}getTrackedInvocation(e){return this.stmts.getTrackedInvocation.get(e)??null}listAllRunningTrackedInvocations(){return this.stmts.listAllRunningTrackedInvocations.all()}finishTrackedInvocation(e,r){let n=r.ended_at??C();return this.stmts.finishTrackedInvocation.run(r.status,n,r.exit_code??null,r.signal??null,Pt(r.result_summary),Pt(r.error),r.team_chat_log_id??null,Pt(r.meta),n,e).changes!==1?null:this.getTrackedInvocation(e)}reclaimTrackedInvocationIfUnchanged(e,r,n){let s=n.ended_at??C();return this.stmts.reclaimTrackedInvocationIfUnchanged.run(n.status,s,n.exit_code??null,n.signal??null,Pt(n.result_summary),Pt(n.error),n.team_chat_log_id??null,Pt(n.meta),s,e,r.holder_pid,r.holder_host,r.started_at,r.last_heartbeat_at).changes!==1?null:this.getTrackedInvocation(e)}heartbeatTrackedInvocation(e,r=C()){return this.stmts.heartbeatTrackedInvocation.run(r,e).changes!==1?null:this.getTrackedInvocation(e)}listClaimableTerminalTrackedInvocations(e){let r=["status IN ('done', 'error', 'busy', 'cancelled')","ended_at IS NOT NULL","notified_by IS NULL"],n=[];e.from!==void 0&&(r.push("from_identity = ?"),n.push(e.from)),e.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(e.scope_teamfile));let s=Math.max(1,Math.min(1e3,Math.trunc(e.limit??100)));return n.push(s),this.db.prepare(`SELECT * FROM tracked_invocation WHERE ${r.join(" AND ")} ORDER BY ended_at ASC, id ASC LIMIT ?`).all(...n)}claimTrackedInvocationNotification(e,r,n=C()){return this.stmts.claimTrackedInvocationNotification.run(r,n,e).changes!==1?null:this.getTrackedInvocation(e)}listTrackedInvocations(e={}){let r=[],n=[];e.from!==void 0&&(r.push("from_identity = ?"),n.push(e.from)),e.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(e.scope_teamfile)),e.status!==void 0&&(r.push("status = ?"),n.push(e.status)),e.kind!==void 0&&(r.push("kind = ?"),n.push(e.kind)),e.origin!==void 0&&(r.push("origin = ?"),n.push(e.origin));let s=Math.max(1,Math.min(1e3,Math.trunc(e.limit??100)));n.push(s);let o=r.length===0?"":` WHERE ${r.join(" AND ")}`;return this.db.prepare(`SELECT * FROM tracked_invocation${o} ORDER BY started_at DESC, id DESC LIMIT ?`).all(...n)}maxTrackedInvocationId(e={}){let r=[],n=[];e.from!==void 0&&(r.push("from_identity = ?"),n.push(e.from)),e.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(e.scope_teamfile));let s=r.length===0?"":` WHERE ${r.join(" AND ")}`,o=this.db.prepare(`SELECT COALESCE(MAX(id), 0) AS max_id FROM tracked_invocation${s}`).get(...n);return Number(o?.max_id??0)}listRunningTrackedInvocations(e={}){return this.listTrackedInvocations({...e,status:"running"})}enqueueMail(e){return this.sendMailboxMessage(e)}sendMailboxMessage(e){let r=this.stmts.insertMailboxMessage.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile??null,e.sender_alias??null,e.root_teamfile??null,Xl(e.payload),e.created_at??C(),e.remote_transport??null,e.remote_message_id??null,e.remote_thread_id??null,e.meta??null);return this.getMailboxMessage(Number(r.lastInsertRowid))}listEnqueuedMailFromSender(e,r,n,s){return this.stmts.listEnqueuedMailFromSender.all(e,r,n,s)}markMailDelivered(e,r,n){let s=[...new Set(e.map(i=>Math.trunc(i)).filter(i=>Number.isInteger(i)&&i>0))];if(s.length===0)return 0;let o=Xl(r);this.db.exec("BEGIN IMMEDIATE");try{let i=0;for(let a of s)i+=this.stmts.markMailboxMessageDelivered.run(n,o,a).changes;return this.db.exec("COMMIT"),i}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}claimMailForDelivery(e,r,n=process.pid,s=as()){let o=[...new Set(e.map(i=>Math.trunc(i)).filter(i=>Number.isInteger(i)&&i>0))];if(o.length===0)return[];this.db.exec("BEGIN IMMEDIATE");try{let i=[];for(let a of o)if(this.stmts.claimMailboxMessageDelivery.run(r,n,s,a).changes===1){let c=this.getMailboxMessage(a);c!==null&&i.push(c)}return this.db.exec("COMMIT"),i}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}clearMailDelivery(e){let r=[...new Set(e.map(n=>Math.trunc(n)).filter(n=>Number.isInteger(n)&&n>0))];if(r.length===0)return 0;this.db.exec("BEGIN IMMEDIATE");try{let n=0;for(let s of r)n+=this.stmts.clearMailboxMessageDelivery.run(s).changes;return this.db.exec("COMMIT"),n}catch(n){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),n}}reclaimMailboxDeliveryIfUnchanged(e){return this.stmts.clearMailboxMessageDeliveryIfUnchanged.run(e.id,e.delivering_at,e.delivery_holder_pid,e.delivery_holder_host).changes!==1?null:this.getMailboxMessage(e.id)}reclaimStaleMailboxDeliveries(e){let r=this.stmts.listInFlightMailboxDeliveries.all(),n=[];this.db.exec("BEGIN IMMEDIATE");try{for(let s of r){if(!DN(s,e))continue;let o=this.reclaimMailboxDeliveryIfUnchanged(s);o!==null&&n.push(o)}return this.db.exec("COMMIT"),n}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}listDeliveredReceiptsForSender(e,r){return this.stmts.listDeliveredReceiptsForSender.all(e,r)}listOutboundPendingForSender(e,r){return this.stmts.listOutboundPendingForSender.all(e,r)}getMailboxMessage(e){return this.stmts.getMailboxMessage.get(e)??null}peekMailboxMessages(e,r=1e3){return this.stmts.listMailboxMessagesForReceiver.all(e.receiver_teamfile,e.receiver_alias,Math.max(1,Math.min(1e3,Math.trunc(r))))}recvMailboxMessages(e){return this.recvMailboxMessagesTxn(e.receiver_teamfile,e.receiver_alias)}updateTeamChatLogResponse(e,r){this.stmts.updateTeamChatLogResponse.run(r.response,r.status,r.error_detail,r.truncated,e)}getAgentInflight(e,r){return this.stmts.getAgentInflight.get(e,r)??null}listAgentInflight(){return this.stmts.listAgentInflight.all()}tryAcquireAgentInflight(e,r){return this.tryAcquireAgentInflightTxn(e,r)}clearAgentInflight(e,r){this.stmts.clearAgentInflight.run(e,r)}clearObservedTerminalAgentInflight(e,r,n){return this.stmts.clearObservedTerminalAgentInflight.run({receiver_teamfile:e,receiver_alias:r,observed_sender_teamfile:n.sender_teamfile,observed_sender_alias:n.sender_alias,observed_started_at:n.started_at,observed_holder_pid:n.holder_pid}).changes===1}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}getTerminalLock(e,r){let n=this.stmts.getRuntimeState.get(rs,ss(e,r),ns);return n===void 0?null:Np(n.data)}setTerminalLock(e){this.stmts.upsertRuntimeState.run(rs,ss(e.teamfile,e.alias),ns,JSON.stringify(e),e.last_heartbeat)}heartbeatTerminalLock(e,r,n,s){this.db.exec("BEGIN IMMEDIATE");try{let o=this.getTerminalLock(e,r);if(o===null||o.lock_id!==n)return this.db.exec("COMMIT"),!1;let i={...o,last_heartbeat:s};return this.stmts.upsertRuntimeState.run(rs,ss(e,r),ns,JSON.stringify(i),s),this.db.exec("COMMIT"),!0}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}clearTerminalLock(e,r,n){this.db.exec("BEGIN IMMEDIATE");try{let s=this.getTerminalLock(e,r);if(s===null||s.lock_id!==n)return this.db.exec("COMMIT"),!1;let o=this.stmts.deleteRuntimeState.run(rs,ss(e,r),ns);return this.db.exec("COMMIT"),o.changes===1}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}getRuntimeProcessLock(e,r,n){let s=this.stmts.getRuntimeState.get(e,r,n);return s===void 0?null:CN(s.data)}tryAcquireRuntimeProcessLock(e,r,n,s,o=C()){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getRuntimeProcessLock(e,r,n);if(i!==null&&!MN(i,s))return this.db.exec("COMMIT"),{acquired:!1,current:i};let a={lock_id:$p(),holder_pid:process.pid,holder_host:as(),started_at:o,last_heartbeat:o};return this.stmts.upsertRuntimeState.run(e,r,n,JSON.stringify(a),o),this.db.exec("COMMIT"),{acquired:!0,lock:a,previous:i}}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}clearRuntimeProcessLock(e,r,n,s){this.db.exec("BEGIN IMMEDIATE");try{let o=this.getRuntimeProcessLock(e,r,n);if(o===null||o.lock_id!==s)return this.db.exec("COMMIT"),!1;let i=this.stmts.deleteRuntimeState.run(e,r,n);return this.db.exec("COMMIT"),i.changes===1}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}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,C(),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,C())}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,C());return this.stmts.getStep.get(r.lastInsertRowid)}finishStep(e,r,n){return this.stmts.finishStep.run(r??null,n??null,C(),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??C(),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,C());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,C()).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,C()),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,C());return this.stmts.getAttention.get(r.lastInsertRowid)}acknowledgeAttention(e){return this.stmts.ackAttention.run(C(),e),this.stmts.getAttention.get(e)??null}upsertDurableMemory(e){let r=C();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??C());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,C())}resumeEscalation(e,r){return this.resumeEscalationTxn(e,r,C())}}});async function R(t,e){if(t.dal!==void 0)return e(t.dal);let r=he({path:le()});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 L(t,e){let r=t.flags[e];return typeof r=="string"?r:void 0}function M(t,e){return t.flags[e]===!0}function F(t,e){t.stdout.write(`${JSON.stringify(e,null,2)}
|
|
1290
|
+
`),...bp(t),...wp(t)}}function UN(t,e){return e===void 0?{resumed:!1,reason:t}:{resumed:!1,reason:t,valid:e}}var Kl,Be=b(()=>{"use strict";Jl();Ep();Sp();Ip();Ap();vo();is();Kl=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;recvMailboxMessagesTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=FN(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)=>UN("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!==Ao)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!==os&&!a.includes(n))return{resumed:!1,reason:Rp};let c={};if(l.pending_escalation_decision!==null)try{let u=JSON.parse(l.pending_escalation_decision);u!==null&&typeof u=="object"&&!Array.isArray(u)&&(c=u)}catch{c={}}return c[i]=n,this.stmts.setRunPendingEscalationDecision.run(JSON.stringify(c),l.id),this.stmts.resumeRunState.run(i,l.id),this.stmts.requeuePausedJob.run(s,l.job_id),this.stmts.ackAttention.run(s,r),{resumed:!0,run:this.getRun(l.id),job:this.getJob(l.job_id)}}),this.tryAcquireAgentInflightTxn=(r,n={})=>{this.db.exec("BEGIN IMMEDIATE");try{let s=n.reclaim_observed,o=this.stmts.acquireAgentInflight.get({...r,holder_pid:process.pid,stale_before:n.stale_before??null,force:n.force===!0?1:0,reclaim_observed_sender_teamfile:s?.sender_teamfile??null,reclaim_observed_sender_alias:s?.sender_alias??null,reclaim_observed_started_at:s?.started_at??null,reclaim_observed_holder_pid:typeof s?.holder_pid=="number"?s.holder_pid:null}),i=o!==void 0?{acquired:!0,current:o}:{acquired:!1,current:this.getAgentInflight(r.receiver_teamfile,r.receiver_alias)??(()=>{throw new Error("agent_inflight conflict row disappeared during acquire")})()};return this.db.exec("COMMIT"),i}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}},this.recvMailboxMessagesTxn=e.transaction((r,n)=>{let s=this.stmts.listAllMailboxMessagesForReceiver.all(r,n);for(let o of s)this.stmts.deleteMailboxMessage.run(o.id);return 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){Op(e.name,e.definition,i=>this.getWorkflowByName(i));let r=this.stmts.insertWorkflow.run(e.name,e.version??1,e.definition_schema_version??1,e.definition,M()),n=this.getWorkflow(Number(r.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(n.id,n.version,e.definition,e.author??null,M());this.stmts.updateWorkflowActiveVersion.run(s.lastInsertRowid,n.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,n.id);let o=this.getWorkflow(n.id);return this.syncWorkflowTriggers(n.id,e.definition),o}upsertWorkflow(e){Op(e.name,e.definition,i=>this.getWorkflowByName(i));let r=this.getWorkflowByName(e.name);if(r===null)return this.insertWorkflow({name:e.name,definition_schema_version:e.definition_schema_version,definition:e.definition,author:e.author,source_uri:e.source_uri,source_sha256:e.source_sha256});let s=(this.stmts.getLatestWorkflowVersion.get(r.id)?.version??r.version)+1,o=this.stmts.insertWorkflowVersion.run(r.id,s,e.definition,e.author??null,M());return this.stmts.updateWorkflowActiveVersionDefinitionAndVersion.run(Number(o.lastInsertRowid),e.definition,e.definition_schema_version??r.definition_schema_version,s,r.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,r.id),this.syncWorkflowTriggers(r.id,e.definition),this.getWorkflow(r.id)}insertCompositionUnit(e){this.stmts.insertCompositionUnit.run(e.name,e.version,e.lang,e.source,e.source_sha,e.compiled_workflow_version_id,M())}getWorkflow(e){return this.stmts.getWorkflow.get(e)??null}getWorkflowByName(e,r){return(r===void 0?this.stmts.findWorkflowLatest.get(e):this.stmts.findWorkflowVersion.get(e,r))??null}findWorkflowByName(e,r){return this.getWorkflowByName(e,r)}insertWorkflowVersion(e,r,n){let o=(this.stmts.getLatestWorkflowVersion.get(e)?.version??0)+1,i=this.stmts.insertWorkflowVersion.run(e,o,r,n??null,M());return this.stmts.getWorkflowVersion.get(i.lastInsertRowid)}activateWorkflowVersion(e,r){let n=this.getWorkflowVersionById(r);if(n===null||n.workflow_id!==e)return null;let s=1;try{let o=JSON.parse(n.definition);typeof o.definition_schema_version=="number"&&(s=o.definition_schema_version)}catch{}return this.stmts.updateWorkflowActiveVersionAndDefinition.run(r,n.definition,s,e),this.syncWorkflowTriggers(e,n.definition),this.getWorkflow(e)}getWorkflowVersionById(e){return this.stmts.getWorkflowVersion.get(e)??null}listWorkflowVersions(e){return this.stmts.listWorkflowVersions.all(e)}upsertTriggerInstance(e){return this.stmts.upsertTriggerInstance.run(e.workflow_id,e.trigger_id,e.trigger_type,e.parameters,e.enabled===!1?0:1,M()),this.stmts.getTriggerInstanceByWorkflowAndId.get(e.workflow_id,e.trigger_id)}listTriggerInstancesForWorkflow(e){return this.stmts.listTriggerInstancesForWorkflow.all(e)}listEnabledTriggerInstances(){return this.stmts.listEnabledTriggerInstances.all()}setTriggerCursor(e,r){return this.stmts.setTriggerCursor.run(r,M(),e),this.stmts.getTriggerInstance.get(e)??null}setTriggerFailure(e,r){return this.stmts.setTriggerFailure.run(M(),r,e),this.stmts.getTriggerInstance.get(e)??null}syncWorkflowTriggers(e,r){let n;try{n=JSON.parse(r)}catch{return}if(n===null||typeof n!="object"||Array.isArray(n))return;let s=n.triggers;if(Array.isArray(s))for(let o of s){if(o===null||typeof o!="object"||Array.isArray(o))continue;let i=o;typeof i.id!="string"||i.id.length===0||typeof i.type!="string"||i.type.length===0||this.upsertTriggerInstance({workflow_id:e,trigger_id:i.id,trigger_type:i.type,parameters:JSON.stringify(i.parameters??{})})}}insertTeam(e){let r=this.stmts.insertTeam.run(e.name,M());return this.stmts.getTeam.get(r.lastInsertRowid)}getTeam(e){return this.stmts.getTeam.get(e)??null}findTeamByName(e){return this.stmts.findTeamByName.get(e)??null}listTeams(){return this.stmts.listTeams.all()}insertTeamMember(e){let r=this.stmts.insertTeamMember.run(e.team_id,e.alias,e.role??"agent",e.provider,e.model??null,e.sessionid??null,e.sessiondir,M());return this.stmts.getTeamMember.get(r.lastInsertRowid)}listTeamMembers(e){return this.stmts.listTeamMembers.all(e)}findTeamMemberByAlias(e,r){return this.stmts.findTeamMemberByAlias.get(e,r)??null}updateTeamMemberSession(e,r){return this.stmts.updateTeamMemberSession.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberState(e,r,n){return this.stmts.setMemberState.run(r,n??null,M(),e),this.stmts.getTeamMember.get(e)??null}listMembersInState(e){return this.stmts.listMembersInState.all(e)}setMemberPromptSnapshot(e,r){return this.stmts.setMemberPromptSnapshot.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberProviderResolved(e,r){return this.stmts.setMemberProviderResolved.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberRolePrompt(e,r){return this.stmts.setMemberRolePrompt.run(r,e),this.stmts.getTeamMember.get(e)??null}updateTeamMemberMeta(e,r){let n=this.stmts.getTeamMember.get(e);if(n===void 0)return null;let s=Object.prototype.hasOwnProperty.call(r,"role_prompt"),o=Object.prototype.hasOwnProperty.call(r,"model"),i=Object.prototype.hasOwnProperty.call(r,"provider");return this.stmts.updateTeamMemberMeta.run(s?r.role_prompt??null:n.role_prompt,o?r.model??null:n.model,i?r.provider??n.provider:n.provider,e),this.stmts.getTeamMember.get(e)??null}insertTeamMemberCompanion(e){let r=this.stmts.insertTeamMemberCompanion.run(e.interpreter_id,e.companion_id,M());return this.stmts.getTeamMemberCompanion.get(r.lastInsertRowid)}insertProject(e){let r=this.stmts.insertProject.run(e.name,e.description??null,e.local_path,e.workflow_name,e.team_id,e.default_branch??null,e.intake_config??null,e.test_argv??null,e.test_command??null,e.durable_memory_mode??"folder",M());return this.stmts.getProject.get(r.lastInsertRowid)}listProjects(){return this.stmts.listProjects.all()}getProject(e){return this.stmts.getProject.get(e)??null}findProjectByName(e){return this.stmts.findProjectByName.get(e)??null}setProjectIntakeConfig(e,r){return this.stmts.setProjectIntakeConfig.run(r,e),this.stmts.getProject.get(e)??null}updateProjectSettings(e,r){let n=this.stmts.getProject.get(e);if(n===void 0)return null;let s=Object.prototype.hasOwnProperty.call(r,"local_path"),o=Object.prototype.hasOwnProperty.call(r,"durable_memory_mode"),i=Object.prototype.hasOwnProperty.call(r,"default_branch"),a=Object.prototype.hasOwnProperty.call(r,"intake_config");return this.stmts.updateProjectSettings.run(s?r.local_path:n.local_path,o?r.durable_memory_mode:n.durable_memory_mode,i?r.default_branch??null:n.default_branch,a?r.intake_config??null:n.intake_config,e),this.stmts.getProject.get(e)??null}listProjectsWithIntakeEnabled(){return this.stmts.listProjectsWithIntakeConfig.all().filter(e=>{if(e.intake_config===null)return!1;try{let r=JSON.parse(e.intake_config);return typeof r=="object"&&r!==null&&!Array.isArray(r)&&r.scan_github_issues===!0}catch{return!1}})}getProjectByJob(e){return this.stmts.getProjectByJob.get(e)??null}insertProjectWorkflow(e){let r=e.condition??null,n=this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,r);if(n!==void 0)return n;let s=this.stmts.insertProjectWorkflow.run(e.project_id,e.workflow_id,r,e.parameters_override??null,e.enabled===!1?0:1,e.priority??100,M());return s.changes===1?this.stmts.getProjectWorkflow.get(s.lastInsertRowid):this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,r)}getProjectWorkflow(e){return this.stmts.getProjectWorkflow.get(e)??null}listProjectWorkflows(e,r={}){return r.enabled_only===!0?this.stmts.listEnabledProjectWorkflows.all(e):this.stmts.listProjectWorkflows.all(e)}removeProjectWorkflow(e){return this.stmts.removeProjectWorkflow.run(e).changes>0}setProjectWorkflowEnabled(e,r){return this.stmts.setProjectWorkflowEnabled.run(r?1:0,e),this.getProjectWorkflow(e)}createIssue(e){let r=M(),n=this.stmts.createIssue.run(e.project_id,e.title,e.body,e.severity??"medium",e.labels??null,e.ai_test_path??null,e.source_run_id??null,r,r);return this.stmts.getIssue.get(n.lastInsertRowid)}getIssue(e){return this.stmts.getIssue.get(e)??null}listIssues(e,r={}){return this.stmts.listIssuesForProject.all(e).filter(n=>!(r.status!==void 0&&!r.status.includes(n.status)||r.severity!==void 0&&!r.severity.includes(n.severity)||r.ai_test_path!==void 0&&n.ai_test_path!==r.ai_test_path))}claimNextIssue(e,r){return this.stmts.claimNextIssue.get(r,M(),e)??null}claimIssue(e,r){return this.stmts.claimIssue.get(r,M(),e)??null}closeIssue(e,r,n){let s=M(),o=this.stmts.closeIssue.get(r,n??null,s,s,e);if(o===void 0)throw new Error(`issue not found: ${e}`);return o}reopenIssue(e,r){let n=this.stmts.reopenIssue.get(r,M(),e);if(n===void 0)throw this.getIssue(e)===null?new Error(`issue not found: ${e}`):new Error(`issue ${e} is not closed`);return n}updateIssue(e,r){let n=this.getIssue(e);if(n===null)throw new Error(`issue not found: ${e}`);let s=Object.prototype.hasOwnProperty.call(r,"labels"),o=Object.prototype.hasOwnProperty.call(r,"ai_test_path"),i=this.stmts.updateIssue.get(r.title??n.title,r.body??n.body,r.severity??n.severity,s?r.labels??null:n.labels,o?r.ai_test_path??null:n.ai_test_path,M(),e);if(i===void 0)throw new Error(`issue not found: ${e}`);return i}listWorkflows(){return this.stmts.listWorkflows.all()}getOrCreateWebuiSession(e,r){let n=this.stmts.getWebuiSession.get(e);if(n!==void 0)return n;let s=M();return this.stmts.insertWebuiSession.run(e,r,"N1",null,null,null,null,"authenticated",s,s),this.stmts.getWebuiSession.get(e)}getWebuiSession(e){return this.stmts.getWebuiSession.get(e)??null}updateWebuiSessionTransition(e,r,n,s,o){if(this.stmts.updateWebuiSessionTransition.run(r,n,s,o,M(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}setWebuiSessionChatbot(e,r){if(this.stmts.setWebuiSessionChatbot.run(r,M(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}createChatbotSession(e,r){let n=$p(),s=M();return this.stmts.insertChatbotSession.run(n,e,r??null,s,s,"active"),this.stmts.getChatbotSession.get(n)}getChatbotSession(e){return this.stmts.getChatbotSession.get(e)??null}listChatbotSessions(e){return this.stmts.listChatbotSessionsForUser.all(e)}appendChatbotMessage(e,r,n,s){let o=M(),i=this.stmts.insertChatbotMessage.run(e,r,n,s??null,o);return this.stmts.touchChatbotSession.run(o,e),this.stmts.getChatbotMessage.get(i.lastInsertRowid)}listChatbotMessages(e){return this.stmts.listChatbotMessages.all(e)}getConfig(e){return this.stmts.getConfig.get(e)?.value??null}setConfig(e,r){this.stmts.upsertConfig.run(e,r,M())}getConfigAll(){let e=this.stmts.listConfig.all(),r={};for(let n of e)r[n.key]=n.value;return r}enqueueJob(e){let r=this.stmts.insertJob.run(e.project_id,e.workflow_id_override??null,e.source,e.source_ref??null,e.payload??null,e.priority??0,e.available_at??M(),e.dedupe_key??null,e.concurrency_key??null,M());if(r.changes===1)return this.stmts.getJob.get(r.lastInsertRowid);if(e.dedupe_key===void 0||e.dedupe_key===null)throw new Error("job insert ignored without dedupe key");return this.stmts.findJobByDedupe.get(e.source,e.dedupe_key)}claimNextJob(e){let r=M(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimTxn(e.worker_id,n,r)}claimNextJobWithConcurrency(e){let r=M(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimWithConcurrencyTxn(e.worker_id,n,r,e.evaluator)}claimJobByIdWithConcurrency(e){let r=M(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimByIdWithConcurrencyTxn(e.job_id,e.worker_id,n,r,e.evaluator)}releaseJob(e,r,n){let s=r==="queued"||r==="running"?null:M();return this.stmts.releaseJob.run(r,n??null,s,e),this.getJob(e)}getJob(e){return this.stmts.getJob.get(e)??null}findJobBySourceAndDedupe(e,r){return this.stmts.findJobByDedupe.get(e,r)??null}insertRun(e){let r=this.getWorkflow(e.workflow_id);if(r===null)throw new Error(`workflow not found: ${e.workflow_id}`);let n=this.stmts.insertRun.run(e.job_id,e.workflow_id,e.team_id,e.current_state??null,r.active_version_id,e.parent_run_id??null,M()),s=this.stmts.getRun.get(n.lastInsertRowid);return(e.parent_run_id===void 0||e.parent_run_id===null)&&this.stmts.setJobRun.run(s.id,e.job_id),s}setJobRun(e,r){return this.stmts.setJobRun.run(r,e),this.getJob(e)}insertPromptDispatch(e){return this.stmts.insertPromptDispatch.run(e.prompt_id,e.project_id,e.job_id,e.text,e.context_json??null,M()),this.stmts.getPromptDispatch.get(e.prompt_id)}getPromptDispatch(e){return this.stmts.getPromptDispatch.get(e)??null}setPromptDispatchCompleted(e,r){return this.stmts.setPromptDispatchCompleted.run(r??M(),e),this.getPromptDispatch(e)}getWorkspace(e){return this.stmts.getWorkspace.get(e)??null}ensureWorkspace(e={}){let r=e.id??"default";this.stmts.ensureWorkspace.run(r,e.name??"Default workspace",e.idleThresholdMs??6e5,M());let n=this.getWorkspace(r);if(n===null)throw new Error(`workspace ${r} missing after upsert`);return n}listWebProjectsActive(e){return this.stmts.listWebProjectsActive.all(e)}getWebProject(e){return this.stmts.getWebProject.get(e)??null}insertWebProject(e){let r=M(),n=this.stmts.insertWebProject.run(e.workspace_id,e.name,e.repo_path,e.config_json??null,e.linked_v4_project_id??null,r,r),s=Number(n.lastInsertRowid),o=this.getWebProject(s);if(o===null)throw new Error(`web_project ${s} missing after insert`);return o}updateWebProject(e){let r=this.getWebProject(e.id);return r===null||r.deleted_at!==null?null:(this.stmts.updateWebProject.run(e.name??r.name,e.config_json===void 0?r.config_json:e.config_json,M(),e.id),this.getWebProject(e.id))}softDeleteWebProject(e){return this.stmts.softDeleteWebProject.run(M(),e).changes===1}loadMailboxCursor(e,r){return this.stmts.loadMailboxCursor.get(e,r)??null}saveMailboxCursor(e){this.stmts.saveMailboxCursor.run(e.user_id,e.mailbox_key,e.last_processed_version_id,e.last_processed_seq??null,e.last_processed_at)}addUsage(e){this.stmts.addUsage.run(e.user_id,e.device_id,e.period,e.put,e.get,e.list,e.updated_at)}loadUsage(e,r,n){return this.stmts.loadUsage.get(e,r,n)??null}sumUsageForPeriod(e,r){let n=this.stmts.sumUsageForPeriod.get(e,r);return{put:n?.put??0,get:n?.get??0,list:n?.list??0}}upsertRootTeam(e){this.stmts.upsertRootTeam.run(e.teamfile_path,e.name,e.raw_text,e.raw_sha256,e.registered_at,e.last_seeded_at)}getRootTeam(e){return this.stmts.getRootTeam.get(e)??null}listRootTeams(){return this.stmts.listRootTeams.all()}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.origin,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)}startTrackedInvocation(e){let r=e.started_at??M(),n=e.holder_host??as(),s=e.last_heartbeat_at??r,o=this.stmts.insertTrackedInvocation.run(e.kind,e.origin,e.scope_teamfile??null,e.from_identity,e.target_teamfile??null,e.target_alias??null,e.root_teamfile??null,e.cwd??null,Pt(e.command),r,e.holder_pid??null,n,s,Pt(e.meta));return this.getTrackedInvocation(Number(o.lastInsertRowid))}getTrackedInvocation(e){return this.stmts.getTrackedInvocation.get(e)??null}listAllRunningTrackedInvocations(){return this.stmts.listAllRunningTrackedInvocations.all()}finishTrackedInvocation(e,r){let n=r.ended_at??M();return this.stmts.finishTrackedInvocation.run(r.status,n,r.exit_code??null,r.signal??null,Pt(r.result_summary),Pt(r.error),r.team_chat_log_id??null,Pt(r.meta),n,e).changes!==1?null:this.getTrackedInvocation(e)}reclaimTrackedInvocationIfUnchanged(e,r,n){let s=n.ended_at??M();return this.stmts.reclaimTrackedInvocationIfUnchanged.run(n.status,s,n.exit_code??null,n.signal??null,Pt(n.result_summary),Pt(n.error),n.team_chat_log_id??null,Pt(n.meta),s,e,r.holder_pid,r.holder_host,r.started_at,r.last_heartbeat_at).changes!==1?null:this.getTrackedInvocation(e)}heartbeatTrackedInvocation(e,r=M()){return this.stmts.heartbeatTrackedInvocation.run(r,e).changes!==1?null:this.getTrackedInvocation(e)}listClaimableTerminalTrackedInvocations(e){let r=["status IN ('done', 'error', 'busy', 'cancelled')","ended_at IS NOT NULL","notified_by IS NULL"],n=[];e.from!==void 0&&(r.push("from_identity = ?"),n.push(e.from)),e.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(e.scope_teamfile));let s=Math.max(1,Math.min(1e3,Math.trunc(e.limit??100)));return n.push(s),this.db.prepare(`SELECT * FROM tracked_invocation WHERE ${r.join(" AND ")} ORDER BY ended_at ASC, id ASC LIMIT ?`).all(...n)}claimTrackedInvocationNotification(e,r,n=M()){return this.stmts.claimTrackedInvocationNotification.run(r,n,e).changes!==1?null:this.getTrackedInvocation(e)}listTrackedInvocations(e={}){let r=[],n=[];e.from!==void 0&&(r.push("from_identity = ?"),n.push(e.from)),e.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(e.scope_teamfile)),e.status!==void 0&&(r.push("status = ?"),n.push(e.status)),e.kind!==void 0&&(r.push("kind = ?"),n.push(e.kind)),e.origin!==void 0&&(r.push("origin = ?"),n.push(e.origin));let s=Math.max(1,Math.min(1e3,Math.trunc(e.limit??100)));n.push(s);let o=r.length===0?"":` WHERE ${r.join(" AND ")}`;return this.db.prepare(`SELECT * FROM tracked_invocation${o} ORDER BY started_at DESC, id DESC LIMIT ?`).all(...n)}maxTrackedInvocationId(e={}){let r=[],n=[];e.from!==void 0&&(r.push("from_identity = ?"),n.push(e.from)),e.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(e.scope_teamfile));let s=r.length===0?"":` WHERE ${r.join(" AND ")}`,o=this.db.prepare(`SELECT COALESCE(MAX(id), 0) AS max_id FROM tracked_invocation${s}`).get(...n);return Number(o?.max_id??0)}listRunningTrackedInvocations(e={}){return this.listTrackedInvocations({...e,status:"running"})}enqueueMail(e){return this.sendMailboxMessage(e)}sendMailboxMessage(e){let r=this.stmts.insertMailboxMessage.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile??null,e.sender_alias??null,e.root_teamfile??null,Xl(e.payload),e.created_at??M(),e.remote_transport??null,e.remote_message_id??null,e.remote_thread_id??null,e.meta??null);return this.getMailboxMessage(Number(r.lastInsertRowid))}listEnqueuedMailFromSender(e,r,n,s){return this.stmts.listEnqueuedMailFromSender.all(e,r,n,s)}markMailDelivered(e,r,n){let s=[...new Set(e.map(i=>Math.trunc(i)).filter(i=>Number.isInteger(i)&&i>0))];if(s.length===0)return 0;let o=Xl(r);this.db.exec("BEGIN IMMEDIATE");try{let i=0;for(let a of s)i+=this.stmts.markMailboxMessageDelivered.run(n,o,a).changes;return this.db.exec("COMMIT"),i}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}claimMailForDelivery(e,r,n=process.pid,s=as()){let o=[...new Set(e.map(i=>Math.trunc(i)).filter(i=>Number.isInteger(i)&&i>0))];if(o.length===0)return[];this.db.exec("BEGIN IMMEDIATE");try{let i=[];for(let a of o)if(this.stmts.claimMailboxMessageDelivery.run(r,n,s,a).changes===1){let c=this.getMailboxMessage(a);c!==null&&i.push(c)}return this.db.exec("COMMIT"),i}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}clearMailDelivery(e){let r=[...new Set(e.map(n=>Math.trunc(n)).filter(n=>Number.isInteger(n)&&n>0))];if(r.length===0)return 0;this.db.exec("BEGIN IMMEDIATE");try{let n=0;for(let s of r)n+=this.stmts.clearMailboxMessageDelivery.run(s).changes;return this.db.exec("COMMIT"),n}catch(n){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),n}}reclaimMailboxDeliveryIfUnchanged(e){return this.stmts.clearMailboxMessageDeliveryIfUnchanged.run(e.id,e.delivering_at,e.delivery_holder_pid,e.delivery_holder_host).changes!==1?null:this.getMailboxMessage(e.id)}reclaimStaleMailboxDeliveries(e){let r=this.stmts.listInFlightMailboxDeliveries.all(),n=[];this.db.exec("BEGIN IMMEDIATE");try{for(let s of r){if(!DN(s,e))continue;let o=this.reclaimMailboxDeliveryIfUnchanged(s);o!==null&&n.push(o)}return this.db.exec("COMMIT"),n}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}listDeliveredReceiptsForSender(e,r){return this.stmts.listDeliveredReceiptsForSender.all(e,r)}listOutboundPendingForSender(e,r){return this.stmts.listOutboundPendingForSender.all(e,r)}getMailboxMessage(e){return this.stmts.getMailboxMessage.get(e)??null}peekMailboxMessages(e,r=1e3){return this.stmts.listMailboxMessagesForReceiver.all(e.receiver_teamfile,e.receiver_alias,Math.max(1,Math.min(1e3,Math.trunc(r))))}recvMailboxMessages(e){return this.recvMailboxMessagesTxn(e.receiver_teamfile,e.receiver_alias)}updateTeamChatLogResponse(e,r){this.stmts.updateTeamChatLogResponse.run(r.response,r.status,r.error_detail,r.truncated,e)}getAgentInflight(e,r){return this.stmts.getAgentInflight.get(e,r)??null}listAgentInflight(){return this.stmts.listAgentInflight.all()}tryAcquireAgentInflight(e,r){return this.tryAcquireAgentInflightTxn(e,r)}clearAgentInflight(e,r){this.stmts.clearAgentInflight.run(e,r)}clearObservedTerminalAgentInflight(e,r,n){return this.stmts.clearObservedTerminalAgentInflight.run({receiver_teamfile:e,receiver_alias:r,observed_sender_teamfile:n.sender_teamfile,observed_sender_alias:n.sender_alias,observed_started_at:n.started_at,observed_holder_pid:n.holder_pid}).changes===1}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}getTerminalLock(e,r){let n=this.stmts.getRuntimeState.get(rs,ss(e,r),ns);return n===void 0?null:Np(n.data)}setTerminalLock(e){this.stmts.upsertRuntimeState.run(rs,ss(e.teamfile,e.alias),ns,JSON.stringify(e),e.last_heartbeat)}heartbeatTerminalLock(e,r,n,s){this.db.exec("BEGIN IMMEDIATE");try{let o=this.getTerminalLock(e,r);if(o===null||o.lock_id!==n)return this.db.exec("COMMIT"),!1;let i={...o,last_heartbeat:s};return this.stmts.upsertRuntimeState.run(rs,ss(e,r),ns,JSON.stringify(i),s),this.db.exec("COMMIT"),!0}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}clearTerminalLock(e,r,n){this.db.exec("BEGIN IMMEDIATE");try{let s=this.getTerminalLock(e,r);if(s===null||s.lock_id!==n)return this.db.exec("COMMIT"),!1;let o=this.stmts.deleteRuntimeState.run(rs,ss(e,r),ns);return this.db.exec("COMMIT"),o.changes===1}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}getRuntimeProcessLock(e,r,n){let s=this.stmts.getRuntimeState.get(e,r,n);return s===void 0?null:CN(s.data)}tryAcquireRuntimeProcessLock(e,r,n,s,o=M()){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getRuntimeProcessLock(e,r,n);if(i!==null&&!MN(i,s))return this.db.exec("COMMIT"),{acquired:!1,current:i};let a={lock_id:$p(),holder_pid:process.pid,holder_host:as(),started_at:o,last_heartbeat:o};return this.stmts.upsertRuntimeState.run(e,r,n,JSON.stringify(a),o),this.db.exec("COMMIT"),{acquired:!0,lock:a,previous:i}}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}clearRuntimeProcessLock(e,r,n,s){this.db.exec("BEGIN IMMEDIATE");try{let o=this.getRuntimeProcessLock(e,r,n);if(o===null||o.lock_id!==s)return this.db.exec("COMMIT"),!1;let i=this.stmts.deleteRuntimeState.run(e,r,n);return this.db.exec("COMMIT"),i.changes===1}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}getRun(e){return this.stmts.getRun.get(e)??null}setRunCurrentState(e,r){return this.stmts.setRunCurrentState.run(r,e),this.stmts.getRun.get(e)??null}setRunPausedState(e,r,n){return this.stmts.setRunPausedState.run(r,n,e),this.stmts.getRun.get(e)??null}setRunPendingEscalationDecision(e,r){return this.stmts.setRunPendingEscalationDecision.run(r,e),this.stmts.getRun.get(e)??null}setRunTerminalState(e,r){return this.stmts.setRunTerminalState.run(r,M(),e),this.stmts.getRun.get(e)??null}pauseJob(e){return this.stmts.pauseJob.run(e),this.getJob(e)}resumeRun(e,r){return this.resumeRunTxn(e,r,M())}insertStep(e){let r=this.stmts.insertStep.run(e.run_id,e.parent_step_id??null,e.state_name,e.outcome??null,e.status_detail??null,M());return this.stmts.getStep.get(r.lastInsertRowid)}finishStep(e,r,n){return this.stmts.finishStep.run(r??null,n??null,M(),e),this.stmts.getStep.get(e)??null}listStepsForRun(e){return this.stmts.listStepsForRun.all(e)}listLatestStepOutcomesByState(e){let r=this.stmts.listLatestStepOutcomesByState.all(e),n={};for(let s of r)n[s.state_name]=s.outcome;return n}insertSubmittedPr(e){let r=this.stmts.insertSubmittedPr.run(e.repo,e.pr_url,e.issue_url??null,e.local_path??null,e.branch??null,e.head_sha??null,e.status??"watching",e.submitted_at??M(),e.last_known_state??null,e.created_by_run_id??null);return this.stmts.getSubmittedPr.get(r.lastInsertRowid)}listSubmittedPrs(e){return e?.status!==void 0?this.stmts.listSubmittedPrsByStatus.all(e.status):this.stmts.listSubmittedPrs.all()}getSubmittedPr(e){return this.stmts.getSubmittedPr.get(e)??null}findSubmittedPrByUrl(e){return this.stmts.findSubmittedPrByUrl.get(e)??null}insertStepArtifact(e){let r=this.stmts.insertStepArtifact.run(e.step_id,e.kind,e.path??null,e.content??null,e.sha??null,e.provider_call_mode??null,M());return this.stmts.getStepArtifact.get(r.lastInsertRowid)}insertExternalObject(e){let n=this.stmts.insertExternalObject.run(e.type,e.provider,e.project_id,e.run_id??null,e.external_id,e.url??null,e.status??null,e.metadata??null,e.last_seen_at??null,M()).changes===1;return{row:this.stmts.findExternalObjectByUnique.get(e.provider,e.type,e.external_id),inserted:n}}insertExternalSignal(e){let r=this.stmts.insertExternalSignal.run(e.object_id,e.kind,e.source??null,e.occurred_at??null,e.payload??null,e.signal_hash??null,null,M()),n=r.changes===1;return{row:e.signal_hash===void 0||e.signal_hash===null?this.stmts.getExternalSignal.get(r.lastInsertRowid):this.stmts.findExternalSignalByUnique.get(e.object_id,e.kind,e.signal_hash),inserted:n}}raiseAttention(e){let r=this.stmts.insertAttention.run(e.kind,e.severity??"warn",e.project_id??null,e.run_id??null,e.external_object_id??null,e.requires_user===!0?1:0,e.payload??null,M());return this.stmts.getAttention.get(r.lastInsertRowid)}acknowledgeAttention(e){return this.stmts.ackAttention.run(M(),e),this.stmts.getAttention.get(e)??null}upsertDurableMemory(e){let r=M();return this.stmts.upsertDurableMemory.run(e.project_id,e.type,e.name,e.description??null,e.body,r,r),this.stmts.getDurableMemoryByName.get(e.project_id,e.name)}getDurableMemoryByName(e,r){return this.stmts.getDurableMemoryByName.get(e,r)??null}deleteDurableMemory(e,r){return this.stmts.deleteDurableMemory.run(e,r).changes>0}listDurableMemory(e,r){return r!==void 0?this.stmts.listDurableMemoryByType.all(e,r):this.stmts.listDurableMemory.all(e)}indexDurableMemory(e,r){return r!==void 0&&r.length>0?this.stmts.listDurableMemory.all(e).filter(s=>r.includes(s.type)).map(({name:s,description:o,type:i,updated_at:a})=>({name:s,description:o,type:i,updated_at:a})):this.stmts.listDurableMemory.all(e).map(({name:n,description:s,type:o,updated_at:i})=>({name:n,description:s,type:o,updated_at:i}))}recordSessionSize(e){let r=this.stmts.insertSessionSize.run(e.team_name,e.alias,e.sessionid,e.input_tokens??null,e.cache_tokens??null,e.output_tokens??null,e.total_tokens??null,e.observed_at??M());return this.stmts.getSessionSize.get(r.lastInsertRowid)}latestSessionSizes(){return this.stmts.latestSessionSizes.all()}sessionSizeHistory(e,r,n=20){return this.stmts.sessionSizeHistory.all(e,r,n)}insertSessionEvent(e){let r=this.stmts.insertSessionEvent.run(e.run_id,e.step_id??null,e.kind,e.timestamp_ms,e.payload,e.payload_truncated??0,e.overflow_artifact_id??null);return this.stmts.getSessionEvent.get(r.lastInsertRowid)}listSessionEvents(e,r){return r!==void 0?this.stmts.listSessionEventsSince.all(e,r):this.stmts.listSessionEvents.all(e)}listSessionEventsSince(e,r=1e3){return this.stmts.listAllEventsSince.all(e,r)}latestAgentCall(e){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call' ORDER BY id DESC LIMIT 1").get(e);if(r===void 0)return null;try{let n=JSON.parse(r.payload);return typeof n.alias!="string"||typeof n.provider!="string"?null:{alias:n.alias,provider:n.provider,...typeof n.model=="string"?{model:n.model}:{}}}catch{return null}}agentCallTokenTotals(e){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call'").all(e),n=0,s=0,o=0;for(let i of r)try{let a=JSON.parse(i.payload);typeof a.tokens_in=="number"&&(n+=a.tokens_in),typeof a.tokens_out=="number"&&(s+=a.tokens_out),o+=1}catch{}return{totalInputTokens:n,totalOutputTokens:s,agentCallCount:o}}addRollupValue(e){this.stmts.upsertRollupStat.run(e.run_id,e.step_id??null,e.metric_kind,e.value,e.bucket_start_ms,e.bucket_end_ms,e.updated_at)}listRollupStats(e){return this.stmts.listRollupStats.all(e)}getRollupCursor(){return this.stmts.getRollupCursor.get("last_event_id")?.value??0}setRollupCursor(e){this.stmts.setRollupCursor.run("last_event_id",e)}insertDriftSignal(e){let r=this.stmts.insertDriftSignal.run(e.team_member_id,e.project_id??null,e.signal_kind,e.severity,e.description,e.detected_at,e.expires_at??null,e.payload??null);return this.stmts.getDriftSignal.get(r.lastInsertRowid)}listDriftSignals(e={}){return e.team_member_id!==void 0&&e.unacked?this.stmts.listUnackedDriftByMember.all(e.team_member_id):e.team_member_id!==void 0?this.stmts.listDriftByMember.all(e.team_member_id):e.project_id!==void 0?this.stmts.listDriftByProject.all(e.project_id):this.stmts.listAllDrift.all()}hasUnackedDriftSignal(e,r,n){return this.stmts.findUnackedDrift.get(e,r??null,n)!==void 0}acknowledgeDriftSignal(e){return this.stmts.ackDriftSignal.run(Date.now(),e),this.stmts.getDriftSignal.get(e)??null}insertInteractiveSession(e){let r=Date.now();return this.stmts.insertInteractiveSession.run(e.run_id,e.step_id,e.state_name,e.status,r,r),this.stmts.getInteractiveSessionByStepId.get(e.step_id)}getInteractiveSessionByStepId(e){return this.stmts.getInteractiveSessionByStepId.get(e)??null}getInteractiveSessionByRunAndState(e,r){return this.stmts.getInteractiveSessionByRunAndState.get(e,r)??null}setInteractiveAgentOutput(e,r,n){this.stmts.setInteractiveAgentOutput.run(r,n,Date.now(),e)}resumeInteractive(e,r,n){return this.resumeInteractiveTxn(e,r,n,M())}resumeEscalation(e,r){return this.resumeEscalationTxn(e,r,M())}}});async function R(t,e){if(t.dal!==void 0)return e(t.dal);let r=he({path:le()});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 L(t,e){let r=t.flags[e];return typeof r=="string"?r:void 0}function C(t,e){return t.flags[e]===!0}function F(t,e){t.stdout.write(`${JSON.stringify(e,null,2)}
|
|
1291
1291
|
`)}function y(t,e){return t.stderr.write(`error: ${e}
|
|
1292
1292
|
`),1}function _e(t,e){let r=e instanceof Error?e.message:String(e);return t.stderr.write(`internal error: ${r}
|
|
1293
|
-
`),2}var ge=b(()=>{"use strict";
|
|
1294
|
-
`);if(e[0]!=="---")throw new St("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 St(`malformed frontmatter line ${i+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],u=l[2].trim();if(!WN.has(c))throw new St(`unknown frontmatter key "${c}" \u2014 allowed keys: ${Ro.join(", ")}`);r[c]=u}if(n===-1)throw new St("frontmatter not closed (missing trailing `---` on its own line)");for(let i of Ro)if(r[i]===void 0)throw new St(`missing required frontmatter key "${i}" \u2014 required: ${Ro.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 Ro,WN,St,Mp=b(()=>{"use strict";Ro=["title","description","members"],WN=new Set(Ro),St=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});import{readFileSync as BN,writeFileSync as
|
|
1293
|
+
`),2}var ge=b(()=>{"use strict";Be();Ve()});function Cp(t){if(t.length===0||!t.startsWith("---"))throw new St("frontmatter must start at line 1 with `---` on its own line");let e=t.split(`
|
|
1294
|
+
`);if(e[0]!=="---")throw new St("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 St(`malformed frontmatter line ${i+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],u=l[2].trim();if(!WN.has(c))throw new St(`unknown frontmatter key "${c}" \u2014 allowed keys: ${Ro.join(", ")}`);r[c]=u}if(n===-1)throw new St("frontmatter not closed (missing trailing `---` on its own line)");for(let i of Ro)if(r[i]===void 0)throw new St(`missing required frontmatter key "${i}" \u2014 required: ${Ro.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 Ro,WN,St,Mp=b(()=>{"use strict";Ro=["title","description","members"],WN=new Set(Ro),St=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});import{readFileSync as BN,writeFileSync as v4,renameSync as k4,existsSync as Pp}from"node:fs";import{basename as qN,resolve as Qr,dirname as Vl}from"node:path";function JN(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 XN(t){return/^\s*_MEMBER_\s+\S/.test(t)}function GN(t){return/^\s*_SESSION_\s+\S/.test(t)}function KN(t){return/^\s*_SKILL_(?:\s|$)/.test(t)}function Lo(t){let e=qN(t);return e.endsWith(".lmctl")?e.slice(0,-6):e}function Me(t){let e=BN(t,"utf-8"),r=Vl(Qr(t)),n=zl(e,Lo(t),{baseDir:r,sourcePath:Qr(t)});for(let s of n.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=Qr(r,s.sessiondir));return n}function zl(t,e,r={}){let n=[],s=[];r.sourcePath,r.baseDir;let o=t;if(o.startsWith("#teamfile:")){let l=o.indexOf(`
|
|
1295
1295
|
`);o=l>=0?o.slice(l+1):""}let i=null;if(o.startsWith("---"))try{i=Cp(o)}catch(l){if(l instanceof St)s.push(`frontmatter: ${l.message}`);else throw l}let a=t.split(`
|
|
1296
1296
|
`);for(let l=0;l<a.length;l++){let c=a[l],u=l+1;if(GN(c))throw new Error(`line ${u}: _SESSION_ is the legacy prefix. Rename to _MEMBER_. (line: ${c.trim()})`);if(KN(c)||!XN(c))continue;let d=JN(c);for(let p of Object.keys(d))if(!Dp.includes(p))throw new Error(`line ${u}: unknown key "${p}" on _MEMBER_ line: ${c.trim()}
|
|
1297
|
-
allowed keys: ${Dp.join(", ")}`);if(!d.provider&&!d.teamfile){s.push(`line ${u}: member line missing provider (or teamfile): ${c.trim()}`);continue}let m={alias:d.alias||`member${n.length+1}`,provider:d.provider||"",extra:{}};d.sessionid&&(m.session=d.sessionid),Object.prototype.hasOwnProperty.call(d,"sessiondir")&&(m.sessiondir=d.sessiondir),d.teamfile&&(m.teamfile=d.teamfile),d.model&&(m.model=d.model),d.effort&&(m.effort=d.effort),n.push(m)}return{name:e,members:n,rawText:t,parseErrors:s,frontmatter:i}}function Zl(t,e){let r=[];for(let o of t.parseErrors)r.push({field:"session",message:o});let n=t.members.filter(o=>o.alias.toLowerCase()===Yl.toLowerCase());n.length>1&&r.push({field:Yl,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?Qr(e,o.teamfile):Qr(o.teamfile);if(!Pp(a))r.push({field:o.alias,message:`Teamfile not found: ${a}`});else{let l=
|
|
1298
|
-
`).replace(/\\t/g," ").replace(/\\r/g,"\r")}function K(t,e){return t.length<=e?t:t.slice(0,e-3)+"..."}var ke,or=b(()=>{"use strict";ke=m0()});import{readdir as jo,stat as r_,unlink as p0}from"node:fs/promises";import{join as en,basename as n_}from"node:path";function _0(t){return t==="file-history-snapshot"||t==="progress"||t==="system"||t==="queue-operation"}function h0(t){if(t.type==="system"){let e=t.message?.content;if(typeof e=="string"&&e.trim())return me(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 s_(t){let e=0,r=0,n=0,s=0,o=0,i=0,a;for await(let l of He(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 _=d+f+m;_&&(i=_),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 Co,o_=b(()=>{"use strict";or();Co=class{name="claude";claudeDir;projectsDir;constructor(e={}){this.claudeDir=e.claudeDir||en(ke,".claude"),this.projectsDir=en(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await jo(this.projectsDir)}catch{return e}for(let n of r){let s=en(this.projectsDir,n);if(!(await r_(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await jo(s)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=n_(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=en(s,a);try{let u=await this.extractSummary(c,l);u&&e.push(u)}catch{}}}return e}async extractSummary(e,r){let n=await Pe(e,50),s=await Re(e),o="",i,a,l,c,u,d;for(let m of n)if(!_0(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=K(p.trim(),80)),u=K(p.trim(),80)}}if(!o)return null;let f=await s_(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 Re(r),s=[],o="",i,a,l,c,u,d,f,m=e;for await(let _ of He(r))if(_.type!=="file-history-snapshot"&&!_.isSidechain){if(!o&&_.cwd&&(o=_.cwd),!i&&_.slug&&(i=_.slug),!a&&_.version&&(a=_.version),!c&&_.gitBranch&&(c=_.gitBranch),!f&&_.timestamp&&(f=new Date(_.timestamp)),_.sessionId&&(m=_.sessionId),_.type==="system"||_.type==="progress"||_.type==="queue-operation"){s.push({role:"system",timestamp:new Date(_.timestamp||0),content:h0(_)});continue}if(_.type==="user"&&_.message){if(_.isMeta)continue;let g=new Date(_.timestamp||0),h=_.message.content;if(typeof h=="string"){if(h.includes("<command-name>")||h.includes("<local-command-"))continue;u||(u=K(h.trim(),80)),d=K(h.trim(),80),s.push({role:"user",timestamp:g,content:me(h.trim())})}else if(Array.isArray(h)){for(let T of h)if(T.type==="tool_result"){let w=typeof T.content=="string"?me(T.content):JSON.stringify(T.content);s.push({role:"tool_result",timestamp:g,content:w,toolCallId:T.tool_use_id})}}}if(_.type==="assistant"&&_.message){_.message.model&&(l=_.message.model);let g=new Date(_.timestamp||0),h=_.message.content;if(Array.isArray(h))for(let T of h)T.type==="text"&&T.text?s.push({role:"assistant",timestamp:g,content:me(T.text),model:_.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:_.message.model}):T.type==="thinking"&&T.thinking&&s.push({role:"thinking",timestamp:g,content:T.thinking})}}if(!o)return null;let p=await s_(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 p0(r),!0):!1}async resolveSessionFile(e){let r;try{r=await jo(this.projectsDir)}catch{return null}let n=[];for(let i of r){let a=en(this.projectsDir,i);if(!(await r_(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await jo(a)}catch{continue}for(let u of c){if(!u.endsWith(".jsonl"))continue;let d=n_(u,".jsonl");/^[0-9a-f]{8}-/.test(d)&&n.push({filePath:en(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 Pe(i.filePath,20);for(let l of a)if(l.slug&&l.slug===e)return i.filePath}return null}}});function Mo(t){return"'"+t.replace(/'/g,"'\\''")+"'"}function y0(t,e,r){if(!r)return"";let n=t.tools[e]??rc[e],s=n?.profiles?.[r]?.flags??rc[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 i_(t,e){return!!t.tools[e]}function a_(t,e,r,n,s){let o=t.tools[e]??rc[e],i;if(o?.agent){let l=Mo(n);i=o.agent.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,l)}else{let l=g0[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(Mo).join(" ");i=`printf '%s\\n' ${Mo(n)} | ${u}`}else i=c.map(Mo).join(" ")}let a=y0(t,e,s);return a&&(i+=" "+a),i}var rc,g0,l_=b(()=>{"use strict";rc={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:""}}}},g0={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 c_(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 u_=b(()=>{"use strict"});var w0,Te,Do,It=b(()=>{"use strict";w0="ACK: waiting for explicit lmctl task.",Te=`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: ${w0}`,Do=`send this exact lmctl seed instruction: "${Te}"`});function Ft(t,e){let r={...t??process.env,PWD:e};return delete r.OLDPWD,r}function E0(t,e){return e===void 0||e.length===0?t:{...t??process.env,[Ar]:e}}function Je(t,e,r){return E0(Ft(t,e),r)}var Ar,rt=b(()=>{"use strict";Ar="LMCTL_SELF_SESSIONID"});import{spawn as d_}from"node:child_process";import{mkdirSync as T0}from"node:fs";var nc,Le,Ut=b(()=>{"use strict";l_();u_();It();rt();nc=class t extends Error{cancelReason;constructor(e,r){super(e),this.name="TurnAbortError",this.cancelReason=r,Object.setPrototypeOf(this,t.prototype)}},Le=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===Te?r:n)}seed(e,r){return T0(e,{recursive:!0}),new Promise(n=>{let s;try{s=d_(this.binary,this.seedArgsFor(r),{cwd:e,env:Ft(void 0,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}
|
|
1297
|
+
allowed keys: ${Dp.join(", ")}`);if(!d.provider&&!d.teamfile){s.push(`line ${u}: member line missing provider (or teamfile): ${c.trim()}`);continue}let m={alias:d.alias||`member${n.length+1}`,provider:d.provider||"",extra:{}};d.sessionid&&(m.session=d.sessionid),Object.prototype.hasOwnProperty.call(d,"sessiondir")&&(m.sessiondir=d.sessiondir),d.teamfile&&(m.teamfile=d.teamfile),d.model&&(m.model=d.model),d.effort&&(m.effort=d.effort),n.push(m)}return{name:e,members:n,rawText:t,parseErrors:s,frontmatter:i}}function Zl(t,e){let r=[];for(let o of t.parseErrors)r.push({field:"session",message:o});let n=t.members.filter(o=>o.alias.toLowerCase()===Yl.toLowerCase());n.length>1&&r.push({field:Yl,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?Qr(e,o.teamfile):Qr(o.teamfile);if(!Pp(a))r.push({field:o.alias,message:`Teamfile not found: ${a}`});else{let l=Me(a),c=et(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 HN.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 et(t){return t.members.find(e=>e.alias.toLowerCase()===Yl.toLowerCase())}function Ql(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=Qr(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),!Pp(o))throw new Error(`Teamfile not found: ${o} (referenced by alias "${t.alias}")`);let a=Me(o),l=et(a);if(!l)throw new Error(`Team at ${o} has no lead session`);if(l.teamfile)return Ql(l,Vl(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||Vl(o),alias:t.alias,resolvedFrom:o,model:l.model,effort:l.effort}}function $o(t,e){return t.members.find(r=>r.alias===e)??t.members.find(r=>r.alias.toLowerCase()===e.toLowerCase())}var Yl,HN,Dp,vt=b(()=>{"use strict";Mp();Yl="Lead",HN=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","ClaudeMock"]);Dp=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});import{createHash as VN}from"node:crypto";import{existsSync as ls,mkdirSync as YN,readFileSync as Wp,realpathSync as zN,writeFileSync as ZN}from"node:fs";import{basename as Fp,dirname as Bp,resolve as qp}from"node:path";function ye(t,e){let r=qp(t);if(ls(r))return zN(r);if(e!==void 0){let n=t0(t,r,e);if(n!==null)return n}return r}function Up(t,e){let r=Bp(e),n=zl(t,Lo(e),{baseDir:r});for(let s of n.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=qp(r,s.sessiondir));return n}function qe(t,e){let r=ye(t,e0(e)?e:void 0);if(e!==void 0){let n=e.getRootTeam(r);if(n!==null)return!ls(r)&&"upsertRootTeam"in e&&(YN(Bp(r),{recursive:!0}),ZN(r,n.raw_text,"utf8")),Up(n.raw_text,r);if(ls(r)){let s=Wp(r,"utf8"),o=Up(s,r);return"upsertRootTeam"in e&&r0(o)&&n0(e,r,o,s),o}throw new Error(`teamfile not found: ${t}`)}if(!ls(r))throw new Error(`teamfile not found: ${t}`);return Me(r)}function Hp(t,e,r){let n=ye(t,e),s=e.getRootTeam(n);s===null||!ls(n)||Wp(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 e0(t){return typeof t=="object"&&t!==null&&"getRootTeam"in t&&"listRootTeams"in t}function t0(t,e,r){let n=r.getRootTeam(t)??r.getRootTeam(e);if(n!==null)return n.teamfile_path;let s=Fp(t),o=Lo(t),i=r.listRootTeams().filter(l=>Fp(l.teamfile_path)===s||l.name===o);if(i.length===0)return null;if(i.length===1)return i[0].teamfile_path;let a=i.map(l=>l.teamfile_path).join(", ");throw new Error(`ambiguous teamfile "${t}" in root-team registry: ${a}; pass an absolute path`)}function r0(t){return t.parseErrors.length>0?!1:t.members.every(e=>e.teamfile!==void 0?!0:e.session!==void 0&&e.session.length>=QN)}function n0(t,e,r,n){let s=new Date().toISOString(),o={teamfile_path:e,name:r.name,raw_text:n,raw_sha256:VN("sha256").update(n).digest("hex"),registered_at:s,last_seeded_at:s};t.upsertRootTeam(o)}var QN,tt=b(()=>{"use strict";vt();QN=5});import{basename as s0}from"node:path";function Gp(t,e){let r=new Date(e.now.getTime()-sr()).toISOString(),n=Yp(t,r).filter(f=>!f.sender.teamfile.startsWith("prompt:")),s=a0(e.sender,n),o=l0(e.sender,n);o!==null&&o.teamfile===e.root&&!Xp(s[0],o)&&s.unshift({...o,at:null});let i={teamfile:e.receiverTeamfile,alias:e.receiverAlias,at:e.now.getTime()},a=[...s,i],l=s.filter(f=>Xp(f,i)),c=l.map(f=>f.at).filter(f=>f!==null).sort((f,m)=>m-f)[0]??null,u=c!==null&&e.now.getTime()-c<o0;return{stop:l.length>=1&&u,chain:c0(a)}}function Kp(t,e){let r=new Date(e.now.getTime()-sr()).toISOString(),n=Yp(t,r),s=zp(e.sender,n);if(s.length===0)return null;let o=s[0];return o.sender.teamfile.startsWith("prompt:")?o.receiver.teamfile:o.sender.teamfile}function sr(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return Jp;let r=Number(e);return!Number.isFinite(r)||r<=0?Jp:r}function Vp(t){return`cross-team cycle detected (${t}); stopping to prevent a runaway loop.`}function i0(t){return{sender:{teamfile:t.sender_teamfile,alias:t.sender_alias},receiver:{teamfile:t.receiver_teamfile,alias:t.receiver_alias},at:Date.parse(t.started_at)}}function Yp(t,e){return t.clearAgentInflightOlderThan(e),t.listAgentInflight().map(i0).filter(r=>Number.isFinite(r.at)&&new Date(r.at).toISOString()>=e).sort((r,n)=>r.at-n.at)}function a0(t,e,r={}){let n=new Map;for(let a of e)n.set(Ar(a.receiver),a);let s=[{...t,at:null}],o=t,i=new Set([Ar(t)]);for(let a=0;a<64;a+=1){let l=n.get(Ar(o));if(l===void 0)break;s[0]={...s[0],at:s[0].at??l.at};let c={...l.sender,at:l.at};if(l.sender.teamfile.startsWith("prompt:")&&r.includePromptSender!==!0)break;let u=Ar(l.sender);if(i.has(u))break;s.unshift(c),i.add(u),o=l.sender}return s}function zp(t,e){let r=Ar(t),n=new Set([r]),s=[r],o=[];for(let i=0;s.length>0&&i<128;i+=1){let a=s.shift();for(let l of e){let c=Ar(l.sender),u=Ar(l.receiver);c!==a&&u!==a||(o.includes(l)||o.push(l),n.has(c)||(n.add(c),s.push(c)),n.has(u)||(n.add(u),s.push(u)))}}return o.sort((i,a)=>i.at-a.at)}function l0(t,e){let r=zp(t,e);if(r.length===0)return null;let n=r[0];return n.sender.teamfile.startsWith("prompt:")?n.receiver:n.sender}function Xp(t,e){return t.teamfile===e.teamfile&&t.alias===e.alias}function Ar(t){return`${t.teamfile}\0${t.alias}`}function c0(t){return t.map(e=>`${s0(e.teamfile)}:${e.alias}`).join(" \u2192 ")}var o0,Jp,Oo=b(()=>{"use strict";o0=6e4,Jp=8*60*60*1e3});import{realpathSync as u0}from"node:fs";import{resolve as d0}from"node:path";function ec(t){let e=d0(t);try{return u0(e)}catch{return e}}var Zp=b(()=>{"use strict"});import{platform as Qp}from"node:os";function kt(t){let e=new cs;for(let r of t)e.registerAdapter(r);return e}var cs,tc=b(()=>{"use strict";Zp();cs=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=ec(e.workspace);o=o.filter(a=>ec(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=Qp()==="darwin"||Qp()==="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 e_}from"node:fs";import{createInterface as t_}from"node:readline";import{stat as f0}from"node:fs/promises";import{homedir as m0}from"node:os";async function*He(t){let e=e_(t,{encoding:"utf-8"}),r=t_({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 De(t,e){let r=[],n=e_(t,{encoding:"utf-8"}),s=t_({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 Re(t){let e=await f0(t);return{createdAt:e.birthtime,modifiedAt:e.mtime}}function me(t){return t.replace(/\\n/g,`
|
|
1298
|
+
`).replace(/\\t/g," ").replace(/\\r/g,"\r")}function K(t,e){return t.length<=e?t:t.slice(0,e-3)+"..."}var ke,or=b(()=>{"use strict";ke=m0()});import{readdir as jo,stat as r_,unlink as p0}from"node:fs/promises";import{join as en,basename as n_}from"node:path";function _0(t){return t==="file-history-snapshot"||t==="progress"||t==="system"||t==="queue-operation"}function h0(t){if(t.type==="system"){let e=t.message?.content;if(typeof e=="string"&&e.trim())return me(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 s_(t){let e=0,r=0,n=0,s=0,o=0,i=0,a;for await(let l of He(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 _=d+f+m;_&&(i=_),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 Co,o_=b(()=>{"use strict";or();Co=class{name="claude";claudeDir;projectsDir;constructor(e={}){this.claudeDir=e.claudeDir||en(ke,".claude"),this.projectsDir=en(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await jo(this.projectsDir)}catch{return e}for(let n of r){let s=en(this.projectsDir,n);if(!(await r_(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await jo(s)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=n_(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=en(s,a);try{let u=await this.extractSummary(c,l);u&&e.push(u)}catch{}}}return e}async extractSummary(e,r){let n=await De(e,50),s=await Re(e),o="",i,a,l,c,u,d;for(let m of n)if(!_0(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=K(p.trim(),80)),u=K(p.trim(),80)}}if(!o)return null;let f=await s_(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 Re(r),s=[],o="",i,a,l,c,u,d,f,m=e;for await(let _ of He(r))if(_.type!=="file-history-snapshot"&&!_.isSidechain){if(!o&&_.cwd&&(o=_.cwd),!i&&_.slug&&(i=_.slug),!a&&_.version&&(a=_.version),!c&&_.gitBranch&&(c=_.gitBranch),!f&&_.timestamp&&(f=new Date(_.timestamp)),_.sessionId&&(m=_.sessionId),_.type==="system"||_.type==="progress"||_.type==="queue-operation"){s.push({role:"system",timestamp:new Date(_.timestamp||0),content:h0(_)});continue}if(_.type==="user"&&_.message){if(_.isMeta)continue;let g=new Date(_.timestamp||0),h=_.message.content;if(typeof h=="string"){if(h.includes("<command-name>")||h.includes("<local-command-"))continue;u||(u=K(h.trim(),80)),d=K(h.trim(),80),s.push({role:"user",timestamp:g,content:me(h.trim())})}else if(Array.isArray(h)){for(let T of h)if(T.type==="tool_result"){let w=typeof T.content=="string"?me(T.content):JSON.stringify(T.content);s.push({role:"tool_result",timestamp:g,content:w,toolCallId:T.tool_use_id})}}}if(_.type==="assistant"&&_.message){_.message.model&&(l=_.message.model);let g=new Date(_.timestamp||0),h=_.message.content;if(Array.isArray(h))for(let T of h)T.type==="text"&&T.text?s.push({role:"assistant",timestamp:g,content:me(T.text),model:_.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:_.message.model}):T.type==="thinking"&&T.thinking&&s.push({role:"thinking",timestamp:g,content:T.thinking})}}if(!o)return null;let p=await s_(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 p0(r),!0):!1}async resolveSessionFile(e){let r;try{r=await jo(this.projectsDir)}catch{return null}let n=[];for(let i of r){let a=en(this.projectsDir,i);if(!(await r_(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await jo(a)}catch{continue}for(let u of c){if(!u.endsWith(".jsonl"))continue;let d=n_(u,".jsonl");/^[0-9a-f]{8}-/.test(d)&&n.push({filePath:en(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 De(i.filePath,20);for(let l of a)if(l.slug&&l.slug===e)return i.filePath}return null}}});function Mo(t){return"'"+t.replace(/'/g,"'\\''")+"'"}function y0(t,e,r){if(!r)return"";let n=t.tools[e]??rc[e],s=n?.profiles?.[r]?.flags??rc[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 i_(t,e){return!!t.tools[e]}function a_(t,e,r,n,s){let o=t.tools[e]??rc[e],i;if(o?.agent){let l=Mo(n);i=o.agent.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,l)}else{let l=g0[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(Mo).join(" ");i=`printf '%s\\n' ${Mo(n)} | ${u}`}else i=c.map(Mo).join(" ")}let a=y0(t,e,s);return a&&(i+=" "+a),i}var rc,g0,l_=b(()=>{"use strict";rc={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:""}}}},g0={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 c_(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 u_=b(()=>{"use strict"});var w0,Te,Do,It=b(()=>{"use strict";w0="ACK: waiting for explicit lmctl task.",Te=`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: ${w0}`,Do=`send this exact lmctl seed instruction: "${Te}"`});function Ft(t,e){let r={...t??process.env,PWD:e};return delete r.OLDPWD,r}function E0(t,e){return e===void 0||e.length===0?t:{...t??process.env,[xr]:e}}function Je(t,e,r){return E0(Ft(t,e),r)}var xr,rt=b(()=>{"use strict";xr="LMCTL_SELF_SESSIONID"});import{spawn as d_}from"node:child_process";import{mkdirSync as T0}from"node:fs";var nc,Le,Ut=b(()=>{"use strict";l_();u_();It();rt();nc=class t extends Error{cancelReason;constructor(e,r){super(e),this.name="TurnAbortError",this.cancelReason=r,Object.setPrototypeOf(this,t.prototype)}},Le=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===Te?r:n)}seed(e,r){return T0(e,{recursive:!0}),new Promise(n=>{let s;try{s=d_(this.binary,this.seedArgsFor(r),{cwd:e,env:Ft(void 0,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}
|
|
1299
1299
|
`: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:Do,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${e}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(e,r){if(r.userConfig&&i_(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 nc("Turn cancelled","external"):p}),m=new Promise(p=>{l=p});return Promise.race([f,m])}runOneShotAgent(e,r,n){let s=a_(r.userConfig,this.name,r.sessionId,e,r.profile),o=Date.now();return new Promise((i,a)=>{let l=c_(r.env),c=d_(s,{shell:!0,cwd:r.cwd,env:Je(r.env,r.cwd,r.sessionId),stdio:["pipe","pipe","pipe"]}),u=!1,d=!1,f=setTimeout(()=>{d=!0,c.kill()},l),m="",p="";if(c.stdout?.on("data",_=>{let g=_.toString();m+=g,r.onDelta?.(g)}),c.stderr?.on("data",_=>{p+=_.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",_=>{if(u)return;u=!0,clearTimeout(f);let g=Date.now()-o;d?a(new Error(`Agent command timed out after ${l}ms`)):_===0||_===null?i({text:m.trim(),sessionId:r.sessionId,durationMs:g}):a(new Error(p.trim().slice(0,200)||`Agent command exited with code ${_}`))}),c.on("error",_=>{u||(u=!0,clearTimeout(f),a(_))})})}}});function Fo(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 nt,Ie,Wt,Po,Bt,tn=b(()=>{"use strict";nt=class extends Error{constructor(e,r){super(e,r),this.name=this.constructor.name}},Ie=class extends nt{},Wt=class extends nt{exitCode;signal;stderr;constructor(e,r,n=null,s){super(e),this.exitCode=r,this.signal=n,this.stderr=s}},Po=class extends nt{line;constructor(e,r,n){super(e,{cause:n}),this.line=r}},Bt=class extends nt{rpcCode;rpcData;constructor(e,r,n){super(e),r!==void 0&&(this.rpcCode=r),n!==void 0&&(this.rpcData=n)}}});import*as oc from"node:child_process";function S0(t){if(typeof oc.spawnSync=="function")try{oc.spawnSync("taskkill",["/T","/F","/PID",String(t)],{windowsHide:!0})}catch{}}function f_(t){return t.exitCode!==null||t.signalCode!==null}function sc(t,e){return f_(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 dt(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??S0;if(f_(t))return{signal:"natural",elapsedMs:Date.now()-r};if(n&&t.stdin&&!t.stdin.destroyed)try{t.stdin.end()}catch{}if(await sc(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 sc(t,o))return{signal:"SIGTERM",elapsedMs:Date.now()-r};if(i!=="win32")try{t.kill("SIGKILL")}catch{}return await sc(t,b0)?{signal:"SIGKILL",elapsedMs:Date.now()-r}:{signal:"abandoned",elapsedMs:Date.now()-r}}var b0,Uo=b(()=>{"use strict";b0=1e3});function m_(t){ue()&&Oe({event:"legacy",msg:`[debug] ${t}`},{always:!0})}function ir(t,e){let r=k0[t];if(r)return r[e]??r.yolo}function N0(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(I0.has(t)){m_(`YOLO ${t} [mode=${r}]: ${t==="codex"?`JSON-RPC params (approvalPolicy=never, sandbox=${r==="plan"?"read-only":"danger-full-access"})`:t==="opencode"?".opencode/opencode.json (permission=allow)":"protocol/config (out-of-band)"} \u2014 no argv flag`);return}let n=r==="plan"?ir(t,"plan"):v0[t];if(!n){let s=`unknown provider "${t}" \u2014 YOLO contract not configured. Add an entry to YOLO_FLAGS in src/providers/yolo-contract.ts before spawning this provider.`;throw z({event:"yolo_assert_failed",provider:t,reason:"unconfigured_provider",args:e.join(" "),message:s}),new Ie(s)}if(!N0(e,n)){let s=n.join(" "),o=`${t} spawn missing YOLO flag '${s}' \u2014 YOLO is mandatory for every provider; see src/providers/yolo-contract.ts. Got argv: [${e.map(i=>JSON.stringify(i)).join(", ")}]`;throw z({event:"yolo_assert_failed",provider:t,reason:"flag_missing",required_flag:s,mode:r,args:e.join(" "),message:o}),new Ie(o)}m_(`YOLO ${t} [mode=${r}]: argv flag '${n.join(" ")}'`)}var v0,k0,I0,rn=b(()=>{"use strict";tn();ve();v0={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"],lmplayer:["--dangerously-skip-permissions"]},k0={claude:{yolo:["--dangerously-skip-permissions"],plan:["--permission-mode","plan"]},qwen:{yolo:["--approval-mode","yolo"],plan:["--approval-mode","plan"]},gemini:{yolo:["-y"],plan:["--approval-mode","plan"]},copilot:{yolo:["--yolo"],plan:["--yolo"]},agy:{yolo:["--dangerously-skip-permissions"],plan:["--dangerously-skip-permissions"]},lmplayer:{yolo:["--dangerously-skip-permissions"],plan:["--dangerously-skip-permissions"]}};I0=new Set(["codex","opencode"])});function p_(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(`
|
|
1300
1300
|
|
|
1301
1301
|
--- additional response (turn ${r+1} of ${t.length}; likely an injected mid-call notification) ---
|
|
1302
1302
|
|
|
1303
|
-
`+t[r]);return e.join("")}function ic(t={}){let e=[],r="",n=!1;return{processLine(s){if(!s.trim())return;let o;try{o=JSON.parse(s)}catch{return}t.onEvent?.(o);let i=o.type;if(i==="system"&&o.subtype==="init"&&(r=o.session_id||r),i==="assistant"){let l=o.message?.content;if(Array.isArray(l))for(let c of l)c.type==="text"&&c.text&&t.onText?.(c.text)}i==="result"&&(n=!0,e.push(o))},sawResult(){return n},finalize(){if(!n)return null;let s=__(e);return{result:p_(s.resultTexts),sessionId:s.sessionId||r,durationMs:s.durationMs,numTurns:s.numTurns}}}}function __(t){let e=[],r=0,n=0,s="";for(let o of t){e.push(o.result||"");let i=o.duration_ms;typeof i=="number"&&Number.isFinite(i)&&(r+=i);let a=o.num_turns;typeof a=="number"&&Number.isFinite(a)&&(n=a);let l=o.session_id;typeof l=="string"&&l&&(s=l)}return{resultTexts:e,durationMs:r,numTurns:n,sessionId:s}}var ac=b(()=>{"use strict"});import{spawn as
|
|
1303
|
+
`+t[r]);return e.join("")}function ic(t={}){let e=[],r="",n=!1;return{processLine(s){if(!s.trim())return;let o;try{o=JSON.parse(s)}catch{return}t.onEvent?.(o);let i=o.type;if(i==="system"&&o.subtype==="init"&&(r=o.session_id||r),i==="assistant"){let l=o.message?.content;if(Array.isArray(l))for(let c of l)c.type==="text"&&c.text&&t.onText?.(c.text)}i==="result"&&(n=!0,e.push(o))},sawResult(){return n},finalize(){if(!n)return null;let s=__(e);return{result:p_(s.resultTexts),sessionId:s.sessionId||r,durationMs:s.durationMs,numTurns:s.numTurns}}}}function __(t){let e=[],r=0,n=0,s="";for(let o of t){e.push(o.result||"");let i=o.duration_ms;typeof i=="number"&&Number.isFinite(i)&&(r+=i);let a=o.num_turns;typeof a=="number"&&Number.isFinite(a)&&(n=a);let l=o.session_id;typeof l=="string"&&l&&(s=l)}return{resultTexts:e,durationMs:r,numTurns:n,sessionId:s}}var ac=b(()=>{"use strict"});import{spawn as A0}from"node:child_process";import{existsSync as x0}from"node:fs";function L0(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: ${t.tool} exited with code ${t.exitCode} before returning a final result event.
|
|
1304
1304
|
One possible cause: the provider stream ended before a complete response was delivered; for Claude Code this can appear as "API Error: Stream idle timeout - partial response received".`;return e?`Original provider error:
|
|
1305
1305
|
${e}
|
|
1306
1306
|
|
|
1307
|
-
${r}`:r}function h_(t,e){return new Promise((r,n)=>{let s=e.tool||"claude",o=e.binaryPath||R0[s]||"claude",i=["-p","","--output-format","stream-json","--input-format","stream-json"];s==="claude"&&i.push("--verbose"),e.sessionId&&i.push("--resume",e.sessionId),e.model&&i.push("--model",e.model);let a=e.permissionMode??"yolo",l=ir(s,a)??$0[s]??["--dangerously-skip-permissions"];i.push(...l);try{ft(s,i,a)}catch(g){return n(g)}if(e.cwd&&!
|
|
1307
|
+
${r}`:r}function h_(t,e){return new Promise((r,n)=>{let s=e.tool||"claude",o=e.binaryPath||R0[s]||"claude",i=["-p","","--output-format","stream-json","--input-format","stream-json"];s==="claude"&&i.push("--verbose"),e.sessionId&&i.push("--resume",e.sessionId),e.model&&i.push("--model",e.model);let a=e.permissionMode??"yolo",l=ir(s,a)??$0[s]??["--dangerously-skip-permissions"];i.push(...l);try{ft(s,i,a)}catch(g){return n(g)}if(e.cwd&&!x0(e.cwd))return z({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),n(new Ie(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=A0(o,i,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Je(e.env,e.cwd,e.sessionId)}),u=!1;if(e.signal){if(e.signal.aborted)return u=!0,z({event:"transport_abort",provider:s,phase:"pre_spawn"}),dt(c).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{u=!0,z({event:"transport_abort",provider:s}),dt(c).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let d=ic({onEvent:e.onEvent,onText:e.onText}),f="";function m(g){let h=d.sawResult();d.processLine(g),!h&&d.sawResult()&&c.stdin?.end()}c.stdout?.on("data",g=>{f+=g.toString();let h=f.split(`
|
|
1308
1308
|
`);f=h.pop()||"";for(let T of h)m(T)});let p="";c.stderr?.on("data",g=>{p+=g.toString()}),c.on("error",g=>{z({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:g.message}),n(new Ie(`Failed to spawn ${o}: ${g.message}`,{cause:g}))}),c.on("exit",g=>{if(u)return;f.trim()&&m(f);let h=d.finalize();h?(bt(`stream-json: result ${h.result.slice(0,80)}${h.result.length>80?"...":""} (${h.durationMs}ms)`),r({...h,exitCode:g})):(z({event:"transport_error",provider:s,error_class:"Error",reason:"provider_no_result",exit_code:g,stderr_tail:p.slice(0,500)}),n(new Error(L0({tool:s,exitCode:g,stderr:p}))))});let _=JSON.stringify({type:"user",message:{role:"user",content:t}});c.stdin?.write(_+`
|
|
1309
1309
|
`),bt(`stream-json: prompt sent (${t.length} chars)`)})}var R0,$0,g_=b(()=>{"use strict";tn();Uo();rn();ve();rt();ac();ac();R0={claude:"claude",qwen:"qwen"};$0={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"]}});function Wo(t={}){return[]}var lc=b(()=>{"use strict"});function cc(t){return t==="plan"?"read-only":"danger-full-access"}function y_(t="0.0.0"){return{clientInfo:{name:"lmctl",title:"lmctl",version:t},capabilities:{experimentalApi:!1}}}function uc(){return{agentItems:new Map,resultText:""}}function Bo(t,e,r,n){let s=t.method;if(!s)return!1;let o=t.params;if(s==="turn/started")return e.agentItems.clear(),e.resultText="",!1;if(s==="item/started"){let i=o?.item;if(i?.type==="agentMessage"&&typeof i.id=="string"){let a=typeof i.phase=="string"?i.phase:void 0,l=a==="commentary"||a==="final_answer"?a:void 0;return e.agentItems.set(i.id,{phase:l,buffer:""}),!0}return!1}if(s==="item/agentMessage/delta"){let i=o?.delta||"",a=typeof o?.itemId=="string"?o.itemId:void 0;if(!i)return!0;let l=a?e.agentItems.get(a):void 0;return l?(l.phase==="commentary"||(l.buffer+=i),r?.(i),l.phase&&o&&(o._lmctlItemPhase=l.phase)):(e.resultText+=i,r?.(i)),!0}if(s==="item/completed"){let i=o?.item;if(i?.type==="agentMessage"&&typeof i.id=="string"){let a=e.agentItems.get(i.id);if(a){if(a.phase!=="commentary"){let l=typeof i.text=="string"?i.text:a.buffer;if(n&&typeof i.text=="string"&&i.text!==a.buffer){let c=typeof o?.threadId=="string"?o.threadId:void 0,u=typeof o?.turnId=="string"?o.turnId:void 0;n({itemId:i.id,threadId:c,turnId:u,expectedFromItemText:i.text,gotFromBuffer:a.buffer})}e.resultText+=l}e.agentItems.delete(i.id)}return!0}return!1}return!1}function dc(t){for(let[,e]of t.agentItems.entries())e.phase!=="commentary"&&e.buffer&&(t.resultText+=e.buffer);t.agentItems.clear()}function w_(t){let e=t.params,r=e?.error,n=typeof r?.message=="string"?r.message:void 0,s=n&&n.length>0?n:"(no message)";return e?.willRetry===!0?{willRetry:!0}:{willRetry:!1,turnError:new Error(`Turn errored: ${s}`)}}function fc(){return{pendingCodexError:null}}function mc(t,e){let r=w_(t);return r.willRetry||(e.pendingCodexError=r.turnError),r}function pc(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}}var _c=b(()=>{"use strict"});import{spawn as O0}from"node:child_process";import{createInterface as j0}from"node:readline";import{existsSync as C0,readFileSync as M0}from"node:fs";import{fileURLToPath as D0}from"node:url";function F0(){return y_(P0)}function ar(t,e){bt(`[codex:${t}] ${JSON.stringify(e)}`)}function U0(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: codex app-server exited with code ${t.exitCode} before completing the turn.
|
|
1310
1310
|
One possible cause: Codex stopped before delivering a terminal turn/completed event.`;return e?`Original provider error:
|
|
1311
1311
|
${e}
|
|
1312
1312
|
|
|
1313
|
-
${r}`:r}function E_(t,e){return new Promise((r,n)=>{let s=e.binaryPath||"codex",o=["app-server","--listen","stdio://"];e.model&&o.push("-c",`model=${JSON.stringify(e.model)}`);let i=e.isLead??e.alias?.toLowerCase()==="lead",a=i?Wo():[];o.push(...a),ue()&&je(JSON.stringify({event:"codex_mcp_inject",alias:e.alias??null,isLead:i,injected:a.length>0}));let l=e.permissionMode??"yolo",c=cc(l);try{ft("codex",o,l)}catch(q){return n(q)}if(e.cwd&&!C0(e.cwd))return z({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`}),n(new Ie(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let u=O0(s,o,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Je(e.env,e.cwd,e.threadId)}),d=!1;if(e.signal){if(e.signal.aborted)return d=!0,z({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),dt(u).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{d=!0,z({event:"transport_abort",provider:"codex"}),dt(u).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let f=j0({input:u.stdout}),m=new Map,p=1,_=e.threadId||"",g="",h=!1,T=!1,w=Date.now(),E=uc(),k=fc();function N(q,O={}){return new Promise((
|
|
1314
|
-
`)})}function H(q,O={}){let
|
|
1315
|
-
`)}f.on("line",q=>{let O;try{O=JSON.parse(q)}catch{return}if(typeof O.id=="number"&&m.has(O.id)){let U=m.get(O.id);if(m.delete(O.id),O.error){let I=O.error,
|
|
1313
|
+
${r}`:r}function E_(t,e){return new Promise((r,n)=>{let s=e.binaryPath||"codex",o=["app-server","--listen","stdio://"];e.model&&o.push("-c",`model=${JSON.stringify(e.model)}`);let i=e.isLead??e.alias?.toLowerCase()==="lead",a=i?Wo():[];o.push(...a),ue()&&je(JSON.stringify({event:"codex_mcp_inject",alias:e.alias??null,isLead:i,injected:a.length>0}));let l=e.permissionMode??"yolo",c=cc(l);try{ft("codex",o,l)}catch(q){return n(q)}if(e.cwd&&!C0(e.cwd))return z({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`}),n(new Ie(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let u=O0(s,o,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Je(e.env,e.cwd,e.threadId)}),d=!1;if(e.signal){if(e.signal.aborted)return d=!0,z({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),dt(u).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{d=!0,z({event:"transport_abort",provider:"codex"}),dt(u).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let f=j0({input:u.stdout}),m=new Map,p=1,_=e.threadId||"",g="",h=!1,T=!1,w=Date.now(),E=uc(),k=fc();function N(q,O={}){return new Promise((x,X)=>{let U=p++;m.set(U,{resolve:x,reject:X});let I=JSON.stringify({jsonrpc:"2.0",id:U,method:q,params:O});u.stdin?.write(I+`
|
|
1314
|
+
`)})}function H(q,O={}){let x=JSON.stringify({jsonrpc:"2.0",method:q,params:O});u.stdin?.write(x+`
|
|
1315
|
+
`)}f.on("line",q=>{let O;try{O=JSON.parse(q)}catch{return}if(typeof O.id=="number"&&m.has(O.id)){let U=m.get(O.id);if(m.delete(O.id),O.error){let I=O.error,A=typeof I?.message=="string"&&I.message.length>0?I.message:JSON.stringify(O.error);U.reject(Fo(`codex app-server error: ${A}`,I))}else U.resolve(O);e.onEvent?.(O);return}let x=O.method;if(!x){e.onEvent?.(O);return}if(x==="thread/started"){let I=O.params?.thread;I?.id&&(_=I.id)}let X=ue()?U=>{ar("item.text/buffer-mismatch",{itemId:U.itemId,threadId:U.threadId??null,turnId:U.turnId??null,expectedFromItemText:U.expectedFromItemText,gotFromBuffer:U.gotFromBuffer,expectedLen:U.expectedFromItemText.length,gotLen:U.gotFromBuffer.length})}:void 0;if(x==="turn/started"){let U=O.params,I=U?.turn;I?.id&&(g=I.id),Bo(O,E,e.onDelta,X),ue()&&ar("turn/started",{params:U??null})}if(ue()&&(x==="item/started"||x==="item/completed")){let U=O.params;U?.item?.type==="agentMessage"&&ar(x,{params:U??null})}if(x==="item/started"||x==="item/agentMessage/delta"||x==="item/completed"){if(x==="item/agentMessage/delta"){let U=O.params;ue()&&ar("agentMessage/delta",{params:U??null})}Bo(O,E,e.onDelta,X)}if(x==="turn/completed"){let U=O.params;if(ue())for(let[A,j]of E.agentItems.entries())j.buffer&&ar("turn/completed/unflushed-item",{itemId:A,phase:j.phase,bufferLen:j.buffer.length});dc(E),ue()&&ar("turn/completed",{params:U??null});let I=pc(O,k);I.shouldReject?(ue()&&ar("turn/completed/terminal-reject",{message:I.turnError.message}),T=!0,h=!0,u.stdin?.end(),n(I.turnError)):(h=!0,u.stdin?.end())}if(x==="error"){let U=mc(O,k);if(ue()){let I=O.params,A=I?.error,j=typeof A?.message=="string"?A.message:"(no message)";ar(U.willRetry?"error/retry":"error/terminal-deferred",{message:j,willRetry:U.willRetry,params:I??null})}}e.onEvent?.(O)});let ne="";u.stderr?.on("data",q=>{ne+=q.toString()}),u.on("error",q=>{z({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:q.message}),n(new Ie(`Failed to spawn codex app-server: ${q.message}`,{cause:q}))}),u.on("exit",q=>{if(!d&&!T){if(h){r({result:E.resultText,threadId:_,turnId:g,durationMs:Date.now()-w,exitCode:q});return}if(k.pendingCodexError){n(k.pendingCodexError);return}z({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:q,stderr_tail:ne.slice(0,500)}),n(new Error(U0({exitCode:q,stderr:ne})))}}),(async()=>{try{if(await N("initialize",F0()),H("initialized",{}),e.threadId)try{let q=N("thread/resume",{threadId:e.threadId,sandbox:c,approvalPolicy:"never",...e.model?{model:e.model}:{}}),O=new Promise((x,X)=>setTimeout(()=>X(new Error("resume timeout")),5e3));await Promise.race([q,O]),_=e.threadId}catch{process.stderr.write(`[codex] thread/resume failed, creating new thread
|
|
1316
1316
|
`);let O=(await N("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:c,...e.model?{model:e.model}:{}})).result?.thread;O?.id&&(_=O.id)}else{let O=(await N("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:c,...e.model?{model:e.model}:{}})).result?.thread;O?.id&&(_=O.id)}await N("turn/start",{threadId:_,input:[{type:"text",text:t}],...e.model?{model:e.model}:{}})}catch(q){dt(u).catch(()=>{}),n(q instanceof Error?q:new Error(String(q)))}})()})}var P0,T_=b(()=>{"use strict";ve();ve();tn();Uo();rn();lc();ve();rt();_c();_c();P0=(()=>{try{let t=new URL("../../../package.json",import.meta.url),e=JSON.parse(M0(D0(t),"utf8"));return typeof e.version=="string"?e.version:"0.0.0"}catch{return"0.0.0"}})()});import{existsSync as v_,mkdirSync as W0,readFileSync as k_,writeFileSync as b_}from"node:fs";import{join as us,resolve as B0}from"node:path";function I_(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 hc(t,e,r={existsSync:v_,readFileSync:k_}){let n=[];for(let s of t){if(s.provider.trim().toLowerCase()!=="opencode")continue;let o=B0(e,s.sessiondir??e);for(let i of q0(o)){let a=H0(i,r);a!==void 0&&Object.prototype.hasOwnProperty.call(a,"permission")&&(I_(a.permission)||n.push(`[${s.alias}] ${i} sets a non-allow \`permission\`, which opencode merges over lmctl's YOLO (.opencode/opencode.json permission:"allow") \u2014 the member may hang on permission prompts. Set \`permission: "allow"\` in that file (or remove the key).`))}}return n}function q0(t){return[us(t,".opencode","opencode.jsonc"),us(t,"opencode.jsonc"),us(t,"opencode.json")]}function H0(t,e){try{if(!e.existsSync(t))return;let r=e.readFileSync(t,"utf-8"),n=JSON.parse(J0(r));return n===null||typeof n!="object"||Array.isArray(n)?void 0:n}catch{return}}function J0(t){let e="",r=!1,n="",s=!1;for(let o=0;o<t.length;o+=1){let i=t[o],a=t[o+1];if(r){e+=i,s?s=!1:i==="\\"?s=!0:i===n&&(r=!1,n="");continue}if(i==='"'||i==="'"){r=!0,n=i,e+=i;continue}if(i==="/"&&a==="/"){for(;o<t.length&&t[o]!==`
|
|
1317
1317
|
`;)o+=1;o<t.length&&(e+=t[o]);continue}if(i==="/"&&a==="*"){for(o+=2;o<t.length&&!(t[o]==="*"&&t[o+1]==="/");)o+=1;o+=1;continue}e+=i}return e.replace(/,\s*([}\]])/g,"$1")}function qo(t,e={}){let r=us(t,".opencode"),n=us(r,"opencode.json");if(!v_(n)){W0(r,{recursive:!0});let i=JSON.stringify({permission:"allow"},null,2);return b_(n,i+`
|
|
1318
1318
|
`,"utf-8"),!0}let s;try{s=JSON.parse(k_(n,"utf-8"))}catch{return console.log(S_.yellow(` .opencode/opencode.json at ${n} is malformed \u2014 skipping opencode config install.`)),!1}if(typeof s!="object"||s===null)return console.log(S_.yellow(` .opencode/opencode.json at ${n} is not an object \u2014 skipping opencode config install.`)),!1;let o=!1;return s.permission===void 0&&(s.permission="allow",o=!0),I_(s.permission)||z({event:"opencode_yolo_override",provider:"opencode",config_path:n,user_permission:s.permission,message:`opencode.json has a user-set 'permission' value other than 'allow' \u2014 lmctl's YOLO contract is NOT in effect; turns may hang waiting on permission prompts. Set permission: "allow" or remove the key to restore YOLO.`}),o&&b_(n,JSON.stringify(s,null,2)+`
|
|
1319
|
-
`,"utf-8"),o}var S_,Ho=b(()=>{"use strict";ve();S_={yellow:t=>t}});function
|
|
1319
|
+
`,"utf-8"),o}var S_,Ho=b(()=>{"use strict";ve();S_={yellow:t=>t}});function x_(t){let e=[...t.matchAll(X0)];if(e.length>0){let r=e[e.length-1],n=(r.index??0)+r[0].length;return N_(t.slice(n).trimStart())}return N_(z0(t.replace(G0,"")))}function z0(t){let e=K0.exec(t);if(e===null)return t;let r=t.slice(e[0].length),n=[...r.matchAll(V0)];if(n.length<2)return t;let s=n[0],o=(s.index??0)+s[0].length;return r.slice(o).trimStart()}function N_(t){let e=[...t.matchAll(Y0)];if(e.length===0)return t;let r=e[e.length-1],n=(r.index??0)+r[0].length;return t.slice(n).trimStart()}function ds(t,e=""){let r=t.result;return typeof r?.sessionId=="string"&&r.sessionId.length>0?r.sessionId:e}function R_(t){let e=t.result;return typeof e?.stopReason=="string"?e.stopReason:""}function gc(t={}){let e="",r="",n="",s=!1,o=!1,i=()=>({result:t.tool==="gemini"?x_(r):r,sessionId:e,stopReason:n});return{setSessionId(a){e=a},beginTurn(){r="",n="",s=!1,o=!0},completeTurn(a){return n=R_(a),s=!0,o=!1,i()},processMessage(a){if(a.method!=="session/update")return!1;let c=a.params?.update;if(c?.sessionUpdate!=="agent_message_chunk")return!1;let u=c.content,d=typeof u?.text=="string"?u.text:"";return d&&o&&(r+=d,t.onDelta?.(d)),!0},finalize(){return s?i():null}}}var A_,X0,G0,K0,V0,Y0,yc=b(()=>{"use strict";A_="(?:png|jpe?g|webp|heic|pdf)",X0=new RegExp(`\\bSTANCE:\\s*\\S+_\\d{6,}\\.${A_}\\s*`,"gi"),G0=new RegExp(`^ACK:\\s*waiting for explicit lmctl task\\.\\d{6,}\\.${A_}\\s*`,"i"),K0=/^ACK:\s*waiting for explicit lmctl task[._]?\s*/i,V0=/^STANCE:\s+\S+\s*$/gim,Y0=/\[Thought:\s*true\]\s*/gi});import{spawn as Z0}from"node:child_process";import{existsSync as Q0}from"node:fs";import{createInterface as eA}from"node:readline";function tA(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: ${t.tool} ACP process exited with code ${t.exitCode} before completing the prompt.
|
|
1320
1320
|
One possible cause: the provider process failed before a complete ACP response was delivered.`;return e?`Original provider error:
|
|
1321
1321
|
${e}
|
|
1322
1322
|
|
|
1323
|
-
${r}`:r}function L_(t,e){let r=
|
|
1323
|
+
${r}`:r}function L_(t,e){let r=rA[e.tool];return r?new Promise((n,s)=>{let o=e.binaryPath||r.binary;if(e.tool==="opencode")try{qo(e.cwd)}catch(w){z({event:"opencode_config_install_failed",cwd:e.cwd,error_message:w instanceof Error?w.message:String(w)})}let i=e.permissionMode??"yolo",a=[...r.args];if(i==="plan")if(e.tool==="gemini"){let w=ir("gemini","plan"),E=ir("gemini","yolo");a=a.filter(k=>!(E??[]).includes(k)),w&&a.push(...w)}else e.tool==="copilot"&&process.stderr.write(`[acp] copilot has no plan-mode flag in --acp mode; --permission-mode plan is not honored (running yolo). See src/providers/yolo-contract.ts.
|
|
1324
1324
|
`);e.model&&e.tool==="gemini"&&a.push("--model",e.model);let l=e.tool==="copilot"?"yolo":i;try{ft(e.tool,a,l)}catch(w){return s(w)}if(e.model&&e.tool==="copilot"&&process.stderr.write(`[acp] copilot does not support per-session model selection in --acp mode (model="${e.model}" ignored). Set the default via copilot's /model slash command in an interactive \`lmctl terminal\` session.
|
|
1325
|
-
`),e.cwd&&!Q0(e.cwd))return z({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),s(new Ie(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=Z0(o,a,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Je(e.env,e.cwd,e.sessionId)}),u=Date.now(),d=!1;if(e.signal){if(e.signal.aborted)return d=!0,z({event:"transport_abort",provider:e.tool,phase:"pre_spawn"}),dt(c).catch(()=>{}),s(new Error("Aborted"));e.signal.addEventListener("abort",()=>{d=!0,z({event:"transport_abort",provider:e.tool,elapsed_ms:Date.now()-u}),dt(c).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let f=
|
|
1325
|
+
`),e.cwd&&!Q0(e.cwd))return z({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),s(new Ie(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=Z0(o,a,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Je(e.env,e.cwd,e.sessionId)}),u=Date.now(),d=!1;if(e.signal){if(e.signal.aborted)return d=!0,z({event:"transport_abort",provider:e.tool,phase:"pre_spawn"}),dt(c).catch(()=>{}),s(new Error("Aborted"));e.signal.addEventListener("abort",()=>{d=!0,z({event:"transport_abort",provider:e.tool,elapsed_ms:Date.now()-u}),dt(c).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let f=eA({input:c.stdout}),m=new Map,p=e.sessionId||"",_=gc({tool:e.tool,onDelta:e.onDelta});_.setSessionId(p);function g(w,E={}){return new Promise((k,N)=>{let H=nA++;m.set(H,{resolve:k,reject:N});let ne=JSON.stringify({jsonrpc:"2.0",id:H,method:w,params:E});Oe({event:"acp_send",direction:"SEND",provider:e.tool,method:w,id:H,params:E}),c.stdin?.write(ne+`
|
|
1326
1326
|
`)})}f.on("line",w=>{let E;try{E=JSON.parse(w)}catch{return}if(Oe({event:"acp_recv",direction:"RECV",provider:e.tool,id:typeof E.id=="number"?E.id:void 0,method:typeof E.method=="string"?E.method:void 0,preview:JSON.stringify(E).slice(0,300)}),e.onEvent?.(E),typeof E.id=="number"&&m.has(E.id)){let N=m.get(E.id);if(m.delete(E.id),E.error){let H=E.error,ne=typeof H?.message=="string"&&H.message.length>0?H.message:JSON.stringify(E.error);N.reject(Fo(`ACP RPC error: ${ne}`,H))}else N.resolve(E);return}let k=E.method;if(k){if(typeof E.id=="number"){z({event:"acp_unhandled_request",provider:e.tool,method:k,id:E.id,params:E.params});let N=JSON.stringify({jsonrpc:"2.0",id:E.id,error:{code:-32601,message:`Method not found: ${k} (lmctl does not implement server-side ACP methods)`}});Oe({event:"acp_send",direction:"SEND",provider:e.tool,replyTo:E.id,error:"method not found"}),c.stdin?.write(N+`
|
|
1327
|
-
`);return}_.processMessage(E)}});let h="";c.stderr?.on("data",w=>{h+=w.toString()}),c.on("error",w=>{z({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:w.message,elapsed_ms:Date.now()-u}),s(new Ie(`Failed to spawn ${r.binary} ${r.args.join(" ")}: ${w.message}`,{cause:w}))}),c.on("exit",w=>{if(d)return;let E=_.finalize();E!==null?n({result:E.result,sessionId:E.sessionId,durationMs:Date.now()-u,stopReason:E.stopReason,exitCode:w}):(z({event:"transport_error",provider:e.tool,error_class:"Error",reason:"provider_no_result",exit_code:w,stderr_tail:h.slice(0,500),elapsed_ms:Date.now()-u}),s(new Error(
|
|
1327
|
+
`);return}_.processMessage(E)}});let h="";c.stderr?.on("data",w=>{h+=w.toString()}),c.on("error",w=>{z({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:w.message,elapsed_ms:Date.now()-u}),s(new Ie(`Failed to spawn ${r.binary} ${r.args.join(" ")}: ${w.message}`,{cause:w}))}),c.on("exit",w=>{if(d)return;let E=_.finalize();E!==null?n({result:E.result,sessionId:E.sessionId,durationMs:Date.now()-u,stopReason:E.stopReason,exitCode:w}):(z({event:"transport_error",provider:e.tool,error_class:"Error",reason:"provider_no_result",exit_code:w,stderr_tail:h.slice(0,500),elapsed_ms:Date.now()-u}),s(new Error(tA({tool:e.tool,exitCode:w,stderr:h}))))});function T(w,E={}){let k=JSON.stringify({jsonrpc:"2.0",method:w,params:E});c.stdin?.write(k+`
|
|
1328
1328
|
`)}(async()=>{try{if(await g("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),T("notifications/initialized"),e.sessionId)try{let k=await g("session/load",{sessionId:e.sessionId,cwd:e.cwd,mcpServers:[]});p=ds(k,e.sessionId),_.setSessionId(p)}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
|
|
1329
1329
|
`);let N=await g("session/new",{cwd:e.cwd,mcpServers:[]});p=ds(N),_.setSessionId(p)}else{let k=await g("session/new",{cwd:e.cwd,mcpServers:[]});p=ds(k),_.setSessionId(p)}if(e.model&&e.tool==="opencode")try{await g("session/set_config_option",{sessionId:p,configId:"model",value:e.model}),bt(`acp: set_config_option(model=${e.model}) ok`)}catch(k){let N=k instanceof Error?k.message:String(k);process.stderr.write(`[acp] set_config_option(model=${e.model}) failed: ${N}
|
|
1330
1330
|
`)}if(e.effort&&e.tool==="opencode")try{await g("session/set_config_option",{sessionId:p,configId:"effort",value:e.effort}),bt(`acp: set_config_option(effort=${e.effort}) ok`)}catch(k){let N=k instanceof Error?k.message:String(k);process.stderr.write(`[acp] set_config_option(effort=${e.effort}) failed: ${N}
|
|
1331
|
-
`)}_.beginTurn(),bt(`acp: prompt sent (${t.length} chars)`);let w=await g("session/prompt",{sessionId:p,prompt:[{type:"text",text:t}]}),E=_.completeTurn(w);bt(`acp: result received (${E.result.length} chars, stopReason=${E.stopReason})`),c.stdin?.end()}catch(w){dt(c).catch(()=>{}),s(w instanceof Error?w:new Error(String(w)))}})()}):Promise.reject(new Error(`No ACP config for tool "${e.tool}"`))}var
|
|
1331
|
+
`)}_.beginTurn(),bt(`acp: prompt sent (${t.length} chars)`);let w=await g("session/prompt",{sessionId:p,prompt:[{type:"text",text:t}]}),E=_.completeTurn(w);bt(`acp: result received (${E.result.length} chars, stopReason=${E.stopReason})`),c.stdin?.end()}catch(w){dt(c).catch(()=>{}),s(w instanceof Error?w:new Error(String(w)))}})()}):Promise.reject(new Error(`No ACP config for tool "${e.tool}"`))}var rA,nA,$_=b(()=>{"use strict";ve();tn();Uo();rn();Ho();ve();rt();yc();yc();rA={gemini:{binary:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{binary:"copilot",args:["--acp","--yolo"]},opencode:{binary:"opencode",args:["acp"]}},nA=1});function we(t,e=120){let r=t.replace(/\s+/g," ").trim();return r.length>e?r.slice(0,e-1)+"\u2026":r}function O_(t,e){return r=>{if(r.kind==="tool_use"&&typeof r.id=="string"){if(t.size>=sA){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 oA(){let t=new Map;return(e,r)=>{iA(e,O_(t,r))}}function iA(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(we(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(we(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:we(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=we(JSON.stringify(c))),e({kind:"tool_use",tool:a,summary:we(u),id:l,raw:o})}else if(i==="thinking"){let a=o.thinking||"";e({kind:"thinking",summary:we(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(`
|
|
1332
1332
|
`).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(`
|
|
1333
|
-
`).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 Jo(t,e){let r=e.binary==="qwen"?"qwen":"claude",n=e.onProgress?
|
|
1333
|
+
`).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 Jo(t,e){let r=e.binary==="qwen"?"qwen":"claude",n=e.onProgress?oA():void 0,s=await h_(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 aA(){let t=new Map;return(e,r)=>{lA(e,O_(t,r))}}function lA(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:we(a)});return}if(o==="agent_thought_chunk"){let a=s.content?.text||"";e({kind:"thinking",summary:we(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=we(JSON.stringify(c))),e({kind:"tool_use",tool:i,summary:we(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 ${we(c,80)}`:"running\u2026";e({kind:"other",summary:u,id:a})}return}e({kind:"other",summary:o})}}async function nn(t,e){let r=e.acpTool||e.binary;e.model&&r==="copilot"&&Oe({event:"model_ignored",provider:r,model:e.model,reason:"copilot --acp does not implement per-session model selection"});let n=e.onProgress?aA():void 0,s=await L_(t,{tool:r,sessionId:e.sessionId,cwd:e.cwd,env:e.env,binaryPath:e.progPath,model:e.model,effort:e.effort,alias:e.alias,permissionMode:e.permissionMode,onDelta:e.onDelta,onEvent:n?o=>n(o,e.onProgress):void 0,signal:e.signal});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason}}function cA(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: ${we(i,120)}`}:{kind:"other",summary:`codex error: ${we(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:we(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:we(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:we(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:we(s)}:{kind:"text",summary:we(s)})}return}if(r==="item/reasoning/summaryTextDelta"||r==="item/reasoning/textDelta"){let s=n?.delta||"";s&&e({kind:"thinking",summary:we(s)});return}if(r==="item/commandExecution/outputDelta"){let s=(typeof n?.delta=="string"?n.delta:"")||"";if(s){let o=s.split(`
|
|
1334
1334
|
`).filter(l=>l.length>0),i=o[o.length-1]||"",a=o.length>1?`${o.length} lines: ${we(i,60)}`:we(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(`
|
|
1335
|
-
`).filter(l=>l.length>0),i=o[o.length-1]||"",a=o.length>1?`${o.length} lines: ${we(i,60)}`:we(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 j_(t,e){let r=await E_(t,{threadId:e.sessionId,cwd:e.cwd,env:e.env,binaryPath:e.progPath,model:e.model,alias:e.alias,isLead:e.isLead,permissionMode:e.permissionMode,onDelta:e.onDelta,onEvent:e.onProgress?n=>
|
|
1336
|
-
`);try{return JSON.stringify(t)}catch{return String(t)}}async function D_(t){let e=0,r=0,n=0,s=0,o=0,i,a;for await(let l of He(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=
|
|
1337
|
-
`);T.trim()&&ms(s,m,{role:"thinking",timestamp:g,content:me(T)});continue}}if(_.type==="event_msg"&&_.payload&&_.payload.type==="agent_reasoning"){let h=_.payload.message||_.payload.text;h&&ms(s,m,{role:"thinking",timestamp:g,content:me(h)})}}if(!o)return null;let p=await D_(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
|
|
1335
|
+
`).filter(l=>l.length>0),i=o[o.length-1]||"",a=o.length>1?`${o.length} lines: ${we(i,60)}`:we(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 j_(t,e){let r=await E_(t,{threadId:e.sessionId,cwd:e.cwd,env:e.env,binaryPath:e.progPath,model:e.model,alias:e.alias,isLead:e.isLead,permissionMode:e.permissionMode,onDelta:e.onDelta,onEvent:e.onProgress?n=>cA(n,e.onProgress):void 0,signal:e.signal});return{text:r.result,sessionId:r.threadId,durationMs:r.durationMs}}var sA,Rr=b(()=>{"use strict";g_();T_();$_();ve();sA=256});function Ec(t){return new wc(t)}var wc,Tc=b(()=>{"use strict";o_();Ut();Rr();It();wc=class extends Le{constructor(e){super({provider:new Co(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"claude",seedArgs:["-p",Te,"--dangerously-skip-permissions"],resumeTemplate:"claude --resume {{session_id}}",startTemplate:"claude",transport:Jo})}}});import{readdir as uA,stat as C_,unlink as dA}from"node:fs/promises";import{join as fs,basename as fA}from"node:path";function mA(t,e,r){return`${t}|${e.toISOString()}|${r}`}function ms(t,e,r){let n=mA(r.role,r.timestamp,r.content);e.has(n)||(e.add(n),t.push(r))}function M_(t,e){return e==="exec"||t==="codex_exec"?"codex exec":"codex"}function pA(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 Xo(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 Xo(r)}).filter(r=>r.length>0).join(`
|
|
1336
|
+
`);try{return JSON.stringify(t)}catch{return String(t)}}async function D_(t){let e=0,r=0,n=0,s=0,o=0,i,a;for await(let l of He(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=pA(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 Go,P_=b(()=>{"use strict";or();Go=class{name="codex";codexDirs;constructor(e={}){let r=[fs(ke,".codex"),fs(ke,".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:fs(e,"sessions"),filePattern:/\.jsonl$/}))}async getSessionsDirs(){let e=[];for(let r of this.codexDirs){let n=fs(r,"sessions");try{await C_(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 uA(e)}catch{return r}for(let s of n){let o=fs(e,s),i=await C_(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=fA(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 De(e,30),n=await Re(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 _=p.payload.message||p.payload.text;_&&(c||(c=K(_.trim(),80)),u=K(_.trim(),80))}if(p.type==="response_item"&&p.payload?.type==="message"&&p.payload.role==="user"&&p.payload.content){let _=p.payload.content.find(g=>g.type==="input_text"&&typeof g.text=="string"&&g.text);typeof _?.text=="string"&&(c||(c=K(_.text.trim(),80)),u=K(_.text.trim(),80))}}if(!o)return null;let m=await D_(e);return{provider:"codex",sessionId:s,cwd:o,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:i,startCommand:M_(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 Re(r),s=[],o="",i,a,l,c,u,d=e,f,m=new Set;for await(let _ of He(r)){let g=_.timestamp?new Date(_.timestamp):new Date;if(_.type==="session_meta"&&_.payload){_.payload.id&&(d=_.payload.id),_.payload.cwd&&(o=_.payload.cwd),_.payload.cli_version&&(i=_.payload.cli_version),_.payload.timestamp&&(l=new Date(_.payload.timestamp)),f=M_(_.payload.originator,_.payload.source);continue}if(_.type==="turn_context"&&_.payload){_.payload.model&&(a=_.payload.model),!o&&_.payload.cwd&&(o=_.payload.cwd);continue}if(_.type==="response_item"&&_.payload){let h=_.payload;if(h.type==="message"){if(h.role==="user"&&h.content){for(let T of h.content)if(T.type==="input_text"&&typeof T.text=="string"&&T.text){let w=T.text.trim();c||(c=K(w,80)),u=K(w,80),ms(s,m,{role:"user",timestamp:g,content:me(w)})}continue}if(h.role==="assistant"&&h.content){for(let T of h.content)T.type==="output_text"&&typeof T.text=="string"&&T.text&&ms(s,m,{role:"assistant",timestamp:g,content:me(T.text),model:a});continue}if(h.role!=="user"&&h.role!=="assistant"&&h.content){for(let T of h.content)(T.type==="input_text"||T.type==="output_text")&&typeof T.text=="string"&&T.text&&ms(s,m,{role:"system",timestamp:g,content:me(T.text.trim())});continue}}if(h.type==="function_call"){s.push({role:"tool_use",timestamp:g,content:h.name||"unknown tool",toolName:h.name,toolInput:h.arguments!==void 0?me(Xo(h.arguments)):void 0,toolCallId:h.call_id});continue}if(h.type==="function_call_output"){s.push({role:"tool_result",timestamp:g,content:me(Xo(h.output)),toolCallId:h.call_id});continue}if(h.type==="reasoning"&&h.summary){let T=h.summary.map(w=>Xo(w.text)).join(`
|
|
1337
|
+
`);T.trim()&&ms(s,m,{role:"thinking",timestamp:g,content:me(T)});continue}}if(_.type==="event_msg"&&_.payload&&_.payload.type==="agent_reasoning"){let h=_.payload.message||_.payload.text;h&&ms(s,m,{role:"thinking",timestamp:g,content:me(h)})}}if(!o)return null;let p=await D_(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 dA(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 De(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 Sc(t){return new bc(t)}var bc,vc=b(()=>{"use strict";P_();Ut();Rr();It();bc=class extends Le{constructor(e){super({provider:new Go(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:`${Te}
|
|
1338
1338
|
`,resumeTemplate:"codex resume {{session_id}}",startTemplate:"codex",transport:j_})}seedArgsFor(e){let r=super.seedArgsFor(e);return e?.model?[...r.slice(0,-1),"--model",e.model,r[r.length-1]]:r}}});function ps(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 Ko(t){let e=ps(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(`
|
|
1339
|
-
`).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?
|
|
1339
|
+
`).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?_A(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 _A(t,e){for(let[r,n]of Object.entries(e))if(n!==void 0){if(r==="tokens"&&F_(t.tokens)&&F_(n)){t.tokens={...t.tokens,...n};continue}t[r]=n}}function F_(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function U_(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(`
|
|
1340
1340
|
`)+`
|
|
1341
|
-
`}var kc=b(()=>{"use strict"});import{createHash as
|
|
1342
|
-
`).trim();N&&o.push({role:"thinking",timestamp:Lr(k.timestamp,h),content:me(N)})}o.push({role:"assistant",timestamp:h,content:w,model:g.model});continue}let E=T?`[${T}] `:"";o.push({role:"system",timestamp:h,content:`${E}${w}`.trim()})}let m=Lr(n.startTime,s.createdAt),p=Lr(n.lastUpdated,s.modifiedAt),_=H_(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:_.totalInputTokens||void 0,totalCachedInputTokens:_.totalCachedInputTokens||void 0,totalOutputTokens:_.totalOutputTokens||void 0,totalReasoningOutputTokens:_.totalReasoningOutputTokens||void 0,lastInputTokens:_.lastInputTokens||void 0,lastTokenUsage:_.lastTokenUsage,messages:o}}async extractSummary(e){let r=await this.readSessionFile(e);if(!r)return null;let n=await Re(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(q_(m.type)){d++;let p=B_(m.content).trim();p&&(l||(l=K(me(p),80)),c=K(me(p),80))}else Ic(m.type)&&(d++,m.model&&(u=m.model));let f=H_(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 W_(e,"utf-8");if(ps(r)==="unknown")return z({event:"gemini_session_format_unknown",provider:"gemini",file:e,preview:r.slice(0,120),message:`gemini session file at ${e} matches neither old (.json with messages[]) nor new (.jsonl with kind metadata) format. Skipping; lmctl ls / audit / stats will not see this session.`}),null;try{return Ko(r)}catch{return null}}extractSessionIdFromFilename(e){let r=
|
|
1343
|
-
`)}manualSeedHint(e){return{launchCommand:`cd ${e} && gemini --skip-trust`,postLaunchNote:Do,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=
|
|
1344
|
-
`)){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 $r(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}async function
|
|
1341
|
+
`}var kc=b(()=>{"use strict"});import{createHash as hA}from"node:crypto";import{readdir as _s,readFile as W_,stat as Vo,unlink as gA}from"node:fs/promises";import{join as Ye,basename as yA,dirname as wA}from"node:path";import{cwd as EA}from"node:process";function B_(t){return t?typeof t=="string"?t:Array.isArray(t)?t.map(e=>e.text||"").join(""):"":""}function q_(t){return t==="user"}function Ic(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 TA(t){return`${t.sessionId}\0${t.cwd}`}function bA(t,e){let r=t.filePaths??[t.filePath],n=e.filePaths??[e.filePath],s=[...new Set([...r,...n])],o=e.modifiedAt.getTime()>=t.modifiedAt.getTime()?e:t;return{...o,createdAt:t.createdAt.getTime()<=e.createdAt.getTime()?t.createdAt:e.createdAt,modifiedAt:o.modifiedAt,filePath:o.filePath,filePaths:s}}function Yo(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function H_(t){let e=0,r=0,n=0,s=0,o=0,i;for(let a of t){if(!Ic(a.type)||!a.tokens)continue;let l=Yo(a.tokens.input),c=Yo(a.tokens.cached),u=Math.max(l-c,0),d=Yo(a.tokens.output),f=Yo(a.tokens.thoughts);e+=l,r+=c,n+=d,s+=f,o=l,i={inputTokens:u,cachedInputTokens:c,cacheWriteInputTokens:0,outputTokens:d,reasoningOutputTokens:f,totalTokens:l+d+f}}return{totalInputTokens:e,totalCachedInputTokens:r,totalOutputTokens:n,totalReasoningOutputTokens:s,lastInputTokens:o,lastTokenUsage:i}}function SA(t){return hA("sha256").update(t).digest("hex")}function hs(t,e){let r=e;for(;r&&!t.has(r);){t.add(r);let n=wA(r);if(n===r)break;r=n}}var zo,J_=b(()=>{"use strict";or();kc();ve();zo=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(e={}){let r=e.geminiDir||Ye(ke,".gemini");this.geminiProjectsFile=Ye(r,"projects.json"),this.geminiTmpDir=Ye(r,"tmp");let n=e.claudeDir||Ye(ke,".claude");this.claudeProjectsDir=Ye(n,"projects");let s=[Ye(ke,".codex"),Ye(ke,".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=>Ye(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=TA(s),i=r.get(o);r.set(o,i?bA(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 Re(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 h=Lr(g.timestamp),T=g.type,w=me(B_(g.content));if(q_(T)){let k=w.trim();k&&(u||(u=K(k,80)),d=K(k,80)),o.push({role:"user",timestamp:h,content:k||w});continue}if(Ic(T)){g.model&&(f=g.model);for(let k of g.thoughts||[]){let N=[k.subject,k.description].filter(Boolean).join(`
|
|
1342
|
+
`).trim();N&&o.push({role:"thinking",timestamp:Lr(k.timestamp,h),content:me(N)})}o.push({role:"assistant",timestamp:h,content:w,model:g.model});continue}let E=T?`[${T}] `:"";o.push({role:"system",timestamp:h,content:`${E}${w}`.trim()})}let m=Lr(n.startTime,s.createdAt),p=Lr(n.lastUpdated,s.modifiedAt),_=H_(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:_.totalInputTokens||void 0,totalCachedInputTokens:_.totalCachedInputTokens||void 0,totalOutputTokens:_.totalOutputTokens||void 0,totalReasoningOutputTokens:_.totalReasoningOutputTokens||void 0,lastInputTokens:_.lastInputTokens||void 0,lastTokenUsage:_.lastTokenUsage,messages:o}}async extractSummary(e){let r=await this.readSessionFile(e);if(!r)return null;let n=await Re(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(q_(m.type)){d++;let p=B_(m.content).trim();p&&(l||(l=K(me(p),80)),c=K(me(p),80))}else Ic(m.type)&&(d++,m.model&&(u=m.model));let f=H_(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 W_(e,"utf-8");if(ps(r)==="unknown")return z({event:"gemini_session_format_unknown",provider:"gemini",file:e,preview:r.slice(0,120),message:`gemini session file at ${e} matches neither old (.json with messages[]) nor new (.jsonl with kind metadata) format. Skipping; lmctl ls / audit / stats will not see this session.`}),null;try{return Ko(r)}catch{return null}}extractSessionIdFromFilename(e){let r=yA(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 _s(this.geminiTmpDir)}catch{return e}for(let n of r){let s=Ye(this.geminiTmpDir,n,"chats");if(!(await Vo(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await _s(s)}catch{continue}for(let a of i)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||e.push(Ye(s,a)))}return e}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await gA(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 Re(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;hs(e,EA());for(let n of this.extraWorkspacePaths)hs(e,n);for(let n of await this.collectGeminiProjectPaths())hs(e,n);for(let n of await this.collectCodexCwds())hs(e,n);for(let n of await this.collectClaudeCwds())hs(e,n);let r=new Map;for(let n of e)r.set(SA(n),n);return this.workspaceHashMap=r,r}async collectGeminiProjectPaths(){let e;try{e=await W_(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 De(s,1).catch(()=>[]))[0]?.payload?.cwd;i&&e.add(i)}}return[...e]}async collectClaudeCwds(){let e=new Set,r;try{r=await _s(this.claudeProjectsDir)}catch{return[]}for(let n of r){let s=Ye(this.claudeProjectsDir,n);if(!(await Vo(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await _s(s)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=Ye(s,a),u=(await De(l,1).catch(()=>[]))[0]?.cwd;u&&e.add(u)}}return[...e]}async findJsonlFiles(e){let r=[];if(!(await Vo(e).catch(()=>null))?.isDirectory())return r;let s;try{s=await _s(e)}catch{return r}for(let o of s){let i=Ye(e,o),a=await Vo(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 vA,writeFileSync as kA,mkdirSync as IA}from"node:fs";import{join as NA,dirname as AA}from"node:path";import{randomUUID as xA}from"node:crypto";function Ac(t){return new Nc(t)}var Nc,xc=b(()=>{"use strict";J_();Ut();Rr();It();kc();Nc=class extends Le{constructor(e){super({provider:new zo(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",Te,"-y","--skip-trust"],resumeTemplate:"gemini --resume {{session_id}} --skip-trust",startTemplate:"gemini --skip-trust",transport:(r,n)=>nn(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(`
|
|
1343
|
+
`)}manualSeedHint(e){return{launchCommand:`cd ${e} && gemini --skip-trust`,postLaunchNote:Do,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=vA(n,"utf-8"),o=ps(s),i=Ko(s),a=xA();i.sessionId=a,i.kind="main";let l=AA(n),c=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),u=o==="jsonl"?".jsonl":".json",d=`session-${c}-${a.slice(0,8)}${u}`,f=NA(l,d);return IA(l,{recursive:!0}),kA(f,U_(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 X_,readFile as RA,rm as LA,stat as sn}from"node:fs/promises";import{basename as $A,join as mt}from"node:path";function OA(t){let e={};for(let r of t.split(`
|
|
1344
|
+
`)){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 $r(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}async function jA(t){let e=0;for await(let r of He(t))(r.type==="user.message"||r.type==="assistant.message"&&(r.data?.content||"").trim())&&e++;return e}var Zo,G_=b(()=>{"use strict";or();Zo=class{name="copilot";sessionStateDir;constructor(e={}){let r=e.copilotDir||mt(ke,".copilot");this.sessionStateDir=mt(r,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await X_(this.sessionStateDir)}catch{return e}for(let n of r){let s=mt(this.sessionStateDir,n);if((await sn(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=mt(r,"events.jsonl"),o=await sn(s).catch(()=>null),i=o?s:mt(r,"workspace.yaml"),a=await Re(o?s:r),l=[],c=n?.cwd||"(unknown workspace)",u,d,f,m,p,_,g=n?.id||$A(r)||e;if(o)for await(let h of He(s)){let T=$r(h.timestamp)||a.modifiedAt;if(h.type==="session.start"&&h.data){h.data.sessionId&&(g=h.data.sessionId),h.data.copilotVersion&&(d=h.data.copilotVersion),h.data.startTime&&(_=$r(h.data.startTime)),h.data.selectedModel&&(u=h.data.selectedModel),h.data.context&&(h.data.context.cwd&&(c=h.data.context.cwd),h.data.context.branch&&(f=h.data.context.branch));continue}if(h.type==="session.model_change"&&h.data?.newModel){u=h.data.newModel;continue}if(h.type==="user.message"&&h.data){let w=h.data.content||"",E=w.trim();E&&(m||(m=K(E,80)),p=K(E,80)),l.push({role:"user",timestamp:T,content:me(E||w)});continue}if(h.type==="assistant.message"&&h.data){let w=(h.data.content||"").trim();if(w&&l.push({role:"assistant",timestamp:T,content:me(w),model:u}),h.data.toolRequests)for(let E of h.data.toolRequests)l.push({role:"tool_use",timestamp:T,content:E.name||"unknown tool",toolName:E.name,toolInput:E.arguments?JSON.stringify(E.arguments,null,2):void 0,toolCallId:E.toolCallId});continue}if(h.type==="tool.execution_complete"&&h.data){let w=h.data.result?.content||"",E=h.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:T,content:me(w),toolDetailedContent:E?me(E):void 0,toolCallId:h.data.toolCallId});continue}if(h.type==="assistant.reasoning"&&h.data?.content){l.push({role:"thinking",timestamp:T,content:me(h.data.content)});continue}if(h.type==="session.error"||h.type==="session.warning"||h.type==="session.info"||h.type==="system.message"){let w=h.data?.message||"";w.trim()&&l.push({role:"system",timestamp:T,content:me(w)});continue}}if(!m){let h=(n?.summary||"").trim();h&&(m=K(h,80))}return{provider:"copilot",sessionId:g,cwd:c,createdAt:_??$r(n?.created_at)??a.createdAt,modifiedAt:$r(n?.updated_at)??a.modifiedAt,model:u,cliVersion:d,startCommand:"copilot",gitBranch:f,firstUserMessage:m,lastUserMessage:p,messageCount:l.filter(h=>h.role==="user"||h.role==="assistant").length,filePath:i,messages:l}}async extractSummary(e,r){let n=await this.readWorkspaceYaml(e),s=mt(e,"events.jsonl"),o=await sn(s).catch(()=>null),i=o?s:mt(e,"workspace.yaml"),a=await Re(o?s:e),l=o?await De(s,20):[],c=n?.id||r,u=n?.cwd||"(unknown workspace)",d,f,m,p,_;for(let h of l)if(h.type==="session.start"&&h.data&&(h.data.sessionId&&(c=h.data.sessionId),h.data.copilotVersion&&(f=h.data.copilotVersion),h.data.startTime&&(m=$r(h.data.startTime)),h.data.selectedModel&&(d=h.data.selectedModel),h.data.context?.cwd&&(u=h.data.context.cwd)),h.type==="session.model_change"&&h.data?.newModel&&(d||(d=h.data.newModel)),h.type==="user.message"&&h.data){let T=(h.data.content||"").trim();T&&(p||(p=K(T,80)),_=K(T,80))}if(!p){let h=(n?.summary||"").trim();h&&(p=K(h,80))}let g=o?await jA(s):0;return{provider:"copilot",sessionId:c,cwd:u,createdAt:m??$r(n?.created_at)??a.createdAt,modifiedAt:$r(n?.updated_at)??a.modifiedAt,model:d,cliVersion:f,startCommand:"copilot",firstUserMessage:p,lastUserMessage:_,messageCount:g,filePath:i}}async readWorkspaceYaml(e){let r=mt(e,"workspace.yaml");try{let n=await RA(r,"utf-8");return OA(n)}catch{return null}}async resolveSessionPath(e){return this.resolveSessionDir(e)}async deleteSession(e){let r=await this.resolveSessionDir(e);return r?(await LA(r,{recursive:!0}),!0):!1}async resolveSessionDir(e){let r;try{r=await X_(this.sessionStateDir)}catch{return null}if(r.includes(e)){let s=mt(this.sessionStateDir,e);if((await sn(s).catch(()=>null))?.isDirectory())return s}let n=[];for(let s of r)if(s.startsWith(e)){let o=mt(this.sessionStateDir,s);(await sn(o).catch(()=>null))?.isDirectory()&&n.push(o)}if(n.length===1)return n[0];for(let s of r){let o=mt(this.sessionStateDir,s);if(!(await sn(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 Rc(t){return new Le({provider:new Zo(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"copilot",seedArgs:["-p",Te,"--yolo"],resumeTemplate:"copilot --resume={{session_id}}",startTemplate:"copilot",transport:(e,r)=>nn(e,{...r,acpTool:"copilot"})})}var Lc=b(()=>{"use strict";G_();Ut();Rr();It()});import{existsSync as K_,readdirSync as CA,statSync as V_}from"node:fs";import{join as lr}from"node:path";import{createRequire as MA}from"node:module";function Y_(){return $c===null&&($c=MA(import.meta.url)("node:sqlite").DatabaseSync),$c}function DA(){let t=process.env.XDG_DATA_HOME||lr(ke,".local","share"),e=process.env.XDG_CONFIG_HOME||lr(ke,".config");return[lr(t,"opencode","opencode.db"),lr(e,"opencode","opencode.db")]}function PA(){if(process.env.OPENCODE_DB)return[process.env.OPENCODE_DB];let t=process.env.XDG_DATA_HOME||lr(ke,".local","share"),e=lr(t,"lmplayer"),r=lr(e,"opencode-local.db"),n=[r];try{let s=CA(e).filter(o=>/^opencode.*\.db$/u.test(o)).map(o=>lr(e,o)).filter(o=>o!==r).sort((o,i)=>{try{return V_(i).mtimeMs-V_(o).mtimeMs}catch{return 0}});n.push(...s)}catch{}return n}function FA(t){return t==="lmplayer"?PA():DA()}var $c,on,Oc=b(()=>{"use strict";or();$c=null;on=class{name;startCommand;dbPaths;constructor(e){this.name=e?.providerName??"opencode",this.startCommand=e?.startCommand??this.name,e?.dbPath?this.dbPaths=[e.dbPath]:this.dbPaths=FA(this.name)}existingDbPaths(){return this.dbPaths.filter(e=>K_(e))}openDb(e){return K_(e)?new(Y_())(e,{open:!0,readOnly:!0}):null}async discoverSessions(){let e=[];for(let r of this.existingDbPaths()){let n=this.openDb(r);if(n)try{let s=new Map,o=n.prepare("SELECT id, worktree, name FROM project").all();for(let a of o)s.set(a.id,a);let i=n.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
|
|
1345
1345
|
s.time_created, s.time_updated
|
|
1346
1346
|
FROM session s
|
|
1347
1347
|
ORDER BY s.time_updated DESC`).all();for(let a of i){let l=s.get(a.project_id),c=a.directory||l?.worktree||"(unknown)",u=n.prepare(`SELECT m.id, m.data, m.time_created FROM message m
|
|
@@ -1354,47 +1354,47 @@ ${r}`:r}function L_(t,e){let r=rx[e.tool];return r?new Promise((n,s)=>{let o=e.b
|
|
|
1354
1354
|
FROM session s
|
|
1355
1355
|
WHERE s.id LIKE ?
|
|
1356
1356
|
ORDER BY s.time_updated DESC
|
|
1357
|
-
LIMIT 2`).all(`${r}%`);return s.length!==1?null:s[0]}}});function Cc(){return new jc}var jc,Mc=b(()=>{"use strict";Oc();Ut();Rr();It();jc=class extends Le{constructor(){super({provider:new on,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",Te],resumeTemplate:"opencode --session {{session_id}}",startTemplate:"opencode",transport:(e,r)=>nn(e,{...r,acpTool:"opencode"})})}seedArgsFor(e){let r=["run"];return e?.model&&r.push("--model",e.model),e?.effort&&r.push("--variant",e.effort),r.push(e?.prompt??Te),r}}});import{spawn as
|
|
1357
|
+
LIMIT 2`).all(`${r}%`);return s.length!==1?null:s[0]}}});function Cc(){return new jc}var jc,Mc=b(()=>{"use strict";Oc();Ut();Rr();It();jc=class extends Le{constructor(){super({provider:new on,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",Te],resumeTemplate:"opencode --session {{session_id}}",startTemplate:"opencode",transport:(e,r)=>nn(e,{...r,acpTool:"opencode"})})}seedArgsFor(e){let r=["run"];return e?.model&&r.push("--model",e.model),e?.effort&&r.push("--variant",e.effort),r.push(e?.prompt??Te),r}}});import{spawn as UA}from"node:child_process";import{mkdirSync as WA}from"node:fs";function Pc(t){return new Dc(t)}async function BA(t,e){let r=Date.now(),n=z_({prompt:t,sessionId:e.sessionId,model:e.model,effort:e.effort,formatJson:!0,permissionMode:e.permissionMode??"yolo"});ft("lmplayer",n,e.permissionMode??"yolo");let s=await Z_(e.binary,n,{cwd:e.cwd,env:Je(e.env,e.cwd,e.sessionId),signal:e.signal,onText:o=>{e.onProgress?.({kind:"text",summary:o.slice(0,120)}),e.onDelta?.(o)}});if(s.code!==0&&s.code!==null)throw new Error(s.stderr.trim().slice(0,200)||`lmplayer exited with code ${s.code}`);return{text:s.text.trim(),sessionId:s.sessionId??e.sessionId,durationMs:Date.now()-r}}function z_(t){let e=["run"];return t.model&&e.push("--model",t.model),t.sessionId&&e.push("--session",t.sessionId),t.formatJson&&e.push("--format","json"),t.effort&&e.push("--effort",t.effort),e.push(...ir("lmplayer",t.permissionMode)??[]),e.push(t.prompt),e}function Z_(t,e,r){return new Promise((n,s)=>{let o;try{o=UA(t,e,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(g){s(g);return}let i="",a="",l="",c,u,d=[],f=!1,m=r.timeoutMs===void 0?void 0:setTimeout(()=>{f||(f=!0,o.kill(),p(),s(new Error(`lmplayer seed timed out after ${r.timeoutMs}ms`)))},r.timeoutMs),p=()=>{m!==void 0&&clearTimeout(m)},_=g=>{let h=g.trim();if(!h)return;let T;try{T=JSON.parse(h)}catch{d.push(g),r.onText?.(g);return}if(!ei(T))return;let w=Qo(T,!1);c===void 0&&w!==void 0&&(c=w),u=Qo(T,!0)??u;let E=Q_(T);E&&(d.push(E),r.onText?.(E))};o.stdout?.on("data",g=>{let h=g.toString("utf8");i+=h,l+=h;let T=l.indexOf(`
|
|
1358
1358
|
`);for(;T>=0;){let w=l.slice(0,T);l=l.slice(T+1),_(w),T=l.indexOf(`
|
|
1359
|
-
`)}}),o.stderr?.on("data",g=>{a+=g.toString("utf8")}),r.signal&&(r.signal.aborted?o.kill():r.signal.addEventListener("abort",()=>o.kill(),{once:!0})),o.on("exit",g=>{f||(f=!0,p(),l.length>0&&_(l),n({code:g,stdout:i,stderr:a,sessionId:c??u,text:d.join("")}))}),o.on("error",g=>{f||(f=!0,p(),s(g))})})}function Q_(t){for(let e of["text","content","delta","output","message"]){let r=t[e];if(typeof r=="string")return r}for(let e of["data","event","payload","part"]){let r=t[e];if(ei(r)){let n=Q_(r);if(n)return n}}}function Qo(t,e){for(let n of["sessionID","sessionId","session_id"]){let s=t[n];if(typeof s=="string"&&s.length>0)return s}let r=t.session;if(typeof r=="string"&&r.length>0)return r;if(ei(r)){let n=Qo(r,e);if(n!==void 0)return n}if(e){let n=t.id;if(typeof n=="string"&&n.length>0)return n}for(let n of["data","event","payload","part"]){let s=t[n];if(ei(s)){let o=Qo(s,e);if(o!==void 0)return o}}}function ei(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Dc,Fc=b(()=>{"use strict";Oc();Ut();It();rn();rt();Dc=class extends Le{constructor(e){super({provider:new on({providerName:"lmplayer",startCommand:"lmplayer",dbPath:e?.lmplayerDbPath}),capabilities:{canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!0},injection:{leaderMode:"none"},binary:"lmplayer",seedArgs:["run","--format","json","--dangerously-skip-permissions",Te],resumeTemplate:"lmplayer run --session {{session_id}} --dangerously-skip-permissions",startTemplate:"lmplayer run --dangerously-skip-permissions",transport:
|
|
1359
|
+
`)}}),o.stderr?.on("data",g=>{a+=g.toString("utf8")}),r.signal&&(r.signal.aborted?o.kill():r.signal.addEventListener("abort",()=>o.kill(),{once:!0})),o.on("exit",g=>{f||(f=!0,p(),l.length>0&&_(l),n({code:g,stdout:i,stderr:a,sessionId:c??u,text:d.join("")}))}),o.on("error",g=>{f||(f=!0,p(),s(g))})})}function Q_(t){for(let e of["text","content","delta","output","message"]){let r=t[e];if(typeof r=="string")return r}for(let e of["data","event","payload","part"]){let r=t[e];if(ei(r)){let n=Q_(r);if(n)return n}}}function Qo(t,e){for(let n of["sessionID","sessionId","session_id"]){let s=t[n];if(typeof s=="string"&&s.length>0)return s}let r=t.session;if(typeof r=="string"&&r.length>0)return r;if(ei(r)){let n=Qo(r,e);if(n!==void 0)return n}if(e){let n=t.id;if(typeof n=="string"&&n.length>0)return n}for(let n of["data","event","payload","part"]){let s=t[n];if(ei(s)){let o=Qo(s,e);if(o!==void 0)return o}}}function ei(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Dc,Fc=b(()=>{"use strict";Oc();Ut();It();rn();rt();Dc=class extends Le{constructor(e){super({provider:new on({providerName:"lmplayer",startCommand:"lmplayer",dbPath:e?.lmplayerDbPath}),capabilities:{canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!0},injection:{leaderMode:"none"},binary:"lmplayer",seedArgs:["run","--format","json","--dangerously-skip-permissions",Te],resumeTemplate:"lmplayer run --session {{session_id}} --dangerously-skip-permissions",startTemplate:"lmplayer run --dangerously-skip-permissions",transport:BA})}seedArgsFor(e){return z_({prompt:e?.prompt??Te,model:e?.model,effort:e?.effort,formatJson:!0,permissionMode:"yolo"})}async seed(e,r){WA(e,{recursive:!0});let n=this.seedArgsFor(r);ft("lmplayer",n);try{let s=await Z_(this.binary,n,{cwd:e,env:Ft(void 0,e),timeoutMs:6e4});return s.code!==0&&s.code!==null?{success:!1,error:s.stderr.trim().slice(0,200)||`exit code ${s.code}`}:s.sessionId?{success:!0,sessionId:s.sessionId}:{success:!1,error:"lmplayer seed failed; provider did not report a sessionID"}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}manualSeedHint(e){return{launchCommand:`cd ${e} && lmplayer run --format json --dangerously-skip-permissions "${Te}"`,postLaunchNote:"Copy the sessionID reported by lmplayer into this member's sessionid= field.",lsCommand:`lmctl ls --provider lmplayer --sessiondir ${e}`}}}});import{readdir as ti,readFile as qA,rm as HA}from"node:fs/promises";import{basename as eh,join as cr}from"node:path";function th(t){return t.type==="user"||t.message?.role==="user"}function rh(t){return t.type==="assistant"||t.message?.role==="assistant"||t.message?.role==="model"}function nh(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(`
|
|
1360
1360
|
`):Array.isArray(e.parts)?e.parts.filter(r=>!r.thought&&r.type!=="thinking").map(r=>r.text||"").join(`
|
|
1361
|
-
`):"":""}function sh(t){return t.model||t.message?.model}var ri,oh=b(()=>{"use strict";or();ri=class{name="qwen";baseDir;constructor(e){this.baseDir=e?.qwenDir||cr(ke,".qwen")}async discoverSessions(){let e=cr(this.baseDir,"projects"),r;try{r=await ti(e)}catch{return[]}let n=[];for(let s of r){let o=cr(e,s,"chats"),i;try{i=await ti(o)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=cr(o,a);try{let u=await this.extractSummary(c,l);u&&n.push(u)}catch{}}}return n}async extractSummary(e,r){let n=await Pe(e,30);if(n.length===0)return null;let s=await Re(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)),th(d)){let f=nh(d).trim();f&&(l||(l=K(f,80)),c=K(f,80)),u++}if(rh(d)){let f=sh(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=eh(r,".jsonl");return this.loadFromFile(r,n)}async loadFromFile(e,r){let n=await Re(e),s="(unknown)",o,i,a,l,c,u,d=[];for await(let f of He(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(th(f)){let _=nh(f);_.trim()&&(c||(c=K(_.trim(),80)),u=K(_.trim(),80)),d.push({role:"user",timestamp:p,content:_})}else if(rh(f)){let _=sh(f);if(_&&(o=_),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:_}):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:_});else if(Array.isArray(m.parts))for(let g of m.parts)if(g.thought||g.type==="thinking"){let h=g.thinking||g.text;h&&d.push({role:"thinking",timestamp:p,content:h})}else g.text&&d.push({role:"assistant",timestamp:p,content:g.text,model:_})}}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=cr(this.baseDir,"projects");try{let n=await ti(r),s=[];for(let o of n){let i=cr(r,o,"chats",`${e}.jsonl`);try{return await qx(i,{flag:"r"}),i}catch{continue}}for(let o of n){let i=cr(r,o,"chats"),a;try{a=await ti(i)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;eh(l,".jsonl").startsWith(e)&&s.push(cr(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 Hx(r),!0}catch{return!1}}}});function Wc(){return new Uc}var Uc,Bc=b(()=>{"use strict";oh();Ut();Rr();It();Uc=class extends Le{constructor(){super({provider:new ri,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",Te,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:Jo})}}});import{readdir as ih,readFile as Jx,rm as ah,stat as lh}from"node:fs/promises";import{basename as qc,join as qt}from"node:path";async function Xx(t){let e=await Promise.all(t.map(r=>Re(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 Gx(t,e){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function ch(t){return t.type==="USER_INPUT"}function uh(t){return t.source==="MODEL"&&t.type==="PLANNER_RESPONSE"}function Kx(t){return t.source==="MODEL"&&t.type!=="PLANNER_RESPONSE"}function dh(t){if(!t)return"";let e=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(t);return e?e[1]:t}function fh(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 Vx(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}async function Yx(t){for await(let e of He(t)){let r=e.tool_calls?.map(s=>s.args)??[];for(let s of r){let o=zx(s);if(o)return o}let n=Zx(e.content);if(n)return n}return null}function zx(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 Zx(t){return t?/"Cwd":"([^"]+)"/.exec(t)?.[1]??null:null}function mh(t){if(t.endsWith(".db"))return qc(t,".db");let e="/brain/",r=t.indexOf(e);return r===-1?null:t.slice(r+e.length).split("/")[0]||null}var ni,ph=b(()=>{"use strict";or();ni=class{name="agy";baseDir;constructor(e={}){this.baseDir=e.agyDir||qt(ke,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:qt(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let e=qt(this.baseDir,"conversations"),r;try{r=await ih(e)}catch{return[]}let n=[];for(let s of r){if(!s.endsWith(".db"))continue;let o=qc(s,".db");try{let i=await this.extractSummary(o);i&&n.push(i)}catch{}}return n}conversationPath(e){return qt(this.baseDir,"conversations",`${e}.db`)}transcriptPath(e){return qt(this.baseDir,"brain",e,".system_generated","logs","transcript.jsonl")}async existingTranscriptPath(e){let r=this.transcriptPath(e);try{return await lh(r),r}catch{return null}}async extractSummary(e){let r=this.conversationPath(e),n=await this.existingTranscriptPath(e),s=n??r,o=await Xx([r,n].filter(Boolean)),i=await this.resolveCwd(e,n),a,l,c,u=0;if(n){let d=await Pe(n,80);for(let f of d){let m=fh(f.content);if(m&&(a=m),ch(f)){let p=dh(f.content).trim();p&&(l||(l=K(p,80)),c=K(p,80)),u++}else uh(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=mh(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 He(o)){let d=Gx(u.created_at,s.modifiedAt),f=fh(u.content);if(f&&(a=f),ch(u)){let m=dh(u.content),p=m.trim();p&&(l||(l=K(p,80)),c=K(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:Vx(m.args),toolName:m.name||"tool"});uh(u)&&u.content?i.push({role:"assistant",timestamp:d,content:u.content,model:a}):Kx(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 lh(r),r}catch{}let n=qt(this.baseDir,"conversations");try{let s=[];for(let o of await ih(n)){if(!o.endsWith(".db"))continue;qc(o,".db").startsWith(e)&&s.push(qt(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=mh(r);return n?(await ah(this.conversationPath(n),{force:!0}),await ah(qt(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 Yx(r);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(e){let r=qt(this.baseDir,"cache","last_conversations.json");try{let n=JSON.parse(await Jx(r,"utf8"));for(let[s,o]of Object.entries(n))if(o===e)return s}catch{}return null}}});import{spawn as Qx}from"node:child_process";function Jc(t){return new Hc(t)}async function eA(t,e){let r=Date.now(),n=["--conversation",e.sessionId,"-p",t,"--dangerously-skip-permissions","--print-timeout",rA(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 tA(e.binary,n,{cwd:e.cwd,env:Je(e.env,e.cwd,e.sessionId),signal:e.signal});return e.onProgress?.({kind:"system",summary:"agy -p one-shot completed"}),{text:s.trimEnd(),sessionId:e.sessionId,durationMs:Date.now()-r}}function tA(t,e,r){return new Promise((n,s)=>{let o;try{o=Qx(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 rA(t){return!t||t<=0?"8h":`${Math.max(1,Math.ceil(t/1e3))}s`}var Hc,Xc=b(()=>{"use strict";ph();Ut();It();rt();rn();Hc=class extends Le{constructor(e){super({provider:new ni(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",Te,"--dangerously-skip-permissions","--print-timeout","2m"],resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:eA})}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 nA}from"node:crypto";import{join as sA}from"node:path";function oA(t){return nA("sha256").update(t).digest("hex").slice(0,8)}function iA(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"session"}function aA(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 lA(t){return t.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function si(t){return Math.max(1,Math.ceil(t.length/4))}function _h(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 Vc(){return new Kc}var Or,Gc,Kc,Yc=b(()=>{"use strict";Or=new Map;Gc=class{name="ClaudeMock";async discoverSessions(){return[...Or.values()].map(_h)}async loadSession(e){let r=Or.get(e);return r===void 0?null:{..._h(r),messages:r.messages.slice()}}async resolveSessionPath(e){return Or.get(e)?.filePath??null}async deleteSession(e){return Or.delete(e)}},Kc=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new Gc;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=iA(aA(e,r)),s=`mock-${n}-${oA(`${e}:${n}`)}`,o=new Date,i=Or.get(s),a=r?.prompt??"ClaudeMock seed",l=si(a),c={sessionId:s,cwd:e,filePath:sA(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+=si("ACK: ClaudeMock seeded"),Or.set(s,c),{success:!0}}resumeCommand(e){return`ClaudeMock --resume ${e}`}startCommand(){return"ClaudeMock"}manualSeedHint(e){return{launchCommand:`cd ${e} && ClaudeMock`,postLaunchNote:"ClaudeMock is a hermetic test provider; no manual seed is required.",lsCommand:`lmctl ls --provider ClaudeMock --sessiondir ${e}`}}forkHint(e){return"ClaudeMock does not support fork."}async fork(e,r){return{success:!1,error:"ClaudeMock does not support fork."}}async sendTurn(e,r){let n=Date.now(),s=Or.get(r.sessionId);if(s===void 0)throw new Error(`ClaudeMock session not found: ${r.sessionId}`);let o=new Date,i=`ClaudeMock ack: ${lA(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+=si(e),s.totalOutputTokens+=si(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 Nt(t){let e=[Ec({claudeDir:t?.claudeDir}),Sc({codexDir:t?.codexDir,codeDir:t?.codeDir}),xc({geminiDir:t?.geminiDir,claudeDir:t?.claudeDir,codexDir:t?.codexDir,codeDir:t?.codeDir}),Rc({copilotDir:t?.copilotDir}),Cc(),Pc({lmplayerDbPath:t?.lmplayerDbPath}),Wc(),Jc({agyDir:t?.agyDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&e.push(Vc()),e}var zc=b(()=>{"use strict";Tc();vc();Ac();Lc();Mc();Fc();Bc();Xc();Yc();Tc();vc();Ac();Lc();Mc();Fc();Bc();Xc();Yc()});var tu={};se(tu,{ProviderRegistry:()=>cs,TransportConnectionError:()=>Ie,TransportError:()=>nt,TransportJsonError:()=>Po,TransportProcessError:()=>Wt,TransportRpcError:()=>Bt,_resetDefaultRegistryForTests:()=>cA,chat:()=>Ht,countTokens:()=>eu,createAdapterRegistry:()=>kt,createAllAdapters:()=>Nt,listSessions:()=>Qc,seed:()=>Zc});function ii(){return oi===null&&(oi=kt(Nt())),oi}function cA(){oi=null}function gh(t,e){let r=t.getAdapter(e);if(!r)throw new Error(`provider "${e}" is not registered in this registry`);return r}async function Ht(t){let e=t.registry??ii(),r=gh(e,t.provider),n={sessionId:t.sessionId,cwd:t.cwd,env:t.env,onDelta:t.onDelta,onProgress:t.onProgress,signal:t.signal,timeoutMs:t.timeoutMs,model:t.model,effort:t.effort,progPath:t.progPath,alias:t.alias,isLead:t.isLead,permissionMode:t.permissionMode},s=await r.sendTurn(t.prompt,n);return{text:s.text,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason,numTurns:s.numTurns,status:s.status,stalledAfterMs:s.stalledAfterMs}}async function Zc(t){let e=t.registry??ii(),r=gh(e,t.provider),n=await hh(e,t.provider,t.cwd),s=await r.seed(t.cwd,{model:t.model,effort:t.effort,prompt:t.prompt});if(!s.success)return{success:!1,error:s.error};if(s.sessionId)return{success:!0,sessionId:s.sessionId};let o=await hh(e,t.provider,t.cwd),i=uA(n,o);return i?{success:!0,sessionId:i}:{success:!0}}async function hh(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 uA(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 Qc(t={}){return(t.registry??ii()).listAll({provider:t.provider,workspace:t.workspace,limit:t.limit,from:t.from,to:t.to})}async function eu(t){let r=await(t.registry??ii()).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 oi,xt=b(()=>{"use strict";tc();zc();tc();zc();tn();oi=null});import{hostname as dA}from"node:os";async function ai(t){await pA(t.io,t.env);let e=await R(t.io,f=>f.listEnqueuedMailFromSender(t.sender.teamfile,t.sender.alias,t.receiver.teamfile,t.receiver.alias)),r=e.length===0?[]:await R(t.io,f=>f.claimMailForDelivery(e.map(m=>m.id),new Date().toISOString(),process.pid,dA())),n=fA(r,t.newMessage);if(n.length===0)throw new Error(`no queued mail to deliver for ${t.sender.teamfile}:${t.sender.alias} -> ${t.receiver.teamfile}:${t.receiver.alias}`);let s=!1,o=ue(),i=0,a=0,l=0,c={provider:t.receiver.provider,sessionId:t.receiver.sessionId,cwd:t.receiver.cwd,prompt:n,permissionMode:t.permissionMode,env:t.env,onDelta:f=>{s=!0,o&&(i+=1,l=Buffer.byteLength(f,"utf8"),a+=l),t.onDelta?.(f)},onProgress:f=>t.onProgress?.(f)};t.receiver.model!==void 0&&(c.model=t.receiver.model),t.receiver.effort!==void 0&&(c.effort=t.receiver.effort),c.alias=t.receiver.alias,c.isLead=t.receiver.isLead,t.idleTimeoutMs!==void 0&&(c.timeoutMs=t.idleTimeoutMs);let u;try{u=await Ht(c)}catch(f){throw await wh(t.io,r.map(m=>m.id)),f}if(o&&je(JSON.stringify({event:"chat_return",alias:t.receiver.alias,provider:t.receiver.provider,streamed:s,blockCount:i,streamedBytes:a,resultTextBytes:Buffer.byteLength(u.text,"utf8"),lastChunkBytes:l,tailPreview:u.text.slice(-200)})),u.status==="stalled")return await wh(t.io,r.map(f=>f.id)),{status:"stalled",receipt:u.text,prompt:n,queued:r,deliveredIds:[],wroteDelta:s,durationMs:u.durationMs,stalledAfterMs:u.stalledAfterMs};let d=r.map(f=>f.id);return await mA(t.io,d,u.text),{status:"ok",receipt:u.text,prompt:n,queued:r,deliveredIds:d,wroteDelta:s,durationMs:u.durationMs}}function fA(t,e){if(t.length===0)return e??"";let r=t.map((n,s)=>[`--- queued message ${s+1} (mail #${n.id}, sent ${n.created_at}) ---`,n.payload].join(`
|
|
1361
|
+
`):"":""}function sh(t){return t.model||t.message?.model}var ri,oh=b(()=>{"use strict";or();ri=class{name="qwen";baseDir;constructor(e){this.baseDir=e?.qwenDir||cr(ke,".qwen")}async discoverSessions(){let e=cr(this.baseDir,"projects"),r;try{r=await ti(e)}catch{return[]}let n=[];for(let s of r){let o=cr(e,s,"chats"),i;try{i=await ti(o)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=cr(o,a);try{let u=await this.extractSummary(c,l);u&&n.push(u)}catch{}}}return n}async extractSummary(e,r){let n=await De(e,30);if(n.length===0)return null;let s=await Re(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)),th(d)){let f=nh(d).trim();f&&(l||(l=K(f,80)),c=K(f,80)),u++}if(rh(d)){let f=sh(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=eh(r,".jsonl");return this.loadFromFile(r,n)}async loadFromFile(e,r){let n=await Re(e),s="(unknown)",o,i,a,l,c,u,d=[];for await(let f of He(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(th(f)){let _=nh(f);_.trim()&&(c||(c=K(_.trim(),80)),u=K(_.trim(),80)),d.push({role:"user",timestamp:p,content:_})}else if(rh(f)){let _=sh(f);if(_&&(o=_),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:_}):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:_});else if(Array.isArray(m.parts))for(let g of m.parts)if(g.thought||g.type==="thinking"){let h=g.thinking||g.text;h&&d.push({role:"thinking",timestamp:p,content:h})}else g.text&&d.push({role:"assistant",timestamp:p,content:g.text,model:_})}}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=cr(this.baseDir,"projects");try{let n=await ti(r),s=[];for(let o of n){let i=cr(r,o,"chats",`${e}.jsonl`);try{return await qA(i,{flag:"r"}),i}catch{continue}}for(let o of n){let i=cr(r,o,"chats"),a;try{a=await ti(i)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;eh(l,".jsonl").startsWith(e)&&s.push(cr(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 HA(r),!0}catch{return!1}}}});function Wc(){return new Uc}var Uc,Bc=b(()=>{"use strict";oh();Ut();Rr();It();Uc=class extends Le{constructor(){super({provider:new ri,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",Te,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:Jo})}}});import{readdir as ih,readFile as JA,rm as ah,stat as lh}from"node:fs/promises";import{basename as qc,join as qt}from"node:path";async function XA(t){let e=await Promise.all(t.map(r=>Re(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 GA(t,e){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function ch(t){return t.type==="USER_INPUT"}function uh(t){return t.source==="MODEL"&&t.type==="PLANNER_RESPONSE"}function KA(t){return t.source==="MODEL"&&t.type!=="PLANNER_RESPONSE"}function dh(t){if(!t)return"";let e=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(t);return e?e[1]:t}function fh(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 VA(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}async function YA(t){for await(let e of He(t)){let r=e.tool_calls?.map(s=>s.args)??[];for(let s of r){let o=zA(s);if(o)return o}let n=ZA(e.content);if(n)return n}return null}function zA(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 ZA(t){return t?/"Cwd":"([^"]+)"/.exec(t)?.[1]??null:null}function mh(t){if(t.endsWith(".db"))return qc(t,".db");let e="/brain/",r=t.indexOf(e);return r===-1?null:t.slice(r+e.length).split("/")[0]||null}var ni,ph=b(()=>{"use strict";or();ni=class{name="agy";baseDir;constructor(e={}){this.baseDir=e.agyDir||qt(ke,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:qt(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let e=qt(this.baseDir,"conversations"),r;try{r=await ih(e)}catch{return[]}let n=[];for(let s of r){if(!s.endsWith(".db"))continue;let o=qc(s,".db");try{let i=await this.extractSummary(o);i&&n.push(i)}catch{}}return n}conversationPath(e){return qt(this.baseDir,"conversations",`${e}.db`)}transcriptPath(e){return qt(this.baseDir,"brain",e,".system_generated","logs","transcript.jsonl")}async existingTranscriptPath(e){let r=this.transcriptPath(e);try{return await lh(r),r}catch{return null}}async extractSummary(e){let r=this.conversationPath(e),n=await this.existingTranscriptPath(e),s=n??r,o=await XA([r,n].filter(Boolean)),i=await this.resolveCwd(e,n),a,l,c,u=0;if(n){let d=await De(n,80);for(let f of d){let m=fh(f.content);if(m&&(a=m),ch(f)){let p=dh(f.content).trim();p&&(l||(l=K(p,80)),c=K(p,80)),u++}else uh(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=mh(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 He(o)){let d=GA(u.created_at,s.modifiedAt),f=fh(u.content);if(f&&(a=f),ch(u)){let m=dh(u.content),p=m.trim();p&&(l||(l=K(p,80)),c=K(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:VA(m.args),toolName:m.name||"tool"});uh(u)&&u.content?i.push({role:"assistant",timestamp:d,content:u.content,model:a}):KA(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 lh(r),r}catch{}let n=qt(this.baseDir,"conversations");try{let s=[];for(let o of await ih(n)){if(!o.endsWith(".db"))continue;qc(o,".db").startsWith(e)&&s.push(qt(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=mh(r);return n?(await ah(this.conversationPath(n),{force:!0}),await ah(qt(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 YA(r);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(e){let r=qt(this.baseDir,"cache","last_conversations.json");try{let n=JSON.parse(await JA(r,"utf8"));for(let[s,o]of Object.entries(n))if(o===e)return s}catch{}return null}}});import{spawn as QA}from"node:child_process";function Jc(t){return new Hc(t)}async function ex(t,e){let r=Date.now(),n=["--conversation",e.sessionId,"-p",t,"--dangerously-skip-permissions","--print-timeout",rx(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 tx(e.binary,n,{cwd:e.cwd,env:Je(e.env,e.cwd,e.sessionId),signal:e.signal});return e.onProgress?.({kind:"system",summary:"agy -p one-shot completed"}),{text:s.trimEnd(),sessionId:e.sessionId,durationMs:Date.now()-r}}function tx(t,e,r){return new Promise((n,s)=>{let o;try{o=QA(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 rx(t){return!t||t<=0?"8h":`${Math.max(1,Math.ceil(t/1e3))}s`}var Hc,Xc=b(()=>{"use strict";ph();Ut();It();rt();rn();Hc=class extends Le{constructor(e){super({provider:new ni(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",Te,"--dangerously-skip-permissions","--print-timeout","2m"],resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:ex})}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 nx}from"node:crypto";import{join as sx}from"node:path";function ox(t){return nx("sha256").update(t).digest("hex").slice(0,8)}function ix(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"session"}function ax(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 lx(t){return t.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function si(t){return Math.max(1,Math.ceil(t.length/4))}function _h(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 Vc(){return new Kc}var Or,Gc,Kc,Yc=b(()=>{"use strict";Or=new Map;Gc=class{name="ClaudeMock";async discoverSessions(){return[...Or.values()].map(_h)}async loadSession(e){let r=Or.get(e);return r===void 0?null:{..._h(r),messages:r.messages.slice()}}async resolveSessionPath(e){return Or.get(e)?.filePath??null}async deleteSession(e){return Or.delete(e)}},Kc=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new Gc;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=ix(ax(e,r)),s=`mock-${n}-${ox(`${e}:${n}`)}`,o=new Date,i=Or.get(s),a=r?.prompt??"ClaudeMock seed",l=si(a),c={sessionId:s,cwd:e,filePath:sx(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+=si("ACK: ClaudeMock seeded"),Or.set(s,c),{success:!0}}resumeCommand(e){return`ClaudeMock --resume ${e}`}startCommand(){return"ClaudeMock"}manualSeedHint(e){return{launchCommand:`cd ${e} && ClaudeMock`,postLaunchNote:"ClaudeMock is a hermetic test provider; no manual seed is required.",lsCommand:`lmctl ls --provider ClaudeMock --sessiondir ${e}`}}forkHint(e){return"ClaudeMock does not support fork."}async fork(e,r){return{success:!1,error:"ClaudeMock does not support fork."}}async sendTurn(e,r){let n=Date.now(),s=Or.get(r.sessionId);if(s===void 0)throw new Error(`ClaudeMock session not found: ${r.sessionId}`);let o=new Date,i=`ClaudeMock ack: ${lx(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+=si(e),s.totalOutputTokens+=si(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 Nt(t){let e=[Ec({claudeDir:t?.claudeDir}),Sc({codexDir:t?.codexDir,codeDir:t?.codeDir}),Ac({geminiDir:t?.geminiDir,claudeDir:t?.claudeDir,codexDir:t?.codexDir,codeDir:t?.codeDir}),Rc({copilotDir:t?.copilotDir}),Cc(),Pc({lmplayerDbPath:t?.lmplayerDbPath}),Wc(),Jc({agyDir:t?.agyDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&e.push(Vc()),e}var zc=b(()=>{"use strict";Tc();vc();xc();Lc();Mc();Fc();Bc();Xc();Yc();Tc();vc();xc();Lc();Mc();Fc();Bc();Xc();Yc()});var tu={};se(tu,{ProviderRegistry:()=>cs,TransportConnectionError:()=>Ie,TransportError:()=>nt,TransportJsonError:()=>Po,TransportProcessError:()=>Wt,TransportRpcError:()=>Bt,_resetDefaultRegistryForTests:()=>cx,chat:()=>Ht,countTokens:()=>eu,createAdapterRegistry:()=>kt,createAllAdapters:()=>Nt,listSessions:()=>Qc,seed:()=>Zc});function ii(){return oi===null&&(oi=kt(Nt())),oi}function cx(){oi=null}function gh(t,e){let r=t.getAdapter(e);if(!r)throw new Error(`provider "${e}" is not registered in this registry`);return r}async function Ht(t){let e=t.registry??ii(),r=gh(e,t.provider),n={sessionId:t.sessionId,cwd:t.cwd,env:t.env,onDelta:t.onDelta,onProgress:t.onProgress,signal:t.signal,timeoutMs:t.timeoutMs,model:t.model,effort:t.effort,progPath:t.progPath,alias:t.alias,isLead:t.isLead,permissionMode:t.permissionMode},s=await r.sendTurn(t.prompt,n);return{text:s.text,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason,numTurns:s.numTurns,status:s.status,stalledAfterMs:s.stalledAfterMs}}async function Zc(t){let e=t.registry??ii(),r=gh(e,t.provider),n=await hh(e,t.provider,t.cwd),s=await r.seed(t.cwd,{model:t.model,effort:t.effort,prompt:t.prompt});if(!s.success)return{success:!1,error:s.error};if(s.sessionId)return{success:!0,sessionId:s.sessionId};let o=await hh(e,t.provider,t.cwd),i=ux(n,o);return i?{success:!0,sessionId:i}:{success:!0}}async function hh(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 ux(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 Qc(t={}){return(t.registry??ii()).listAll({provider:t.provider,workspace:t.workspace,limit:t.limit,from:t.from,to:t.to})}async function eu(t){let r=await(t.registry??ii()).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 oi,At=b(()=>{"use strict";tc();zc();tc();zc();tn();oi=null});import{hostname as dx}from"node:os";async function ai(t){await px(t.io,t.env);let e=await R(t.io,f=>f.listEnqueuedMailFromSender(t.sender.teamfile,t.sender.alias,t.receiver.teamfile,t.receiver.alias)),r=e.length===0?[]:await R(t.io,f=>f.claimMailForDelivery(e.map(m=>m.id),new Date().toISOString(),process.pid,dx())),n=fx(r,t.newMessage);if(n.length===0)throw new Error(`no queued mail to deliver for ${t.sender.teamfile}:${t.sender.alias} -> ${t.receiver.teamfile}:${t.receiver.alias}`);let s=!1,o=ue(),i=0,a=0,l=0,c={provider:t.receiver.provider,sessionId:t.receiver.sessionId,cwd:t.receiver.cwd,prompt:n,permissionMode:t.permissionMode,env:t.env,onDelta:f=>{s=!0,o&&(i+=1,l=Buffer.byteLength(f,"utf8"),a+=l),t.onDelta?.(f)},onProgress:f=>t.onProgress?.(f)};t.receiver.model!==void 0&&(c.model=t.receiver.model),t.receiver.effort!==void 0&&(c.effort=t.receiver.effort),c.alias=t.receiver.alias,c.isLead=t.receiver.isLead,t.idleTimeoutMs!==void 0&&(c.timeoutMs=t.idleTimeoutMs);let u;try{u=await Ht(c)}catch(f){throw await wh(t.io,r.map(m=>m.id)),f}if(o&&je(JSON.stringify({event:"chat_return",alias:t.receiver.alias,provider:t.receiver.provider,streamed:s,blockCount:i,streamedBytes:a,resultTextBytes:Buffer.byteLength(u.text,"utf8"),lastChunkBytes:l,tailPreview:u.text.slice(-200)})),u.status==="stalled")return await wh(t.io,r.map(f=>f.id)),{status:"stalled",receipt:u.text,prompt:n,queued:r,deliveredIds:[],wroteDelta:s,durationMs:u.durationMs,stalledAfterMs:u.stalledAfterMs};let d=r.map(f=>f.id);return await mx(t.io,d,u.text),{status:"ok",receipt:u.text,prompt:n,queued:r,deliveredIds:d,wroteDelta:s,durationMs:u.durationMs}}function fx(t,e){if(t.length===0)return e??"";let r=t.map((n,s)=>[`--- queued message ${s+1} (mail #${n.id}, sent ${n.created_at}) ---`,n.payload].join(`
|
|
1362
1362
|
`));return e!==void 0&&r.push(["--- new message ---",e].join(`
|
|
1363
1363
|
`)),r.join(`
|
|
1364
1364
|
|
|
1365
|
-
`)}async function
|
|
1365
|
+
`)}async function mx(t,e,r){if(e.length!==0)try{await R(t,n=>{n.markMailDelivered(e,r,new Date().toISOString())})}catch(n){t.stderr.write(`warning: failed to mark queued mailbox mail delivered: ${n instanceof Error?n.message:String(n)}
|
|
1366
1366
|
`)}}async function wh(t,e){if(e.length!==0)try{await R(t,r=>{r.clearMailDelivery(e)})}catch(r){t.stderr.write(`warning: failed to clear queued mailbox delivery marker: ${r instanceof Error?r.message:String(r)}
|
|
1367
|
-
`)}}async function
|
|
1367
|
+
`)}}async function px(t,e){try{await R(t,r=>{r.reclaimStaleMailboxDeliveries(new Date(Date.now()-_x(e)).toISOString())})}catch{}}function _x(t){let e=t.LMCTL_MAILBOX_DELIVERY_STALE_MS;if(e===void 0||e.trim()==="")return yh;let r=Number(e);return!Number.isFinite(r)||r<=0?yh:r}var yh,ru=b(()=>{"use strict";At();ve();ge();yh=8*60*60*1e3});function gs(t){return`lmctl ${t}: LMCTL_SELF_SESSIONID is not set \u2014 it looks like you are running lmctl
|
|
1368
1368
|
manually, outside a member session that lmctl started. Running lmctl this way is
|
|
1369
1369
|
not officially supported.
|
|
1370
1370
|
To experiment with it manually: https://lmctl.com/lmctl/docs/manual-invocation`}function an(t){return`lmctl ${t}: LMCTL_SELF_SESSIONID is set but does not match any member of a registered team.
|
|
1371
1371
|
The session marker may be stale or the team may not be registered in this lmctl database.
|
|
1372
1372
|
To experiment with it manually: https://lmctl.com/lmctl/docs/manual-invocation`}function nu(t){return`unknown option --from
|
|
1373
|
-
${gs(t)}`}function li(t,e){let r=[];for(let n of t){if(n==="--from"||n.startsWith("--from="))return{args:t,error:nu(e)};if(n.startsWith("I_am="))return{args:t,error:`unknown argument: ${n}`};r.push(n)}return{args:r}}function ln(t,e){let r=su(t,e);return r.ok?{ok:!0,identity:r.identity,source:"session"}:r}function su(t,e){let r=t[
|
|
1373
|
+
${gs(t)}`}function li(t,e){let r=[];for(let n of t){if(n==="--from"||n.startsWith("--from="))return{args:t,error:nu(e)};if(n.startsWith("I_am="))return{args:t,error:`unknown argument: ${n}`};r.push(n)}return{args:r}}function ln(t,e){let r=su(t,e);return r.ok?{ok:!0,identity:r.identity,source:"session"}:r}function su(t,e){let r=t[xr];if(r===void 0||r.length===0)return{ok:!1,reason:"unset"};let n=[];for(let o of e.listRootTeams()){let i=qe(o.teamfile_path,e);for(let a of i.members)a.teamfile===void 0&&a.session===r&&n.push(`${o.teamfile_path}:${a.alias}`)}let s=[...new Set(n)];if(s.length===0)return{ok:!1,reason:"not-found"};if(s.length>1)throw new Error("LMCTL_SELF_SESSIONID matches multiple team members; the team registry is ambiguous");return{ok:!0,identity:s[0]}}var ys=b(()=>{"use strict";rt();tt()});import{existsSync as hx}from"node:fs";import{dirname as Eh}from"node:path";function wx(t){return gx.test(t)||yx.test(t)}function Th(t){return ci.test(t)}function jr(t){if(!t.includes(":"))return null;let e=t.lastIndexOf(":"),r=t.slice(0,e),n=t.slice(e+1);return!r.endsWith(".lmctl")||!ci.test(n)?null:{teamfile:r,alias:n}}function Pe(t,e,r){if(!t.endsWith(".lmctl"))throw new be(`lmctl: "${t}" doesn't look like a teamfile (expected .lmctl extension).`);if(!Th(e))throw new be(`lmctl: "${e}" is not a valid alias (must match ${ci.source}).`);let n=ye(t,r);if(r===void 0&&!hx(n))throw new be(`lmctl: teamfile not found: ${t}`);let s;try{s=qe(n,r)}catch(i){throw new be(`lmctl: ${t}: ${i instanceof Error?i.message:String(i)}`)}if(s.parseErrors.length>0)throw new be(`lmctl: ${t}: ${s.parseErrors.join("; ")}`);let o=$o(s,e);if(o===void 0){let i=s.members.map(a=>a.alias).join(", ")||"(none)";throw new be(`lmctl: alias "${e}" not found in ${t}.
|
|
1374
1374
|
Known aliases: ${i}`)}if(o.teamfile!==void 0){let i=Ql(o,Eh(n));return{teamfile:n,alias:o.alias,provider:i.provider,sessionid:i.session,sessiondir:i.sessiondir,isLead:!0,...i.model??o.model?{model:i.model??o.model}:{},...i.effort??o.effort?{effort:i.effort??o.effort}:{}}}if(o.session===void 0)throw new be(`lmctl: alias "${o.alias}" in ${t} has no session ID yet.
|
|
1375
1375
|
Run: lmctl seed ${t}`);return{teamfile:n,alias:o.alias,provider:o.provider,sessionid:o.session,sessiondir:o.sessiondir??Eh(n),isLead:et(s)?.alias===o.alias,...o.model!==void 0?{model:o.model}:{},...o.effort!==void 0?{effort:o.effort}:{}}}function ur(t,e){let{target:r,alias:n,flags:s}=e;if(s.run!==void 0||s.project!==void 0||s.workflow!==void 0){if(r!==void 0)return{mode:"error",message:`lmctl ${t.name}: --run/--project/--workflow (managed mode) are mutually exclusive with a positional target "${r}" \u2014 pick one form.`};let i={mode:"managed"};return s.run!==void 0&&(i.run=s.run),s.project!==void 0&&(i.project=s.project),s.workflow!==void 0&&(i.workflow=s.workflow),i}if(r!==void 0){let i=jr(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?Th(n)?{mode:"ai-team",teamfile:r,alias:n}:{mode:"error",message:`lmctl ${t.name}: "${n}" is not a valid alias (must match ${ci.source}).`}:t.allowsBareTeamfile?{mode:"ai-team",teamfile:r}:{mode:"error",message:`lmctl ${t.name}: alias required.
|
|
1376
|
-
Use: lmctl ${t.name} ${r}:<alias> or lmctl ${t.name} ${r} <alias>`};if(
|
|
1376
|
+
Use: lmctl ${t.name} ${r}:<alias> or lmctl ${t.name} ${r} <alias>`};if(wx(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.
|
|
1377
1377
|
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}".
|
|
1378
1378
|
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.
|
|
1379
|
-
Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var be,
|
|
1380
|
-
`),2}function
|
|
1381
|
-
`),i.push(l)}return i}async function
|
|
1379
|
+
Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var be,gx,yx,ci,xt=b(()=>{"use strict";vt();tt();be=class extends Error{constructor(e){super(e),this.name="ChatTargetError"}},gx=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,yx=/^ses_[A-Za-z0-9_-]+$/,ci=/^[A-Za-z][A-Za-z0-9_-]*$/});function ws(t){let e=jr(t);if(e===null)throw new Error(`invalid agent identity: ${t}`);return{teamfile:e.teamfile,alias:e.alias,value:t}}var ou=b(()=>{"use strict";xt()});var fu={};se(fu,{deliveryLockKey:()=>uu,runDeliveryWorker:()=>Wx,runNotifyMe:()=>Ax});import{spawn as Ex}from"node:child_process";import{hostname as cu}from"node:os";async function Ax(t,e={stdout:process.stdout,stderr:process.stderr},r={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(Tx),0;let n=li(t,"notify_me");if(n.error!==void 0)return cn(e,n.error);let s=P(n.args,["--interval","--timeout"],["--json"]);if(s.error!==void 0)return cn(e,s.error);if(s.positionals.length>1)return cn(e,`unexpected positional: ${s.positionals[1]}`);let o=Ah(L(s,"--interval"),"--interval",bx);if(typeof o=="string")return cn(e,o);let i=Ah(L(s,"--timeout"),"--timeout",Sx);if(typeof i=="string")return cn(e,i);let a=e.env??process.env,l,c;try{l=await Ox(e,{teamfile:s.positionals[0]}),c=await jx(e,l)}catch(O){return cn(e,O instanceof Error?O.message:String(O))}let u=C(s,"--json"),d=xx(a,c),f=[],m=!1;c!==null&&(f=await Mx(c,e,r.spawnDelivery),m=f.some(O=>O.status==="error"));let p=await R(e,O=>Es(O,l,c));dR(e,{identity:c?.value??null,sending:p.sending,working:p.working,queued:p.queued,finished:[],receipts:[]},u);let _=r.sleep??(O=>new Promise(x=>setTimeout(x,O))),g=r.now??(()=>Date.now()),h=r.appearanceGraceMs??gR(),T=r.reclaimStaleMs??hR("LMCTL_NOTIFY_ME_RECLAIM_STALE_MS",kx),w=g(),E=new Date(w).toISOString(),k=sR(l,E),N=w+i,H=w+h,ne=new Set;await R(e,O=>Zx(O,g(),T)),Oe({event:"notify_me",record_kind:"notify_me_detail",phase:"start",actor:d,scope:l,started_at:E,notifier:k,intervalMs:o,timeoutMs:i,appearanceGraceMs:h,reclaimStaleMs:T,dbPath:le()});let q=(O,x)=>(Rx({actor:d,scope:l,startedAtMs:w,now:g,delivery:f,result:O,exitCode:x,deliveryHadError:m}),x);for(;;){let O=await R(e,x=>Gx(x,{scope:l,snapshotIds:ne,nowMs:g(),notifyMeStartedAt:E,notifier:k,reclaimStaleMs:T,mailboxSender:c}));if(O.finished!==null||O.receipts.length>0){let x=await R(e,U=>Es(U,l,c)),X={status:"completed",identity:c?.value??null,sending:x.sending,working:x.working,queued:x.queued,finished:lR(O.finished,O.receipts),in_flight:x.working,receipts:O.receipts.map(Oh)};return ui(e,X,u,!u),q(X,m?1:0)}if(ne.size>0||O.hasComingMail){if(g()>=N){let x=await R(e,U=>Es(U,l,c)),X={status:"timeout",identity:c?.value??null,sending:x.sending,working:x.working,queued:x.queued,finished:[],in_flight:x.working,receipts:[]};return ui(e,X,u,!u),q(X,1)}await _(xh(g(),o,N));continue}if(g()>=N){let x=await R(e,U=>Es(U,l,c)),X={status:"timeout",identity:c?.value??null,sending:x.sending,working:x.working,queued:x.queued,finished:[],in_flight:[],receipts:[]};return ui(e,X,u,!u),q(X,1)}if(g()>=H){let x=await R(e,U=>Es(U,l,c)),X={status:"idle",identity:c?.value??null,sending:x.sending,working:x.working,queued:x.queued,finished:[],in_flight:[],receipts:[]};return ui(e,X,u,!u),q(X,m?1:0)}await _(xh(g(),o,H,N))}}function cn(t,e){return t.stderr.write(`error: ${e}
|
|
1380
|
+
`),2}function xx(t,e){return{session_id:t[xr]??null,identity:e?.value??null,teamfile:e?.teamfile??null,alias:e?.alias??null}}function Rx(t){Oe({event:"notify_me",record_kind:"notify_me_detail",phase:"finish",actor:t.actor,scope:t.scope,outcome:t.result.status,exit_code:t.exitCode,duration_ms:Math.max(0,t.now()-t.startedAtMs),delivery_had_error:t.deliveryHadError,flush:Lx(t.delivery),returned:$x(t.result)})}function Lx(t){let e=0,r=0,n=0,s=0,o=0,i=0;for(let a of t)e+=a.pending_count,a.status==="delivered"?r+=a.delivered_ids.length:a.status==="spawned"?n+=1:a.status==="skipped-busy"?s+=1:a.status==="skipped-active"?o+=1:a.status==="error"&&(i+=1);return{lane_count:t.length,pending_count:e,delivered_count:r,spawned_count:n,skipped_busy_count:s,skipped_active_count:o,error_count:i,lanes:t}}function $x(t){return{status:t.status,identity:t.identity,sending_count:t.sending.length,working_count:t.working.length,queued_count:t.queued.length,finished_count:t.finished.length,receipt_count:t.receipts.length,finished:t.finished}}async function Ox(t,e){if(e.teamfile!==void 0)return await R(t,n=>({kind:"team",teamfile:ye(e.teamfile,n)}));let r=t.env??process.env;return await R(t,n=>{let s=ln(r,n);if(s.ok)return{kind:"from",from:s.identity};throw s.reason==="unset"?new Error(gs("notify_me")):new Error(an("notify_me"))})}async function jx(t,e){if(e.kind==="from")return ws(e.from);let r=t.env??process.env;return await R(t,n=>{try{let s=su(r,n);return s.ok?ws(s.identity):null}catch{return null}})}function Es(t,e,r){let n=lu(t,e).sort((i,a)=>i.id-a.id),s=n.filter(Nh).map(oR),o=new Set(r===null?[]:s.filter(i=>i.from_identity===r.value).map(i=>i.receiver));return{sending:s,working:n.filter(i=>!Nh(i)).map(iR),queued:r===null?[]:Cx(r.value,t.listOutboundPendingForSender(r.teamfile,r.alias),t).filter(i=>!o.has(i.receiver))}}function Cx(t,e,r){return au(e).map(n=>({sender:t,receiver:`${n.receiverTeamfile}:${n.receiverAlias}`,pending_count:n.rows.length,busy:zr(r,n.receiverTeamfile,n.receiverAlias),oldest_created_at:n.rows[0].created_at,newest_created_at:n.rows[n.rows.length-1].created_at,ids:n.rows.map(s=>s.id)}))}async function Mx(t,e,r=Ux){let n=e.env??process.env;if((await R(e,a=>au(a.listOutboundPendingForSender(t.teamfile,t.alias)))).length===0)return[];let o=await R(e,a=>au(a.listOutboundPendingForSender(t.teamfile,t.alias))),i=[];for(let a of o){let l=await Px(e,n,t,a,r);l.status==="error"&&e.stderr.write(`warning: notify_me delivery trigger failed for ${l.receiver}: ${l.error}
|
|
1381
|
+
`),i.push(l)}return i}async function Dx(t,e,r,n){let s=new Date(Date.now()-Xx(n)).toISOString(),o=await R(r,l=>l.tryAcquireRuntimeProcessLock(vh,t.value,Ts,s));if(!o.acquired)return{acquired:!1,current:o.current};await R(r,l=>l.clearRuntimeProcessLock(vh,t.value,Ts,o.lock.lock_id)).catch(()=>{});let i=uu(t.value,e),a=await R(r,l=>l.tryAcquireRuntimeProcessLock(iu,i,Ts,s));return a.acquired?{acquired:!0,scope:iu,key:i,id:a.lock.lock_id}:{acquired:!1,current:a.current}}function uu(t,e){return`${t}\0${e}`}async function Px(t,e,r,n,s){let o=`${n.receiverTeamfile}:${n.receiverAlias}`,i=n.rows.length;if(await R(t,u=>zr(u,n.receiverTeamfile,n.receiverAlias)))return{receiver:o,status:"skipped-busy",pending_count:i};let l=await Dx(r,o,t,e);if(!l.acquired)return{receiver:o,status:"skipped-active",pending_count:i};let c=null;try{let u=await R(t,m=>Pe(n.receiverTeamfile,n.receiverAlias,m));c=(await R(t,m=>m.startTrackedInvocation({kind:"chat",origin:"agent",scope_teamfile:n.receiverTeamfile,from_identity:r.value,target_teamfile:n.receiverTeamfile,target_alias:n.receiverAlias,root_teamfile:r.teamfile,cwd:u.sessiondir??null,command:`lmctl chat ${JSON.stringify(n.receiverTeamfile)} ${n.receiverAlias} ${JSON.stringify("[queued mail]")}`,holder_pid:null,holder_host:cu(),meta:JSON.stringify({lmctl_notify_me_delivery:!0,pending_count:i,provider:u.provider,model:u.model??null,sessionid:u.sessionid??null})}))).id;let f=await s({trackedId:c,sender:r,receiverTeamfile:n.receiverTeamfile,receiverAlias:n.receiverAlias,lockKey:l.key,lockId:l.id,env:e});if(f===null)throw new Error("delivery worker spawn failed");return await Fx(t,c,f),{receiver:o,status:"spawned",pending_count:i,tracked_invocation_id:c}}catch(u){return c!==null&&await R(t,d=>d.finishTrackedInvocation(c,{status:"error",error:u instanceof Error?u.message:String(u),result_summary:u instanceof Error?u.message:String(u),exit_code:1})).catch(()=>{}),await R(t,d=>d.clearRuntimeProcessLock(l.scope,l.key,Ts,l.id)).catch(()=>{}),{receiver:o,status:"error",pending_count:i,error:u instanceof Error?u.message:String(u)}}}async function Fx(t,e,r){let n=new Date().toISOString();await R(t,s=>{s.db.prepare(`
|
|
1382
1382
|
UPDATE tracked_invocation
|
|
1383
1383
|
SET holder_pid = ?,
|
|
1384
1384
|
holder_host = ?,
|
|
1385
1385
|
last_heartbeat_at = ?
|
|
1386
1386
|
WHERE id = ?
|
|
1387
1387
|
AND status = 'running'
|
|
1388
|
-
`).run(r,cu(),n,e)}).catch(()=>{})}async function
|
|
1388
|
+
`).run(r,cu(),n,e)}).catch(()=>{})}async function Ux(t){let e=process.argv[1];if(e===void 0||e.length===0)return null;let r=Ex(process.execPath,[e,"__deliver-lane",String(t.trackedId),t.sender.teamfile,t.sender.alias,t.receiverTeamfile,t.receiverAlias,t.lockId],{detached:!0,env:t.env,stdio:"ignore"});return r.unref(),r.pid??null}async function Wx(t,e={stdout:process.stdout,stderr:process.stderr}){let r=Bx(t);if(r===null)return e.stderr.write(`error: invalid delivery worker arguments
|
|
1389
1389
|
`),2;let{trackedIdRaw:n,senderTeamfile:s,senderAlias:o,receiverTeamfile:i,receiverAlias:a,lockId:l}=r,c=Number(n);if(!Number.isInteger(c)||c<=0)return e.stderr.write(`error: invalid delivery worker arguments
|
|
1390
|
-
`),2;let u=uu(`${s}:${o}`,`${i}:${a}`),d=e.env??process.env,f=
|
|
1390
|
+
`),2;let u=uu(`${s}:${o}`,`${i}:${a}`),d=e.env??process.env,f=Hx(e,c),m="error",p="",_=null,g=1,h=[];try{let T=await Jx(e,d,{teamfile:s,alias:o,value:`${s}:${o}`},{receiverTeamfile:i,receiverAlias:a,rows:[]});T.status==="delivered"?(m="done",p=T.receipt,h=T.delivered_ids,g=0):T.status==="skipped-busy"?(m="busy",p=`receiver busy: ${T.receiver}`,g=1):T.status==="error"?(m="error",_=T.error,p=T.error,g=1):(m="error",_=`unexpected delivery worker result: ${T.status}`,p=_,g=1)}catch(T){m="error",_=T instanceof Error?T.message:String(T),p=_,g=1}finally{f!==void 0&&clearInterval(f),await qx(e,c,{status:m,result_summary:p,error:_,exit_code:g},h),await R(e,T=>T.clearRuntimeProcessLock(iu,u,Ts,l)).catch(()=>{})}return g===0?0:1}function Bx(t){if(t.length!==6||t.some(a=>a.includes("\0")))return null;let[e,r,n,s,o,i]=t;return e===void 0||r===void 0||n===void 0||s===void 0||o===void 0||i===void 0?null:{trackedIdRaw:e,senderTeamfile:r,senderAlias:n,receiverTeamfile:s,receiverAlias:o,lockId:i}}async function qx(t,e,r,n){await R(t,s=>{if(r.status!=="done"||n.length===0){s.finishTrackedInvocation(e,r);return}let o=[...new Set(n.map(a=>Math.trunc(a)).filter(a=>Number.isInteger(a)&&a>0))],i=new Date().toISOString();s.db.exec("BEGIN IMMEDIATE");try{if(s.finishTrackedInvocation(e,r)!==null){let l=s.db.prepare(`
|
|
1391
1391
|
UPDATE agent_mailbox
|
|
1392
1392
|
SET waited_at = ?,
|
|
1393
1393
|
waited_by = ?
|
|
1394
1394
|
WHERE id = ?
|
|
1395
1395
|
AND delivered_at IS NOT NULL
|
|
1396
1396
|
AND waited_at IS NULL
|
|
1397
|
-
`);for(let c of o)l.run(i,`chat:${e}`,c)}s.db.exec("COMMIT")}catch(a){throw s.db.inTransaction&&s.db.exec("ROLLBACK"),a}}).catch(()=>{})}function
|
|
1397
|
+
`);for(let c of o)l.run(i,`chat:${e}`,c)}s.db.exec("COMMIT")}catch(a){throw s.db.inTransaction&&s.db.exec("ROLLBACK"),a}}).catch(()=>{})}function Hx(t,e){let r=setInterval(()=>{R(t,n=>n.heartbeatTrackedInvocation(e)).catch(()=>{})},Ix);return r.unref?.(),r}async function Jx(t,e,r,n){let s=`${n.receiverTeamfile}:${n.receiverAlias}`,o=n.rows.length;if(await R(t,l=>zr(l,n.receiverTeamfile,n.receiverAlias)))return{receiver:s,status:"skipped-busy",pending_count:o};let a=null;try{let l=await R(t,d=>Pe(n.receiverTeamfile,n.receiverAlias,d)),c=await R(t,d=>nr(d,{receiver_teamfile:n.receiverTeamfile,receiver_alias:n.receiverAlias,sender_teamfile:r.teamfile,sender_alias:r.alias,ttlMs:sr()}));if(!c.acquired)return{receiver:s,status:"skipped-busy",pending_count:o};a=c.lease;let u=await ai({sender:r,receiver:{teamfile:n.receiverTeamfile,alias:n.receiverAlias,provider:l.provider,sessionId:l.sessionid,cwd:l.sessiondir,...l.model!==void 0?{model:l.model}:{},...l.effort!==void 0?{effort:l.effort}:{},...l.isLead!==void 0?{isLead:l.isLead}:{}},io:t,permissionMode:"yolo",env:e});return u.status==="stalled"?{receiver:s,status:"error",pending_count:o,error:"provider stalled"}:{receiver:s,status:"delivered",pending_count:o,delivered_ids:u.deliveredIds,receipt:u.receipt}}catch(l){return{receiver:s,status:"error",pending_count:o,error:l instanceof Error?l.message:String(l)}}finally{a!==null&&await R(t,l=>l.releaseAgentInflight(a)).catch(()=>{})}}function au(t){let e=new Map;for(let r of t){let n=`${r.receiver_teamfile}\0${r.receiver_alias}`,s=e.get(n);s===void 0?e.set(n,[r]):s.push(r)}return[...e.values()].map(r=>({receiverTeamfile:r[0].receiver_teamfile,receiverAlias:r[0].receiver_alias,rows:r.sort((n,s)=>n.id-s.id)})).sort((r,n)=>r.rows[0].id-n.rows[0].id)}function Xx(t){let e=t.LMCTL_NOTIFY_ME_DELIVERY_LOCK_STALE_MS??t.LMCTL_PUSH_LOCK_STALE_MS;if(e===void 0||e.trim()==="")return kh;let r=Number(e);return!Number.isFinite(r)||r<=0?kh:r}function Gx(t,e){let r=new Set(t.reclaimStaleMailboxDeliveries(new Date(e.nowMs-e.reclaimStaleMs).toISOString()).map(l=>l.id)),n=Kx(t,e.mailboxSender,e.scope,e.notifier,r),s=Ih(t,e);if(s!==null)return{finished:s,running:lu(t,e.scope),receipts:n.receipts,hasComingMail:n.hasComingMail};if(e.snapshotIds.size===0)for(let l of lu(t,e.scope))e.snapshotIds.add(l.id);let i=[...e.snapshotIds].map(l=>Qx(t,l,e.nowMs,e.reclaimStaleMs)).filter(l=>l!==null).filter(rR).sort((l,c)=>l.id-c.id);e.snapshotIds.clear();for(let l of i)e.snapshotIds.add(l.id);return{finished:Ih(t,e),running:i,receipts:n.receipts,hasComingMail:n.hasComingMail}}function Ih(t,e){for(let r of zx(t,e.scope)){let n=t.claimTrackedInvocationNotification(r.id,e.notifier);if(n!==null)return n}return null}function Kx(t,e,r,n,s){if(e===null)return{receipts:[],hasComingMail:!1};let o=new Date().toISOString();t.db.exec("BEGIN IMMEDIATE");try{let i=t.db.prepare(`
|
|
1398
1398
|
SELECT id FROM agent_mailbox
|
|
1399
1399
|
WHERE sender_teamfile = ?
|
|
1400
1400
|
AND sender_alias = ?
|
|
@@ -1407,7 +1407,7 @@ ${gs(t)}`}function li(t,e){let r=[];for(let n of t){if(n==="--from"||n.startsWit
|
|
|
1407
1407
|
waited_by = ?
|
|
1408
1408
|
WHERE id = ?
|
|
1409
1409
|
AND waited_at IS NULL
|
|
1410
|
-
`).run(o,n,u).changes===1){let f=t.getMailboxMessage(u);f!==null&&a.push(f)}let l=
|
|
1410
|
+
`).run(o,n,u).changes===1){let f=t.getMailboxMessage(u);f!==null&&a.push(f)}let l=Vx(t,e,s),c=Yx(t,r);return t.db.exec("COMMIT"),{receipts:a,hasComingMail:l||c}}catch(i){throw t.db.inTransaction&&t.db.exec("ROLLBACK"),i}}function Vx(t,e,r){if(r.size===0)return t.db.prepare(`
|
|
1411
1411
|
SELECT 1 FROM agent_mailbox
|
|
1412
1412
|
WHERE sender_teamfile = ?
|
|
1413
1413
|
AND sender_alias = ?
|
|
@@ -1422,7 +1422,7 @@ ${gs(t)}`}function li(t,e){let r=[];for(let n of t){if(n==="--from"||n.startsWit
|
|
|
1422
1422
|
AND delivering_at IS NOT NULL
|
|
1423
1423
|
AND id NOT IN (${s})
|
|
1424
1424
|
LIMIT 1
|
|
1425
|
-
`).get(e.teamfile,e.alias,...n)!=null}function
|
|
1425
|
+
`).get(e.teamfile,e.alias,...n)!=null}function Yx(t,e){return e.kind==="team"?t.db.prepare(`
|
|
1426
1426
|
SELECT 1 FROM tracked_invocation
|
|
1427
1427
|
WHERE scope_teamfile = ?
|
|
1428
1428
|
AND status = 'running'
|
|
@@ -1432,7 +1432,7 @@ ${gs(t)}`}function li(t,e){let r=[];for(let n of t){if(n==="--from"||n.startsWit
|
|
|
1432
1432
|
WHERE from_identity = ?
|
|
1433
1433
|
AND status = 'running'
|
|
1434
1434
|
LIMIT 1
|
|
1435
|
-
`).get(e.from)!=null}function lu(t,e){return e.kind==="team"?t.listRunningTrackedInvocations({scope_teamfile:e.teamfile,limit:1e3}):t.listRunningTrackedInvocations({from:e.from,limit:1e3})}function
|
|
1435
|
+
`).get(e.from)!=null}function lu(t,e){return e.kind==="team"?t.listRunningTrackedInvocations({scope_teamfile:e.teamfile,limit:1e3}):t.listRunningTrackedInvocations({from:e.from,limit:1e3})}function zx(t,e){return e.kind==="team"?t.listClaimableTerminalTrackedInvocations({scope_teamfile:e.teamfile,limit:1e3}):t.listClaimableTerminalTrackedInvocations({from:e.from,limit:1e3})}function Zx(t,e,r){let n=[];for(let s of t.listAllRunningTrackedInvocations()){if(!Lh(s,e,r))continue;let o=Rh(t,s);o!==null&&nR(o)&&n.push(o)}return n}function Qx(t,e,r,n){let s=t.getTrackedInvocation(e);return s===null||s.status!=="running"||!Lh(s,r,n)?s:Rh(t,s)??t.getTrackedInvocation(s.id)}function Rh(t,e){return t.reclaimTrackedInvocationIfUnchanged(e.id,{holder_pid:e.holder_pid,holder_host:e.holder_host,started_at:e.started_at,last_heartbeat_at:e.last_heartbeat_at},{status:"error",error:Sh,result_summary:Sh})}function Lh(t,e,r){return t.holder_host===cu()&&tR(t.holder_pid)?!rr(t.holder_pid):eR(t,e,r)}function eR(t,e,r){let n=Date.parse(t.last_heartbeat_at??t.started_at);return Number.isFinite(n)&&e-n>r}function tR(t){return Number.isInteger(t)&&(t??0)>0}function rR(t){return t.status==="running"}function nR(t){return Nx.has(t.status)}function du(t){return t.target_teamfile===null||t.target_alias===null?null:`${t.target_teamfile}:${t.target_alias}`}function $h(t){if(t.meta===null||t.meta.trim()==="")return{};try{let e=JSON.parse(t.meta);return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:{}}catch{return{}}}function Nh(t){return t.kind==="chat"&&$h(t).lmctl_notify_me_delivery===!0}function sR(t,e){let r=t.kind==="team"?t.teamfile:t.from;return`notify_me:${process.pid}:${t.kind}:${r}:${e}`}function oR(t){let e=$h(t),r=typeof e.pending_count=="number"&&Number.isFinite(e.pending_count)?e.pending_count:null;return{id:t.id,kind:t.kind,status:"running",from_identity:t.from_identity,receiver:du(t)??"(unknown)",pending_count:r,started_at:t.started_at}}function iR(t){return{id:t.id,kind:t.kind,status:"running",from_identity:t.from_identity,target:du(t),target_alias:t.target_alias,started_at:t.started_at}}function aR(t){let e=uR(t);return{source:"tracked",id:t.id,kind:t.kind,status:t.status,from_identity:t.from_identity,scope_teamfile:t.scope_teamfile,target_teamfile:t.target_teamfile,target_alias:t.target_alias,target:du(t),result_summary:e,result:e,completed_at:t.ended_at}}function lR(t,e){let r=[];return t!==null&&r.push(aR(t)),r.push(...e.map(Oh)),r}function Oh(t){let e=cR(t.receipt??"");return{source:"receipt",id:t.id,receiver:`${t.receiver_teamfile}:${t.receiver_alias}`,delivered_at:t.delivered_at??t.created_at,receipt:e,result:e}}function cR(t){let e=t.replace(/\s+/g," ").trim();return e.length===0?"(empty)":e.length<=240?e:`${e.slice(0,239)}\u2026`}function uR(t){let r=(t.result_summary??t.error??t.status).replace(/\s+/g," ").trim();return r.length===0?"(empty)":r.length<=240?r:`${r.slice(0,239)}\u2026`}function dR(t,e,r){if(r){t.stderr.write(`${JSON.stringify({event:"status",...e})}
|
|
1436
1436
|
`);return}let n={...t,stdout:t.stderr};e.identity!==null&&n.stdout.write(`identity: ${e.identity}
|
|
1437
1437
|
`),jh(n,e.sending,e.working,e.queued,e.finished)}function ui(t,e,r,n=!0){if(r){F(t,e);return}if(n&&(e.identity!==null&&t.stdout.write(`identity: ${e.identity}
|
|
1438
1438
|
`),jh(t,e.sending,e.working,e.queued,e.finished)),e.status==="idle"){t.stdout.write(`notify_me: idle (nothing landed)
|
|
@@ -1450,7 +1450,7 @@ ${gs(t)}`}function li(t,e){let r=[];for(let n of t){if(n==="--from"||n.startsWit
|
|
|
1450
1450
|
`),e.length===0){t.stdout.write(` none
|
|
1451
1451
|
`);return}for(let r of e)r.source==="receipt"?t.stdout.write(` receipt ${r.id} to ${r.receiver} ${r.result}
|
|
1452
1452
|
`):(t.stdout.write(` job ${r.id} ${r.status} ${r.kind}`),r.target!==null&&t.stdout.write(` ${r.target}`),t.stdout.write(` ${r.result}
|
|
1453
|
-
`))}function
|
|
1453
|
+
`))}function Ah(t,e,r){return t===void 0?r:_R(t,e)}function _R(t,e){let r=Number(t);return!Number.isFinite(r)||r<=0?`${e} must be a positive number of seconds`:Math.max(1,Math.ceil(r*1e3))}function hR(t,e){let r=process.env[t];if(r===void 0||r.trim()==="")return e;let n=Number(r);return!Number.isFinite(n)||n<=0?e:Math.max(1,Math.ceil(n))}function gR(){let t=process.env.LMCTL_NOTIFY_ME_APPEARANCE_GRACE_MS;if(t===void 0||t.trim()==="")return bh;let e=Number(t);return Number.isFinite(e)?Math.min(vx,Math.max(0,Math.ceil(e))):bh}function xh(t,e,...r){let n=Math.min(...r);return Math.min(e,Math.max(1,n-t))}var Tx,bx,Sx,bh,vx,kx,Ix,Nx,Sh,iu,vh,Ts,kh,mu=b(()=>{"use strict";es();vo();ge();Ve();tt();Oo();ru();ys();ou();xt();ve();rt();Tx=`usage: lmctl notify_me [teamfile] [--interval <seconds>] [--timeout <seconds>] [--json]
|
|
1454
1454
|
|
|
1455
1455
|
I'm done with this round; my delegations are all running in the background;
|
|
1456
1456
|
I'm taking a break \u2014 notify me when something lands.
|
|
@@ -1467,7 +1467,7 @@ Exit codes:
|
|
|
1467
1467
|
0 completed or idle (inspect status in output/JSON)
|
|
1468
1468
|
1 timeout
|
|
1469
1469
|
2 usage or scope error
|
|
1470
|
-
`,
|
|
1470
|
+
`,bx=3e3,Sx=8*60*60*1e3,bh=0,vx=3e4,kx=8*60*60*1e3,Ix=3e4,Nx=new Set(["done","error","busy","cancelled"]),Sh="reclaimed: holder process not alive",iu="cli:notify_me-delivery",vh="cli:push",Ts="lock",kh=12e4});function yR(){return pu===null&&(pu=kt(Nt())),pu}async function dn(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 ER(t)}catch(i){throw s=!0,o=i,i}finally{if(n)if(!s)un.delete(r),e.setMemberState(r,"idle");else{let i=wR(o,r);e.setMemberState(r,i!==null?"attention_needed":"idle",i)}}}function wR(t,e){if(!(t instanceof Ne))return un.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=(un.get(e)??0)+1;return r>=3?(un.delete(e),"consecutive_timeouts"):(un.set(e,r),null)}return un.delete(e),null}async function ER(t){let e=t.timeoutMs,r=typeof e=="number"&&e>0,n=yR(),s;try{let u=await n.resolveSession(t.sessionid);if(!u)return Promise.reject(new Ne("other",null,`library: sessionid "${t.sessionid}" matched no registered provider`,_u(t.sessionid,t.sessiondir,"unresolved")));s=u.provider.name}catch(u){return Promise.reject(new Ne("other",null,`library: session resolution failed: ${Mh(u)}`,_u(t.sessionid,t.sessiondir,"unresolved")))}let o=_u(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 Ht({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 Ne("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 Ne("timeout",null,`library: wall-clock timeout after ${e??0}ms`,o):TR(u,o)}finally{a!==null&&clearTimeout(a)}}function _u(t,e,r){return["<library>","chat",t,e,"--provider",r]}function Mh(t){return t instanceof Error?t.message:String(t)}function TR(t,e){if(t instanceof Ne)return t;if(t instanceof Ie){let r=t.cause;return r?.code==="ENOENT_CWD"?new Ne("sessiondir_missing",null,t.message,e):r?.code==="ENOENT"?new Ne("enoent",null,t.message,e):new Ne("other",null,t.message,e)}return t instanceof Wt?new Ne("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof Bt?new Ne("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof nt?new Ne("other",null,t.message,e):new Ne("other",null,Mh(t),e)}var Ne,pu,un,bs=b(()=>{"use strict";At();Ne=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"}},pu=null;un=new Map});function Dh(){return hu===null&&(hu=kt(Nt())),hu}function SR(t,e){if(!bR.test(t))return t;let r=e.getConfig(`workspace.${t}`);if(r===null||r.length===0)throw new Ae("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 fn(t){let e=SR(t.member.provider,t.dal),r=e===t.member.provider?t.member:{...t.member,provider:e},n=await vR({member:r});return t.dal.setMemberProviderResolved(t.member.id,e),{sessionid:n.sessionid,provider_resolved:e}}async function vR(t){let e=t.member.provider,r=t.member.sessiondir,n=gu("seed",r,e);try{let s=await Zc({provider:e,cwd:r,registry:Dh()});if(!s.success)throw IR(s.error,n);if(!s.sessionId)throw new Ae("parse",0,"",n);return{sessionid:s.sessionId}}catch(s){throw s instanceof Ae?s:yu(s,n)}}async function Ph(t){return kR(t)}async function kR(t){let e=Dh(),r=gu("tokens",t.sessionid,"unresolved"),n;try{let o=await e.resolveSession(t.sessionid);if(!o)throw new Ae("parse",0,`library: sessionid "${t.sessionid}" matched no registered provider`,r);n=o.provider.name}catch(o){throw o instanceof Ae?o:yu(o,r)}let s=gu("tokens",t.sessionid,n);try{let o=await eu({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 Ae?o:yu(o,s)}}function gu(t,e,r){return["<library>",t,e,"--provider",r]}function IR(t,e){let r=t??"";if(/\bENOENT\b/i.test(r))return new Ae("enoent",null,r,e);if(/timed?\s*out/i.test(r))return new Ae("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 Ae("nonzero_exit",Number(n[1]),r,e)}return new Ae("other",null,r,e)}function yu(t,e){return t instanceof Ae?t:t instanceof Ie?t.cause?.code==="ENOENT"?new Ae("enoent",null,t.message,e):new Ae("other",null,t.message,e):t instanceof Wt?new Ae("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof Bt?new Ae("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof nt?new Ae("other",null,t.message,e):new Ae("other",null,t instanceof Error?t.message:String(t),e)}var Ae,hu,bR,di=b(()=>{"use strict";At();Ae=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"}},hu=null;bR=/^provider[123]$/});function fi(t){return Buffer.from(t,"utf8").toString("base64url")}function vs(t){return Buffer.from(t,"base64url").toString("utf8")}async function Fh(t,e=r=>Ph({sessionid:r})){if(process.env.LMCTL_SESSION_SIZE_DISABLED==="1")return{recorded:0,failed:0};let r=0,n=0;for(let s of NR(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 Uh(t,e,r){let n=Wh(t,e,r);if(n===null||n.member.sessionid===null)throw new Error("session member not found");if(n.member.state!=="idle")throw new Ss(r,n.member.state);t.setMemberState(n.member.id,"in_chat","compacting");try{return await dn({sessionid:n.member.sessionid,sessiondir:n.member.sessiondir,prompt:"/compact"}),t.setMemberState(n.member.id,"idle",null),{ok:!0,row:Bh(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 wu(t,e,r){let n=Wh(t,e,r);if(n===null)throw new Error("session member not found");let s=await fn({member:n.member,dal:t});return t.updateTeamMemberSession(n.member.id,s.sessionid),{ok:!0,sessionid:s.sessionid,row:Bh(t,e,r)}}function NR(t){return t.listTeams().flatMap(e=>t.listTeamMembers(e.id).filter(r=>r.sessionid!==null).map(r=>({team_name:e.name,member:r})))}function Wh(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 Bh(t,e,r){return t.sessionSizeHistory(e,r,1)[0]??null}var Ss,mi=b(()=>{"use strict";bs();di();Ss=class extends Error{constructor(e,r){super(`member ${e} is currently ${r}; cannot compact while busy`),this.name="MemberBusyError"}}});async function Eu(t){let e=t.dal,r=t.nowMs??Date.now(),n=t.thresholdMs??xR(e),s=r-n,o=e.query(`
|
|
1471
1471
|
SELECT
|
|
1472
1472
|
isess.id AS interactive_session_id,
|
|
1473
1473
|
isess.run_id,
|
|
@@ -1493,10 +1493,10 @@ Exit codes:
|
|
|
1493
1493
|
JOIN step s ON s.id = isess.step_id
|
|
1494
1494
|
WHERE isess.status = 'waiting_agent'
|
|
1495
1495
|
AND r.terminal_state IS NULL
|
|
1496
|
-
`),i={scanned:o.length,hung_detected:0,attentions_created:0,duplicates_suppressed:0};for(let a of o){let l=$R(a.workflow_definition,a.session_state_name,a.step_state_name);if(l===null)continue;let c=RR(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:
|
|
1496
|
+
`),i={scanned:o.length,hung_detected:0,attentions_created:0,duplicates_suppressed:0};for(let a of o){let l=$R(a.workflow_definition,a.session_state_name,a.step_state_name);if(l===null)continue;let c=RR(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:xe(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,LR(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 xR(t){return qh(t.getConfig(pi),AR)*1e3}function Tu(t,e){return qh(t.getConfig(_i),e)}function qh(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 RR(t,e,r){return t.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",e,r)[0]??null}function LR(t,e,r,n){return t.query(`SELECT * FROM attention
|
|
1497
1497
|
WHERE kind = 'session_hung'
|
|
1498
1498
|
AND run_id = ?
|
|
1499
|
-
AND acknowledged_at IS NULL`,e).some(o=>{let i=Hh(o.payload);return i!==null&&i.step_id===r&&i.session_id===n})}function $R(t,e,r){let n=Hh(t);return n===null?null:OR(n,e,r)??jR(n,e,r)}function OR(t,e,r){if(!Array.isArray(t.steps))return null;let n=t.steps.filter(CR),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=Cr(s.members)?s.members:null,i=o!==null&&Cr(o.agent)?o.agent:null;return typeof i?.alias=="string"?i.alias:null}function jR(t,e,r){if(!Cr(t.states))return null;let n=t.states[e]??t.states[r];if(!Cr(n))return null;let s=n;if(!Cr(s.agent))return null;let o=s.agent;return typeof o.alias=="string"?o.alias:null}function CR(t){return Cr(t)}function Hh(t){if(t===null)return null;try{let e=JSON.parse(t);return Cr(e)?e:null}catch{return null}}function Cr(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var pi,_i,
|
|
1499
|
+
AND acknowledged_at IS NULL`,e).some(o=>{let i=Hh(o.payload);return i!==null&&i.step_id===r&&i.session_id===n})}function $R(t,e,r){let n=Hh(t);return n===null?null:OR(n,e,r)??jR(n,e,r)}function OR(t,e,r){if(!Array.isArray(t.steps))return null;let n=t.steps.filter(CR),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=Cr(s.members)?s.members:null,i=o!==null&&Cr(o.agent)?o.agent:null;return typeof i?.alias=="string"?i.alias:null}function jR(t,e,r){if(!Cr(t.states))return null;let n=t.states[e]??t.states[r];if(!Cr(n))return null;let s=n;if(!Cr(s.agent))return null;let o=s.agent;return typeof o.alias=="string"?o.alias:null}function CR(t){return Cr(t)}function Hh(t){if(t===null)return null;try{let e=JSON.parse(t);return Cr(e)?e:null}catch{return null}}function Cr(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var pi,_i,AR,bu=b(()=>{"use strict";Be();pi="monitor.session_hung.elapsed_threshold_seconds",_i="monitor.session_hung.check_interval_ms",AR=600});function gi(t){let e=t.query(`
|
|
1500
1500
|
SELECT status, COUNT(*) AS count FROM job GROUP BY status
|
|
1501
1501
|
`),r={queued:hi(e,"queued"),running:hi(e,"running"),done:hi(e,"done"),failed:hi(e,"failed"),total:vu(e)},n=t.query(`
|
|
1502
1502
|
SELECT terminal_state, COUNT(*) AS count FROM run GROUP BY terminal_state
|
|
@@ -1597,9 +1597,9 @@ Exit codes:
|
|
|
1597
1597
|
WHERE run_id = ?
|
|
1598
1598
|
AND kind = 'session_hung'
|
|
1599
1599
|
AND acknowledged_at IS NULL
|
|
1600
|
-
ORDER BY id ASC`,e).map(k=>({kind:k.kind,severity:k.severity,payload:GR(k.payload)})),E=h.map(k=>{let N=f.get(k),H=p.get(k),ne=WR(s,k,T,N,H),q=N===void 0?null:Date.parse(N.started_at),O=N?.ended_at===null||N===void 0?null:Date.parse(N.ended_at),
|
|
1600
|
+
ORDER BY id ASC`,e).map(k=>({kind:k.kind,severity:k.severity,payload:GR(k.payload)})),E=h.map(k=>{let N=f.get(k),H=p.get(k),ne=WR(s,k,T,N,H),q=N===void 0?null:Date.parse(N.started_at),O=N?.ended_at===null||N===void 0?null:Date.parse(N.ended_at),x=N===void 0||Number.isNaN(q??NaN)?null:O!==null&&!Number.isNaN(O)?O-q:ne==="running"||ne==="paused"?n-q:null,X=N===void 0?null:_.get(N.id)??null,U=KR(H?.last_activity_at??null,X,g),I=o===null||H===void 0?void 0:HR(t,s.team_id,o.definition,H.state_name,N?.state_name??k);return{step_id:N?.id??null,state_id:k,status:ne,started_at:N?.started_at??null,ended_at:N?.ended_at??null,last_activity_at:U,elapsed_ms:x,...I!==void 0?{member:I}:{},...H!==void 0?{interactive_session:{id:H.id,status:H.status,turn_count:H.turn_count,state_name:H.state_name}}:{}}});return{run_id:e,workflow_name:o?.name??null,workflow_version:i?.version??o?.version??null,workflow_version_id:s.workflow_version_id,project:l?.name??null,status:qR(s,a,E),submitted_at:a?.enqueued_at??s.started_at,nodes:E,current_node_index:BR(E,s.terminal_state!==null),related_attentions:w}}function vi(t,e={}){let r=e.nowMs??Date.now(),n=[],s=t.workflow_name??"?",o=t.workflow_version!==null?`v${t.workflow_version}`:"v?";n.push(`run ${t.run_id} - ${s}, ${o} - ${t.status}`);let i=`${t.submitted_at} (${Xh(Date.parse(t.submitted_at),r)} ago)`;n.push(`project: ${t.project??"?"} | submitted: ${i}`),n.push(""),n.push("timeline:"),n.push(`${Jh(t.submitted_at,t.submitted_at)} submit`);for(let a of t.nodes){let l=a.started_at===null?"[ ]":Jh(t.submitted_at,a.started_at),c=a.status.padEnd(7),u=a.elapsed_ms===null?"":` elapsed ${ki(a.elapsed_ms)}`;if(n.push(`${l} ${a.state_id.padEnd(24)} ${c}${u}`.trimEnd()),a.interactive_session!==void 0){let d=a.last_activity_at===null?"last activity unknown":`last activity ${Xh(a.last_activity_at,r)} ago`,f=a.member!==void 0?`${a.member.alias} member`:"interactive member";n.push(` ${" ".repeat(24)} ${d}`),n.push(` ${" ".repeat(24)} ${f}, ${a.interactive_session.status}`)}}if(t.related_attentions.length>0){n.push(""),n.push("attentions:");for(let a of t.related_attentions)n.push(`- ${a.kind}${VR(a.payload)}`)}return`${n.join(`
|
|
1601
1601
|
`)}
|
|
1602
|
-
`}function FR(t,e,r){let n=t.nodes.filter(s=>s.startsWith("@terminal:")?!1:t.nodeTypes.get(s)!=="lmctl/terminal"&&t.nodeTypes.get(s)!=="Terminal");for(let s of e){let o=r(s.state_name);n.includes(o)||n.push(o)}return n}function UR(t){return t===null?null:t.startsWith("__paused__:")?t.slice(11):t}function WR(t,e,r,n,s){return n===void 0?"pending":n.ended_at===null?s?.status==="waiting_operator"||t.paused_at!==null&&r===e?"paused":"running":n.outcome===null?"failed":"done"}function BR(t,e){if(t.length===0)return null;let r=t.findIndex(s=>s.status==="running"||s.status==="paused"||s.status==="failed");if(r>=0)return r;if(e){for(let s=t.length-1;s>=0;s-=1)if(t[s].status==="done")return s}let n=t.findIndex(s=>s.status==="pending");return n>=0?n:t.length-1}function qR(t,e,r){return t.terminal_state!==null?t.terminal_state:t.paused_at!==null?"paused":e?.status==="failed"||r.some(n=>n.status==="failed")?"failed":"running"}function HR(t,e,r,n,s){let o=JR(r,n,s);if(o===null)return;let i=t.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",e,o)[0];return i===void 0?void 0:{alias:i.alias,provider:
|
|
1602
|
+
`}function FR(t,e,r){let n=t.nodes.filter(s=>s.startsWith("@terminal:")?!1:t.nodeTypes.get(s)!=="lmctl/terminal"&&t.nodeTypes.get(s)!=="Terminal");for(let s of e){let o=r(s.state_name);n.includes(o)||n.push(o)}return n}function UR(t){return t===null?null:t.startsWith("__paused__:")?t.slice(11):t}function WR(t,e,r,n,s){return n===void 0?"pending":n.ended_at===null?s?.status==="waiting_operator"||t.paused_at!==null&&r===e?"paused":"running":n.outcome===null?"failed":"done"}function BR(t,e){if(t.length===0)return null;let r=t.findIndex(s=>s.status==="running"||s.status==="paused"||s.status==="failed");if(r>=0)return r;if(e){for(let s=t.length-1;s>=0;s-=1)if(t[s].status==="done")return s}let n=t.findIndex(s=>s.status==="pending");return n>=0?n:t.length-1}function qR(t,e,r){return t.terminal_state!==null?t.terminal_state:t.paused_at!==null?"paused":e?.status==="failed"||r.some(n=>n.status==="failed")?"failed":"running"}function HR(t,e,r,n,s){let o=JR(r,n,s);if(o===null)return;let i=t.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",e,o)[0];return i===void 0?void 0:{alias:i.alias,provider:xe(i)}}function JR(t,e,r){let n=XR(t);if(n===null)return null;if(Array.isArray(n.steps)){let s=n.steps.find(a=>dr(a)?a.id===e||a.name===e||a.name===r:!1),o=dr(s?.members)?s.members:null,i=o!==null&&dr(o.agent)?o.agent:null;return typeof i?.alias=="string"?i.alias:null}if(dr(n.states)){let s=n.states[e]??n.states[r];if(!dr(s))return null;let o=dr(s.agent)?s.agent:null;return typeof o?.alias=="string"?o.alias:null}return null}function XR(t){try{let e=JSON.parse(t);return dr(e)?e:null}catch{return null}}function GR(t){if(t===null)return null;try{return JSON.parse(t)}catch{return t}}function dr(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function KR(...t){let e=t.filter(r=>r!==null&&Number.isFinite(r));return e.length===0?null:Math.max(...e)}function Jh(t,e){let r=Date.parse(t),n=Date.parse(e);return Number.isNaN(r)||Number.isNaN(n)?"[+? ]":`[+${ki(Math.max(0,n-r)).padEnd(6)}]`}function Xh(t,e){return Number.isNaN(t)?"?":ki(Math.max(0,e-t))}function ki(t){let e=Math.max(0,Math.round(t/1e3));if(e<60)return`${e}s`;let r=Math.floor(e/60),n=e%60;if(r<60)return n===0?`${r}m`:`${r}m${n}s`;let s=Math.floor(r/60),o=r%60;return o===0?`${s}h`:`${s}h${o}m`}function VR(t){if(!dr(t))return"";let e=typeof t.step_id=="number"?` on step ${t.step_id}`:"",r=typeof t.member_alias=="string"?t.member_alias:null,n=typeof t.provider=="string"?t.provider:null,s=typeof t.elapsed_ms=="number"?`, ${ki(t.elapsed_ms)} elapsed`:"",o=r===null?"":` (${r}${n===null?"":` ${n}`}${s})`;return`${e}${o}`}var tg,Jt=b(()=>{"use strict";Be();tg=`SELECT a.id AS attention_id,
|
|
1603
1603
|
a.kind AS kind,
|
|
1604
1604
|
a.severity AS severity,
|
|
1605
1605
|
a.created_at AS created_at,
|
|
@@ -1621,10 +1621,10 @@ Exit codes:
|
|
|
1621
1621
|
ON isess.run_id = a.run_id
|
|
1622
1622
|
AND isess.id = (
|
|
1623
1623
|
SELECT MAX(id) FROM interactive_session WHERE run_id = a.run_id
|
|
1624
|
-
)`});var Eg={};se(Eg,{parseApiArgs:()=>cg,readApiClientConfig:()=>Is,runApi:()=>tL});import{readFileSync as YR}from"node:fs";import{basename as zR,extname as ZR}from"node:path";async function tL(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(eL),0;if(t[0]==="config")return nL(t.slice(1),e);let r=yg(t,"--direct");if(r.rest[0]==="escalations")return sL(r.rest.slice(1),e,r.present);if(r.rest[0]==="workflows"&&r.rest[1]==="verify"&&
|
|
1624
|
+
)`});var Eg={};se(Eg,{parseApiArgs:()=>cg,readApiClientConfig:()=>Is,runApi:()=>tL});import{readFileSync as YR}from"node:fs";import{basename as zR,extname as ZR}from"node:path";async function tL(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(eL),0;if(t[0]==="config")return nL(t.slice(1),e);let r=yg(t,"--direct");if(r.rest[0]==="escalations")return sL(r.rest.slice(1),e,r.present);if(r.rest[0]==="workflows"&&r.rest[1]==="verify"&&Ai(r.rest.slice(2)))return e.stdout.write(`${lL}
|
|
1625
1625
|
`),0;if(r.rest[0]==="workflows"&&r.rest[1]==="verify")return r.present?(e.stderr.write(`error: --direct is not supported for workflows verify; use the HTTP api route
|
|
1626
|
-
`),2):r$(r.rest.slice(2),e);if(r.rest[0]==="run"&&r.rest[1]==="where"&&
|
|
1627
|
-
`),0;if(r.rest[0]==="run"&&r.rest[1]==="timeline"&&
|
|
1626
|
+
`),2):r$(r.rest.slice(2),e);if(r.rest[0]==="run"&&r.rest[1]==="where"&&Ai(r.rest.slice(2)))return e.stdout.write(`${iL}
|
|
1627
|
+
`),0;if(r.rest[0]==="run"&&r.rest[1]==="timeline"&&Ai(r.rest.slice(2)))return e.stdout.write(`${aL}
|
|
1628
1628
|
`),0;if(r.rest[0]==="run"&&r.rest[1]==="where")return r.present?ZL(r.rest.slice(2),e):QL(r.rest.slice(2),e);if(r.rest[0]==="run"&&r.rest[1]==="timeline")return r.present?e$(r.rest.slice(2),e):t$(r.rest.slice(2),e);if(r.present)return DL(r.rest,e);let n=cg(t);if(typeof n=="string")return e.stderr.write(`error: ${n}
|
|
1629
1629
|
`),2;let s=Pr(e),o=s.baseUrl,i=mr(n.accept,s.token),a=n.body;if(n.upload!==void 0)try{a=hL(n.upload.filePath,n.upload.project)}catch(c){return e.stderr.write(`error: upload failed: ${c instanceof Error?c.message:String(c)}
|
|
1630
1630
|
`),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)}
|
|
@@ -1650,10 +1650,10 @@ Exit codes:
|
|
|
1650
1650
|
`),2}let a=o.getConfigAll(),l=Object.keys(a).sort();if(l.length===0)return e.stdout.write(`(no config rows)
|
|
1651
1651
|
`),0;for(let c of l)e.stdout.write(`${c} = ${og(c,a[c],i)}
|
|
1652
1652
|
`);return 0}return e.stderr.write(`error: unknown api config verb: ${r}
|
|
1653
|
-
`),2}finally{s&&o.close()}}async function sL(t,e,r){if(
|
|
1653
|
+
`),2}finally{s&&o.close()}}async function sL(t,e,r){if(Ai(t))return e.stdout.write(`${oL}
|
|
1654
1654
|
`),0;let n=yg(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>
|
|
1655
1655
|
`),2):s?cL(i,a,e):i==="list"?dL(a,e):i==="show"?mL(a,e):i==="respond"?pL(a,e):(e.stderr.write(`error: unknown api escalations verb: ${i}
|
|
1656
|
-
`),2)}function
|
|
1656
|
+
`),2)}function Ai(t){return t.some(e=>e==="--help"||e==="-h")}function cL(t,e,r){let n=r.dal===void 0,s=r.dal??he({path:le()});try{return wg(s,[t,...e],r)}finally{n&&s.close()}}function ug(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=uL(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 uL(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 dL(t,e){let r=ug(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
1657
1657
|
`),2;let n=Pr(e),s=mr("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)}
|
|
1658
1658
|
`),1}if(!a.ok)return e.stderr.write(`error: HTTP ${a.status}: ${await a.text()}
|
|
1659
1659
|
`),a.status===400?2:1;let l=await a.json();return dg(l,r.json,e)}function dg(t,e,r){if(e)return r.stdout.write(`${JSON.stringify(t,null,2)}
|
|
@@ -1679,7 +1679,7 @@ Exit codes:
|
|
|
1679
1679
|
`),1;if(!u.ok){let f=await u.text();return e.stderr.write(`error: HTTP ${u.status}: ${f}
|
|
1680
1680
|
`),u.status===400?2:1}let d=await u.json();return r?e.stdout.write(`${JSON.stringify(d,null,2)}
|
|
1681
1681
|
`):e.stdout.write(`ok: attention ${o} acknowledged; step ${d.step_id} resumed (session_status=${String(d.session_status)})
|
|
1682
|
-
`),0}function og(t,e,r){return t!=="api.token"||r?e:e.length<=8?"***":`${e.slice(0,8)}\u2026(masked; use --show-secrets to reveal)`}function _L(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===pi||t===_i){let r=Number(e);if(!Number.isInteger(r)||r<=0)return`invalid ${t}: ${e}`}return null}function hL(t,e){let r=YR(t),n=r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength),s=new FormData;return s.append("image",new Blob([n],{type:gL(t)}),zR(t)),e!==void 0&&s.append("project",e),s}function gL(t){switch(ZR(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 yL(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 wL(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api pr <id|list|get>";if(r==="list")return ks(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 fg(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 Ni(t,e,r){return t.length>0?re(t[0]):{method:"GET",path:e,accept:r?"application/json":"text/html",json:r}}function ks(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 ig(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 EL(t,e,r){if(t.length!==1)return`usage: lmctl api ${r} <id>`;let n=oe(t[0],"id");return typeof n=="string"?n:{method:"GET",path:`${e}/${n}`,accept:"application/json",json:!0}}function TL(t,e){let[r,...n]=t;if(r!==void 0&&n.length===0&&r!=="enqueue"&&r!=="run")return EL([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 | --project-id ID) [--source S] [--payload JSON] [--dedupe-key K] [--priority N]";let u={source:i};return s!==void 0&&(u.project=s),o!==void 0&&(u.project_id=o),a!==void 0&&(u.payload=xu(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=oe(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 bL(t,e){let[r,...n]=t;if(r==="list"){let[s,...o]=n;if(s===void 0||s.startsWith("--"))return"usage: lmctl api issues list <project> [--status STATUS] [--severity SEVERITY] [--ai-test-path P]";let i=new URLSearchParams;for(let l=0;l<o.length;l+=1){let c=o[l],u=o[++l];if(u===void 0||u.startsWith("--"))return`missing value for ${c}`;if(c==="--status")i.set("status",u);else if(c==="--severity")i.set("severity",u);else if(c==="--ai-test-path")i.set("ai_test_path",u);else return 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=oe(n[0],"id");return typeof s=="string"?s:{method:"GET",path:`/api/issues/${s}`,accept:"application/json",json:e}}return r==="create"?mg(n,e):r==="claim"?pg(n,e):r==="claim-next"?_g(n,e):r==="close"?hg(n,e):r==="reopen"?gg(n,e):"usage: lmctl api issues <list|show|create|claim|claim-next|close|reopen>"}function mg(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=xu(l);else if(a==="--ai-test-path")o.ai_test_path=l;else if(a==="--source-run-id"){let c=oe(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 pg(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api issues claim <id> --assigned-run-id RUN";let s=oe(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=oe(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 _g(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=oe(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 hg(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=oe(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=oe(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 gg(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api issues reopen <id> [--source-run-id RUN]";let s=oe(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=oe(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 SL(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 vL(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 xu(t){try{return JSON.parse(t)}catch{return t}}function kL(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 IL(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 NL(t,e){let[r,n,...s]=t;return r==="workflow"?xL([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 xL(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=oe(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=oe(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=AL(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 AL(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=xu(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 RL(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=oe(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 LL(t,e){if(t[0]!=="ack"||t.length!==2)return"usage: lmctl api attention ack <id>";let r=oe(t[1],"id");return typeof r=="string"?r:{method:"POST",path:`/api/attentions/${r}/ack`,accept:e?"application/json":"text/html",json:e}}function $L(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 OL(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 jL(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 CL(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=fi(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 ML(t,e){let[r,n,s,o]=t;if(r!==void 0&&/^\d+$/.test(r)&&n===void 0){let i=oe(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=oe(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=oe(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=oe(n,"run_id");if(typeof i=="string")return i;let a=oe(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=oe(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=oe(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=oe(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 oe(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 yg(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 DL(t,e){let r=fg(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
1682
|
+
`),0}function og(t,e,r){return t!=="api.token"||r?e:e.length<=8?"***":`${e.slice(0,8)}\u2026(masked; use --show-secrets to reveal)`}function _L(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===pi||t===_i){let r=Number(e);if(!Number.isInteger(r)||r<=0)return`invalid ${t}: ${e}`}return null}function hL(t,e){let r=YR(t),n=r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength),s=new FormData;return s.append("image",new Blob([n],{type:gL(t)}),zR(t)),e!==void 0&&s.append("project",e),s}function gL(t){switch(ZR(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 yL(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 wL(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api pr <id|list|get>";if(r==="list")return ks(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 fg(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 Ni(t,e,r){return t.length>0?re(t[0]):{method:"GET",path:e,accept:r?"application/json":"text/html",json:r}}function ks(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 ig(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 EL(t,e,r){if(t.length!==1)return`usage: lmctl api ${r} <id>`;let n=oe(t[0],"id");return typeof n=="string"?n:{method:"GET",path:`${e}/${n}`,accept:"application/json",json:!0}}function TL(t,e){let[r,...n]=t;if(r!==void 0&&n.length===0&&r!=="enqueue"&&r!=="run")return EL([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 | --project-id ID) [--source S] [--payload JSON] [--dedupe-key K] [--priority N]";let u={source:i};return s!==void 0&&(u.project=s),o!==void 0&&(u.project_id=o),a!==void 0&&(u.payload=Au(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=oe(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 bL(t,e){let[r,...n]=t;if(r==="list"){let[s,...o]=n;if(s===void 0||s.startsWith("--"))return"usage: lmctl api issues list <project> [--status STATUS] [--severity SEVERITY] [--ai-test-path P]";let i=new URLSearchParams;for(let l=0;l<o.length;l+=1){let c=o[l],u=o[++l];if(u===void 0||u.startsWith("--"))return`missing value for ${c}`;if(c==="--status")i.set("status",u);else if(c==="--severity")i.set("severity",u);else if(c==="--ai-test-path")i.set("ai_test_path",u);else return 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=oe(n[0],"id");return typeof s=="string"?s:{method:"GET",path:`/api/issues/${s}`,accept:"application/json",json:e}}return r==="create"?mg(n,e):r==="claim"?pg(n,e):r==="claim-next"?_g(n,e):r==="close"?hg(n,e):r==="reopen"?gg(n,e):"usage: lmctl api issues <list|show|create|claim|claim-next|close|reopen>"}function mg(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=Au(l);else if(a==="--ai-test-path")o.ai_test_path=l;else if(a==="--source-run-id"){let c=oe(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 pg(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api issues claim <id> --assigned-run-id RUN";let s=oe(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=oe(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 _g(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=oe(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 hg(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=oe(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=oe(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 gg(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api issues reopen <id> [--source-run-id RUN]";let s=oe(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=oe(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 SL(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 vL(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 Au(t){try{return JSON.parse(t)}catch{return t}}function kL(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 IL(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 NL(t,e){let[r,n,...s]=t;return r==="workflow"?AL([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 AL(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=oe(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=oe(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=xL(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 xL(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=Au(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 RL(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=oe(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 LL(t,e){if(t[0]!=="ack"||t.length!==2)return"usage: lmctl api attention ack <id>";let r=oe(t[1],"id");return typeof r=="string"?r:{method:"POST",path:`/api/attentions/${r}/ack`,accept:e?"application/json":"text/html",json:e}}function $L(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 OL(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 jL(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 CL(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=fi(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 ML(t,e){let[r,n,s,o]=t;if(r!==void 0&&/^\d+$/.test(r)&&n===void 0){let i=oe(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=oe(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=oe(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=oe(n,"run_id");if(typeof i=="string")return i;let a=oe(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=oe(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=oe(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=oe(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 oe(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 yg(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 DL(t,e){let r=fg(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
1683
1683
|
`),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)
|
|
1684
1684
|
`),2;let a=e.dal===void 0,l=e.dal??he({path:le()});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)
|
|
1685
1685
|
`),2):c==="create"?PL(l,u,e,s):c==="claim"?FL(l,u,e,s):c==="claim-next"?UL(l,u,e,s):c==="close"?WL(l,u,e,s):c==="reopen"?BL(l,u,e,s):c==="list"?XL(l,u,e,s):c==="show"?GL(l,u,e,s):(e.stderr.write(`error: --direct does not support: issues ${c} (supported: list, show, create, claim, claim-next, close, reopen)
|
|
@@ -1766,7 +1766,7 @@ Exit codes:
|
|
|
1766
1766
|
`),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})
|
|
1767
1767
|
`),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)}
|
|
1768
1768
|
`):r.stdout.write(`ok: attention ${i} acknowledged; step ${l.step_id} resumed (session_status=${f.session_status})
|
|
1769
|
-
`),0}function ag(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 QR,eL,lg,Ii,oL,iL,aL,lL,JL,
|
|
1769
|
+
`),0}function ag(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 QR,eL,lg,Ii,oL,iL,aL,lL,JL,xu=b(()=>{"use strict";Be();Ve();mi();bu();Jt();QR="http://127.0.0.1:8787",eL=`usage: lmctl api [--direct] <subcommand> ...
|
|
1770
1770
|
|
|
1771
1771
|
Call the lmctl HTTP API using the configured daemon URL/token. Some
|
|
1772
1772
|
workflow shellstep-safe commands also support --direct to use the local DAL
|
|
@@ -1796,7 +1796,7 @@ without an HTTP round trip.
|
|
|
1796
1796
|
|
|
1797
1797
|
Verify every workflows/*.compound.json file: load/validate the workflow graph
|
|
1798
1798
|
and report the first step that would be started. Default output is the TTY
|
|
1799
|
-
table; --json emits the structured WorkflowVerifyReport payload.`;JL=["open","assigned","closed","reopened"]});import{existsSync as Tg,mkdirSync as o$,readdirSync as i$,readFileSync as bg,writeFileSync as a$}from"node:fs";import{join as _n}from"node:path";import{fileURLToPath as l$}from"node:url";function Ns(t){try{return c$.some(e=>Tg(_n(t,e)))}catch{return!1}}function u$(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
|
|
1799
|
+
table; --json emits the structured WorkflowVerifyReport payload.`;JL=["open","assigned","closed","reopened"]});import{existsSync as Tg,mkdirSync as o$,readdirSync as i$,readFileSync as bg,writeFileSync as a$}from"node:fs";import{join as _n}from"node:path";import{fileURLToPath as l$}from"node:url";function Ns(t){try{return c$.some(e=>Tg(_n(t,e)))}catch{return!1}}function u$(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 xi(t,e){t.durable_memory_mode!=="db"?d$(t):f$(t,e)}function Sg(t){let e=Ns(t),r;try{r=i$(Ru).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 d$(t){let e=t.local_path;if(!e){console.warn("[bootstrap] skipping: project has no local_path");return}let r=_n(e,"durable-memory");try{o$(r,{recursive:!0})}catch(o){console.error("[bootstrap] failed to create durable-memory directory:",o);return}let n=Sg(e),s=[];for(let o of n){let i=o.replace(/\.template$/,""),a=_n(r,i);if(!Tg(a))try{let l=bg(_n(Ru,o),"utf8");a$(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 f$(t,e){let r=t.local_path??"",n=Sg(r),s=[];for(let o of n){let i=_n(Ru,o),a;try{a=bg(i,"utf8")}catch(c){console.error(`[bootstrap] failed to read ${o}:`,c);continue}let l=u$(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 Ru,c$,As=b(()=>{"use strict";Ru=_n(l$(import.meta.url),"../../config/durable_memory_templates"),c$=[".git","package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","composer.json","Pipfile"]});import{existsSync as m$,mkdirSync as p$,readdirSync as _$,readFileSync as h$,writeFileSync as g$}from"node:fs";import{join as Ri}from"node:path";import{fileURLToPath as y$}from"node:url";function Li(t){let e=t.local_path;if(!e){console.warn("[bootstrap] skipping ai-test: project has no local_path");return}if(!Ns(e))return;let r=Ri(e,"ai-test");try{p$(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=Ri(r,o);if(!m$(i))try{g$(i,E$(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 _$(vg).filter(t=>t.endsWith(".template")).sort()}catch{return["example-test.md.template","index.md.template"]}}function E$(t){try{return h$(Ri(vg,t),"utf8")}catch{return T$(t)}}function T$(t){let e=t.replace(/\.template$/,"");return e==="index.md"?`# AI Test Suite - index
|
|
1800
1800
|
|
|
1801
1801
|
Add test chapters in this directory.
|
|
1802
1802
|
`:`---
|
|
@@ -1818,7 +1818,7 @@ last_run_id: 0
|
|
|
1818
1818
|
## Expected
|
|
1819
1819
|
|
|
1820
1820
|
## Cleanup
|
|
1821
|
-
`}var vg,Lu=b(()=>{"use strict";
|
|
1821
|
+
`}var vg,Lu=b(()=>{"use strict";As();vg=Ri(y$(import.meta.url),"../../config/ai_test_templates")});var hn,$u=b(()=>{"use strict";hn=`---
|
|
1822
1822
|
|
|
1823
1823
|
# Durable memory \u2014 how to use it
|
|
1824
1824
|
|
|
@@ -1829,21 +1829,21 @@ ON EVERY NEW TASK:
|
|
|
1829
1829
|
2. Pull only the chapters relevant to your current task. Don't load everything.
|
|
1830
1830
|
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.
|
|
1831
1831
|
|
|
1832
|
-
Don't dump all of durable-memory into your context. The pattern is index-first, chapter-on-demand.`});function $i(t){return b$.has(t)}function ju(){return Ou===null&&(Ou=kt(Nt())),Ou}function Cu(t,e,r={}){if(!$i(t))return null;try{let n=ju().getAdapter?.(t);if(n===void 0)return null;let s=n.resumeCommand(e).trim();if(s.length===0)return null;let o=s.split(/\s+/),i=t==="codex"&&r.isLead===!0?Wo({warn:()=>{}}):[];return[...o,...i,...kg[t]??[]]}catch{return null}}function gn(t,e){let r=Cu(t,e);return r===null?null:r.join(" ")}function Xt(t,e){return ju().getSession(t,e)}async function Oi(t){return(await ju().resolveSessions(t)).map(r=>r.provider.name)}var kg,b$,Ig,Ou,Fr=b(()=>{"use strict";
|
|
1833
|
-
`,"utf8"),k$(n,r)}function O$(t){if(typeof t=="object"&&t!==null&&"code"in t){let e=t.code;if(typeof e=="string")return e}}function j$(t,e,r,n,s){let o=`${e}.dist-${r}`;for(let i=0;i<1e3;i+=1){let a=i===0?o:`${o}-${i}`,l=st(t,a);try{return ji(l,n,{flag:"wx"}),a}catch(c){if(O$(c)!=="EEXIST")throw c;if(Ci(Rs(l))===s)return a}}throw new Error(`could not find available dist shadow path for ${e}`)}function C$(t,e){if(Ng(e)||Mu(e)!=="workflows")return null;let r=e.slice(10);if(r.length===0||r.includes("/")||r.includes("\\")||r.includes(".."))return null;let n=yn(t,"templates","workflows"),s=yn(t,"templates",e),o=
|
|
1832
|
+
Don't dump all of durable-memory into your context. The pattern is index-first, chapter-on-demand.`});function $i(t){return b$.has(t)}function ju(){return Ou===null&&(Ou=kt(Nt())),Ou}function Cu(t,e,r={}){if(!$i(t))return null;try{let n=ju().getAdapter?.(t);if(n===void 0)return null;let s=n.resumeCommand(e).trim();if(s.length===0)return null;let o=s.split(/\s+/),i=t==="codex"&&r.isLead===!0?Wo({warn:()=>{}}):[];return[...o,...i,...kg[t]??[]]}catch{return null}}function gn(t,e){let r=Cu(t,e);return r===null?null:r.join(" ")}function Xt(t,e){return ju().getSession(t,e)}async function Oi(t){return(await ju().resolveSessions(t)).map(r=>r.provider.name)}var kg,b$,Ig,Ou,Fr=b(()=>{"use strict";At();lc();kg={claude:["--dangerously-skip-permissions"],codex:["--dangerously-bypass-approvals-and-sandbox"],gemini:["-y"],copilot:["--yolo"],opencode:[],qwen:["--approval-mode","yolo"],agy:[],lmplayer:[]},b$=new Set(Object.keys(kg)),Ig=/^[\w.:-]+$/;Ou=null});import{createHash as S$}from"node:crypto";import{existsSync as xs,mkdirSync as Ag,readFileSync as Rs,readdirSync as v$,renameSync as k$,statSync as I$,unlinkSync as N$,writeFileSync as ji}from"node:fs";import{homedir as A$}from"node:os";import{dirname as Mu,isAbsolute as Ng,join as st,relative as x$,resolve as yn}from"node:path";import{fileURLToPath as R$}from"node:url";function Rg(t){let e=yn(t);for(;;){let r=st(e,Du);try{if(I$(r).isDirectory())return r}catch{}let n=Mu(e);if(n===e)return null;e=n}}function Mi(t=process.cwd()){let e=process.env.LMCTL_HOME;if(e!==void 0&&e.trim().length>0)return yn(e);let r=Rg(t);return r!==null?r:st(xg(),Du)}function Lg(t){return st(Mi(t),"templates","workflows")}function $g(){return yn(Mu(R$(import.meta.url)),"..","..","workflows")}function L$(t){let e=st(t,Og);try{let r=JSON.parse(Rs(e,"utf8"));if(r&&typeof r=="object"&&r.files&&typeof r.files=="object")return{version:String(r.version??""),files:r.files}}catch{}return{version:"",files:{}}}function $$(t,e){Ag(t,{recursive:!0});let r=st(t,Og),n=`${r}.tmp-${process.pid}`;ji(n,`${JSON.stringify(e,null,2)}
|
|
1833
|
+
`,"utf8"),k$(n,r)}function O$(t){if(typeof t=="object"&&t!==null&&"code"in t){let e=t.code;if(typeof e=="string")return e}}function j$(t,e,r,n,s){let o=`${e}.dist-${r}`;for(let i=0;i<1e3;i+=1){let a=i===0?o:`${o}-${i}`,l=st(t,a);try{return ji(l,n,{flag:"wx"}),a}catch(c){if(O$(c)!=="EEXIST")throw c;if(Ci(Rs(l))===s)return a}}throw new Error(`could not find available dist shadow path for ${e}`)}function C$(t,e){if(Ng(e)||Mu(e)!=="workflows")return null;let r=e.slice(10);if(r.length===0||r.includes("/")||r.includes("\\")||r.includes(".."))return null;let n=yn(t,"templates","workflows"),s=yn(t,"templates",e),o=x$(n,s);return o.length===0||o.startsWith("..")||Ng(o)||o.includes("/")||o.includes("\\")?null:s}function M$(t,e,r){for(let[n,s]of Object.entries(e.files)){if(r.has(n))continue;let o=C$(t,n);if(o===null){delete e.files[n];continue}if(!xs(o)){delete e.files[n];continue}try{if(Ci(Rs(o))!==s)continue;N$(o),delete e.files[n]}catch{}}}function Di(t={}){let e=Mi(t.cwd),r=st(e,"templates","workflows"),n=$g(),s={basedir:e,copied:[],refreshed:[],preserved:[],shadowed:[]};try{let o=xs(n)?v$(n).filter(c=>c.endsWith(".compound.json")||c.endsWith(".lmctl")||c==="index.jsonl"):[];if(o.length===0)return s;Ag(r,{recursive:!0});let i=L$(e),a=Tt(),l=new Set(o.map(c=>`workflows/${c}`));for(let c of o){let u=`workflows/${c}`,d=Rs(st(n,c)),f=Ci(d),m=st(r,c);if(!xs(m)){try{ji(m,d,{flag:"wx"}),s.copied.push(c)}catch{}i.files[u]=f;continue}let p=Ci(Rs(m));if(p===f){i.files[u]=f;continue}let _=i.files[u];if(_!==void 0&&p===_)ji(m,d),i.files[u]=f,s.refreshed.push(c);else{let g=j$(r,c,a,d,f);s.preserved.push(c),s.shadowed.push(g)}}M$(e,i,l),$$(e,{version:a,files:i.files})}catch(o){if(t.swallow!==!0)throw o}return s}function Pu(t){let e=[],r=process.env.LMCTL_HOME;r!==void 0&&r.trim().length>0&&e.push(yn(r));let n=Rg(t??process.cwd());return n!==null&&e.push(n),e.push(st(xg(),Du)),e}function Pi(t,e){let r=Pu(e),n=[`${t}.compound.json`,`${t}.lmctl`];for(let s of r)for(let o of n){let i=st(s,"templates","workflows",o);if(xs(i))return i}for(let s of n){let o=st($g(),s);if(xs(o))return o}return null}var Du,xg,Ci,Og,Fi=b(()=>{"use strict";zn();Du=".lmctl",xg=()=>process.env.HOME??A$(),Ci=t=>S$("sha256").update(t).digest("hex");Og=".dist-manifest.json"});import{createHash as D$}from"node:crypto";import{existsSync as P$,mkdirSync as F$,writeFileSync as U$}from"node:fs";import{dirname as W$,join as wn}from"node:path";function pr(t){return typeof t=="string"&&t.startsWith(jg)}function G$(t){if(!pr(t))throw new pt(`not an lmctl:// URI: ${t}`,"malformed");let e=t.slice(jg.length),r=e.indexOf("/");if(r<=0)throw new pt(`malformed lmctl:// URI (expected lmctl://<workflow|mcp|skill>/<name>): ${t}`,"malformed");let n=e.slice(0,r);if(!J$.has(n))throw new pt(`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 pt(`empty name in lmctl:// URI: ${t}`,"malformed");if(/[\\/]|\.\./.test(a))throw new pt(`invalid name in lmctl:// URI (no path separators): ${t}`,"malformed");return{kind:n,name:a,...o!==void 0&&o.length>0?{ref:o}:{}}}function K$(t,e,r){if(t==="workflow")return Pi(e,r);let n=t==="mcp"?wn("templates","mcp",`${e}.json`):wn("templates","skills",e,"SKILL.md");for(let s of Pu(r)){let o=wn(s,n);if(P$(o))return o}return null}function V$(t,e,r){let n=wn(Mi(r),q$,t);return t==="skill"?wn(n,e,"SKILL.md"):wn(n,`${e}${t==="workflow"?".compound.json":".json"}`)}function Y$(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 Ls(t,e){let{kind:r,name:n,ref:s}=G$(t),o=K$(r,n,e);if(o!==null)return o;let i=`${B$}${r}/${n}`,a;try{a=await fetch(i,{signal:AbortSignal.timeout(H$)})}catch(u){throw new pt(`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 pt(`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=X$.exec(s);if(u!==null){let d=D$("sha256").update(l).digest("hex");if(d.toLowerCase()!==u[1].toLowerCase())throw new pt(`lmctl:// '${t}' remote artifact FAILED integrity pin (expected sha256 ${u[1]}, got ${d}) \u2014 discarded, NOT cached.`,"validation-failure")}}if(!Y$(r,l))throw new pt(`lmctl:// '${t}' remote artifact failed shape validation for ${r} \u2014 discarded, NOT cached.`,"validation-failure");let c=V$(r,n,e);return F$(W$(c),{recursive:!0}),U$(c,l,"utf8"),c}var jg,B$,q$,H$,J$,pt,X$,Fu=b(()=>{"use strict";Fi();jg="lmctl://",B$="https://lmctl.com/templates/",q$=".cache",H$=8e3,J$=new Set(["workflow","mcp","skill"]),pt=class extends Error{reason;constructor(e,r="malformed"){super(e),this.reason=r,this.name="LmctlUriError"}},X$=/^(?:sha256[:-])?([0-9a-f]{64})$/i});import{existsSync as z$,mkdirSync as Z$,readFileSync as Q$,renameSync as eO,unlinkSync as tO,writeFileSync as rO}from"node:fs";import{homedir as Mg}from"node:os";import{dirname as $s,join as _t,resolve as nO}from"node:path";function bn(t,e,r){let n=$s(nO(r)),s=new Set,o=new Map;for(let i of e.members){if(s.add(i.provider),i.teamfile!==void 0)continue;let a=i.sessiondir??n,l=o.get(a)??new Set;l.add(i.provider),o.set(a,l)}for(let[i,a]of o.entries())_r(_t(i,".mcp.json"),"mcpServers",[En(),Tn()]),a.has("opencode")&&_r(_t(i,".opencode","opencode.json"),"mcp",[Ug(),Wg()]);for(let i of s)iO(i)}function Uu(t=Dg??Mg()){return _t(t,".copilot","mcp-config.json")}function Pg(t,e){let r={};if(Xe.existsSync(t)){let o=JSON.parse(Xe.readFileSync(t,"utf8"));if(!Lt(o))throw new Error(`${t} is not a JSON object`);r=o}let n=Lt(r.mcpServers)?{...r.mcpServers}:{},s=!1;for(let[o,i]of Object.entries(e)){let a=Lt(n[o])?n[o]:void 0;yO(a,i)||(n[o]=i,s=!0)}return s?(r.mcpServers=n,Fg(t,r),{changed:!0}):{changed:!1}}function Fg(t,e){Xe.mkdirSync($s(t),{recursive:!0});let r=_t($s(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{Xe.writeFileSync(r,`${JSON.stringify(e,null,2)}
|
|
1834
1834
|
`,"utf8"),Xe.renameSync(r,t)}catch(n){try{Xe.unlinkSync(r)}catch{}throw n}}function oO(t,e){Xe.mkdirSync($s(t),{recursive:!0});let r=_t($s(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{Xe.writeFileSync(r,e,"utf8"),Xe.renameSync(r,t)}catch(n){try{Xe.unlinkSync(r)}catch{}throw n}}function _r(t,e,r){try{if(!Xe.existsSync(t))return;let n=JSON.parse(Xe.readFileSync(t,"utf8"));if(!Lt(n)||!Lt(n[e]))return;let s={...n[e]},o=[];for(let{name:i,shouldRemove:a}of r)Object.prototype.hasOwnProperty.call(s,i)&&a(s[i])&&(delete s[i],o.push(i));if(o.length===0)return;n[e]=s,Fg(t,n),z({event:"mcp_cleanup",path:t,removed:o})}catch{}}function En(){return{name:Wi,shouldRemove:pO}}function Ug(){return{name:Wi,shouldRemove:_O}}function Tn(){return{name:Ui,shouldRemove:fO}}function Wg(){return{name:Ui,shouldRemove:mO}}function iO(t){let e=Dg??Mg();switch(t){case"copilot":_r(Uu(e),"mcpServers",[En(),Tn()]);return;case"claude":_r(_t(e,".claude.json"),"mcpServers",[En(),Tn()]);return;case"gemini":_r(_t(e,".gemini","settings.json"),"mcpServers",[En(),Tn()]);return;case"qwen":_r(_t(e,".qwen","settings.json"),"mcpServers",[En(),Tn()]);return;case"agy":_r(_t(e,".gemini","antigravity-cli","settings.json"),"mcpServers",[En(),Tn()]);return;case"opencode":_r(_t(e,".config","opencode","opencode.json"),"mcp",[Ug(),Wg()]);return;case"codex":aO(_t(e,".codex","config.toml"));return;default:return}}function aO(t){try{if(!Xe.existsSync(t))return;let e=Xe.readFileSync(t,"utf8"),r=lO(e);if(r===null)return;let n=e.split(/\n/),s=[],o=new Set,i=!1,a;for(let l of n){let c=Bg(l);if(c===null)return;if(c!==void 0){if(Cg(c,r)){i=!0,a=c[1],o.add(a);continue}i=!1,a=void 0,s.push(l);continue}if(i){if(/^\s*(?:#.*)?$/.test(l)){s.push(l);continue}a!==void 0&&o.add(a);continue}let u=uO(l);if(u===null)return;if(u!==void 0&&Cg(u,r)){o.add(u[1]);continue}s.push(l)}if(o.size===0)return;oO(t,s.join(`
|
|
1835
|
-
`)),z({event:"mcp_cleanup",path:t,removed:[...o]})}catch{}}function Cg(t,e){return t.length<2||t[0]!=="mcp_servers"?!1:e.has(t[1])}function lO(t){let e=new Map,r;for(let s of t.split(/\n/)){let o=Bg(s);if(o===null)return null;if(o!==void 0){r=o;continue}let i=s.indexOf("=");if(i<0)continue;let a=s.slice(0,i).trim(),l=s.slice(i+1).trim(),c=cO(a,r);if(c===null)return null;if(c===void 0||c.length!==3||c[0]!=="mcp_servers"||c[1]!==Ui&&c[1]!==Wi)continue;let u=e.get(c[1])??{};if(c[2]==="command"){let d=qg(l);if(d===null)return null;u.command=d}else if(c[2]==="args"){let d=dO(l);if(d===null)return null;u.args=d}e.set(c[1],u)}let n=new Set;for(let[s,o]of e.entries())s===Ui&&Jg(o.command,o.args)&&n.add(s),s===Wi&&Xg(o.command,o.args)&&n.add(s);return n}function cO(t,e){if(t.startsWith("mcp_servers"))return Bi(t);if(e===void 0||e.length<2||e[0]!=="mcp_servers")return;let r=Bi(t);return r===null?null:[...e,...r]}function Bg(t){if(!/^\s*\[/.test(t))return;let e=/^\s*\[([^\]\r\n]+)\]\s*(?:#.*)?$/.exec(t);return e===null?null:Bi(e[1])}function uO(t){let e=t.indexOf("=");if(e<0)return;let r=t.slice(0,e).trim();if(!(r.length===0||!r.startsWith("mcp_servers")))return Bi(r)}function Bi(t){let e=[],r=0,n=()=>{for(;r<t.length&&/\s/.test(t[r]);)r+=1};for(;r<t.length;){if(n(),r>=t.length)return null;if(t[r]==='"'){r+=1;let s="",o=!1;for(;r<t.length;){let i=t[r];if(i==="\\"){if(r+1>=t.length)return null;s+=t[r+1],r+=2;continue}if(i==='"'){r+=1,o=!0;break}s+=i,r+=1}if(!o)return null;e.push(s)}else{let s=r;for(;r<t.length&&/[A-Za-z0-9_-]/.test(t[r]);)r+=1;if(r===s)return null;e.push(t.slice(s,r))}if(n(),r>=t.length)break;if(t[r]!==".")return null;r+=1}return e.length>0?e:null}function qg(t){let e=Hg(t).trim();if(e.startsWith('"'))try{let r=JSON.parse(e);return typeof r=="string"?r:null}catch{return null}return e.startsWith("'")&&e.endsWith("'")&&e.length>=2?e.slice(1,-1):null}function dO(t){let e=Hg(t).trim();if(!e.startsWith("[")||!e.endsWith("]"))return null;let r=e.slice(1,-1).trim();if(r.length===0)return[];let n=r.split(",").map(s=>qg(s.trim()));return n.some(s=>s===null)?null:n}function Hg(t){let e;for(let r=0;r<t.length;r+=1){let n=t[r];if(e!==void 0){if(e==='"'&&n==="\\"){r+=1;continue}n===e&&(e=void 0);continue}if(n==='"'||n==="'"){e=n;continue}if(n==="#")return t.slice(0,r)}return t}function fO(t){return Lt(t)?t.type==="stdio"&&typeof t.command=="string"&&Jg(t.command,t.args):!1}function mO(t){return!Lt(t)||!Array.isArray(t.command)?!1:t.command.length===2&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&Kg(t.command[0])&&t.command[1]==="mcp"||t.command.length===3&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&typeof t.command[2]=="string"&&Gg(t.command[0],[t.command[1],t.command[2]])}function pO(t){return Lt(t)?t.type==="stdio"&&Xg(t.command,t.args):!1}function _O(t){return!Lt(t)||!Array.isArray(t.command)?!1:t.command.length===2&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&Vg(t.command[0])&&t.command[1]==="mcp"}function Jg(t,e){return Kg(t)&&Yg(e)||Gg(t,e)}function Xg(t,e){return Vg(t)&&Yg(e)}function Gg(t,e){return hO(t)&&Array.isArray(e)&&e.length===2&&gO(e[0])&&e[1]==="mcp"}function Kg(t){return typeof t=="string"&&Wu(t)==="lmctl"}function Vg(t){return typeof t=="string"&&Wu(t)==="lmctl0"}function hO(t){if(typeof t!="string")return!1;let e=Wu(t).toLowerCase();return e==="node"||e==="node.exe"}function gO(t){if(typeof t!="string")return!1;let e=t.replace(/\\/g,"/");return e==="lmctl-cli/dist/index.js"||e.endsWith("/lmctl-cli/dist/index.js")}function Wu(t){let e=t.replace(/\\/g,"/");return e.split("/").filter(n=>n.length>0).at(-1)??e}function Yg(t){return Array.isArray(t)&&t.length===1&&t[0]==="mcp"}function yO(t,e){return t!==void 0&&qi(t)===qi(e)}function qi(t){return Array.isArray(t)?`[${t.map(e=>qi(e)).join(",")}]`:Lt(t)?`{${Object.keys(t).sort().map(e=>`${JSON.stringify(e)}:${qi(t[e])}`).join(",")}}`:JSON.stringify(t)}function Lt(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Ui,Wi,sO,Xe,Dg,Os=b(()=>{"use strict";ve();Ui="lmctl",Wi="lmctl0",sO={existsSync:z$,mkdirSync:Z$,readFileSync:Q$,writeFileSync:rO,renameSync:eO,unlinkSync:tO},Xe=sO});import{spawnSync as ry}from"node:child_process";import{cpSync as zg,existsSync as Hu,mkdirSync as ny,mkdtempSync as wO,readFileSync as sy,statSync as EO,writeFileSync as Bu}from"node:fs";import{homedir as TO,tmpdir as bO}from"node:os";import{basename as Zg,join as ot}from"node:path";function Gt(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function qu(t,e,r){if(Array.isArray(t)){for(let n of t)qu(n,e,r);return}if(Gt(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))qu(n,e,r)}}function IO(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(!(!Gt(a)||!Array.isArray(a.steps)))for(let l of a.steps)Gt(l)&&l.members!==void 0&&qu(l.members,e.alias,r)}let s=o=>{let i=new Map;for(let a of o)i.set(kO(a),a);return[...i.values()]};return{mcp:s(r.mcp),skills:s(r.skills)}}function NO(t,e){return t.listProjects().find(r=>r.team_id===e.team_id)?.local_path}async function oy(t,e){let r;try{r=await fetch(t,{signal:AbortSignal.timeout(SO)})}catch(s){throw new it(e,`fetch ${t} failed: ${s.message}`)}if(!r.ok)throw new it(e,`fetch ${t} \u2192 HTTP ${r.status}`);let n=await r.text();if(n.length>Qg)throw new it(e,`fetched ${t} exceeds ${Qg} bytes`);return n}async function
|
|
1836
|
-
`,"utf8")}function jO(t,e){let r={};for(let n of t)r[n.name]=Ji(n)?{type:n.type==="sse"?"sse":"http",url:n.url,...n.headers?{headers:n.headers}:{}}:{type:"stdio",command:n.command,args:n.args??[],...n.env?{env:n.env}:{}};try{Pg(Uu(Sn()),r)}catch(n){throw new it(e,`copilot MCP config install failed: ${n instanceof Error?n.message:String(n)}`)}}function CO(t){if(typeof t!="string")return t.name;let e=Zg(t.replace(/\/+$/,""));return e.toLowerCase()==="skill.md"?Zg(t.replace(/\/skill\.md$/i,"")):e}async function ey(t,e,r){let n=CO(t),s=ot(e,n);if(ny(s,{recursive:!0}),typeof t!="string")return Bu(ot(s,"SKILL.md"),t.content,"utf8"),{name:n,dir:s};if(pr(t)&&(t=await Ls(t)),Ju.test(t))return Bu(ot(s,"SKILL.md"),await oy(t,r),"utf8"),{name:n,dir:s};if(!Hu(t))throw new it(r,`skill path not found: ${t}`);return EO(t).isDirectory()?(zg(t,s,{recursive:!0}),{name:n,dir:s}):(zg(t,ot(s,"SKILL.md")),{name:n,dir:s})}async function Xi(t){let{dal:e,member:r,stderr:n}=t,s=IO(e,r);if(s.mcp.length===0&&s.skills.length===0)return;let o=
|
|
1837
|
-
`)};if(s.mcp.length>0){let l=[];for(let c of s.mcp)l.push(...await
|
|
1838
|
-
`)),0}function UO(t,e,r){let[n,...s]=t;switch(n){case"add":return WO(s,e,r);case"list":return BO(s,e,r);case"show":return qO(s,e,r);case"rm":return HO(s,e,r);default:return y(e,"usage: lmctl code team <add|list|show|rm>")}}function WO(t,e,r){let n=P(t,["--project","--team","--provider","--model","--role","--sessiondir"]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: code team add <alias> --provider P [--model M] [--role R] [--sessiondir DIR] [--project NAME] [--team NAME] [--json]");let o=L(n,"--provider");if(o===void 0)return y(e,"code team add requires --provider");let i=vn(e,r,L(n,"--project"),L(n,"--team"));if(typeof i=="number")return i;let a=r.insertTeamMember({team_id:i.team.id,alias:s,provider:o,model:L(n,"--model")??null,role:L(n,"--role")??"agent",sessiondir:L(n,"--sessiondir")??i.project.local_path});return
|
|
1839
|
-
`),0}function BO(t,e,r){let n=P(t,["--project","--team"]);if(n.error!==void 0)return y(e,n.error);let s=vn(e,r,L(n,"--project"),L(n,"--team"));if(typeof s=="number")return s;let o=cy(r.listTeamMembers(s.team.id));if(
|
|
1840
|
-
`);return 0}function qO(t,e,r){let n=P(t,["--project","--team"]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: code team show <alias>");let o=vn(e,r,L(n,"--project"),L(n,"--team"));if(typeof o=="number")return o;let i=r.findTeamMemberByAlias(o.team.id,s);return i===null||i.state==="retired"?y(e,`member not found: ${s}`):(
|
|
1835
|
+
`)),z({event:"mcp_cleanup",path:t,removed:[...o]})}catch{}}function Cg(t,e){return t.length<2||t[0]!=="mcp_servers"?!1:e.has(t[1])}function lO(t){let e=new Map,r;for(let s of t.split(/\n/)){let o=Bg(s);if(o===null)return null;if(o!==void 0){r=o;continue}let i=s.indexOf("=");if(i<0)continue;let a=s.slice(0,i).trim(),l=s.slice(i+1).trim(),c=cO(a,r);if(c===null)return null;if(c===void 0||c.length!==3||c[0]!=="mcp_servers"||c[1]!==Ui&&c[1]!==Wi)continue;let u=e.get(c[1])??{};if(c[2]==="command"){let d=qg(l);if(d===null)return null;u.command=d}else if(c[2]==="args"){let d=dO(l);if(d===null)return null;u.args=d}e.set(c[1],u)}let n=new Set;for(let[s,o]of e.entries())s===Ui&&Jg(o.command,o.args)&&n.add(s),s===Wi&&Xg(o.command,o.args)&&n.add(s);return n}function cO(t,e){if(t.startsWith("mcp_servers"))return Bi(t);if(e===void 0||e.length<2||e[0]!=="mcp_servers")return;let r=Bi(t);return r===null?null:[...e,...r]}function Bg(t){if(!/^\s*\[/.test(t))return;let e=/^\s*\[([^\]\r\n]+)\]\s*(?:#.*)?$/.exec(t);return e===null?null:Bi(e[1])}function uO(t){let e=t.indexOf("=");if(e<0)return;let r=t.slice(0,e).trim();if(!(r.length===0||!r.startsWith("mcp_servers")))return Bi(r)}function Bi(t){let e=[],r=0,n=()=>{for(;r<t.length&&/\s/.test(t[r]);)r+=1};for(;r<t.length;){if(n(),r>=t.length)return null;if(t[r]==='"'){r+=1;let s="",o=!1;for(;r<t.length;){let i=t[r];if(i==="\\"){if(r+1>=t.length)return null;s+=t[r+1],r+=2;continue}if(i==='"'){r+=1,o=!0;break}s+=i,r+=1}if(!o)return null;e.push(s)}else{let s=r;for(;r<t.length&&/[A-Za-z0-9_-]/.test(t[r]);)r+=1;if(r===s)return null;e.push(t.slice(s,r))}if(n(),r>=t.length)break;if(t[r]!==".")return null;r+=1}return e.length>0?e:null}function qg(t){let e=Hg(t).trim();if(e.startsWith('"'))try{let r=JSON.parse(e);return typeof r=="string"?r:null}catch{return null}return e.startsWith("'")&&e.endsWith("'")&&e.length>=2?e.slice(1,-1):null}function dO(t){let e=Hg(t).trim();if(!e.startsWith("[")||!e.endsWith("]"))return null;let r=e.slice(1,-1).trim();if(r.length===0)return[];let n=r.split(",").map(s=>qg(s.trim()));return n.some(s=>s===null)?null:n}function Hg(t){let e;for(let r=0;r<t.length;r+=1){let n=t[r];if(e!==void 0){if(e==='"'&&n==="\\"){r+=1;continue}n===e&&(e=void 0);continue}if(n==='"'||n==="'"){e=n;continue}if(n==="#")return t.slice(0,r)}return t}function fO(t){return Lt(t)?t.type==="stdio"&&typeof t.command=="string"&&Jg(t.command,t.args):!1}function mO(t){return!Lt(t)||!Array.isArray(t.command)?!1:t.command.length===2&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&Kg(t.command[0])&&t.command[1]==="mcp"||t.command.length===3&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&typeof t.command[2]=="string"&&Gg(t.command[0],[t.command[1],t.command[2]])}function pO(t){return Lt(t)?t.type==="stdio"&&Xg(t.command,t.args):!1}function _O(t){return!Lt(t)||!Array.isArray(t.command)?!1:t.command.length===2&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&Vg(t.command[0])&&t.command[1]==="mcp"}function Jg(t,e){return Kg(t)&&Yg(e)||Gg(t,e)}function Xg(t,e){return Vg(t)&&Yg(e)}function Gg(t,e){return hO(t)&&Array.isArray(e)&&e.length===2&&gO(e[0])&&e[1]==="mcp"}function Kg(t){return typeof t=="string"&&Wu(t)==="lmctl"}function Vg(t){return typeof t=="string"&&Wu(t)==="lmctl0"}function hO(t){if(typeof t!="string")return!1;let e=Wu(t).toLowerCase();return e==="node"||e==="node.exe"}function gO(t){if(typeof t!="string")return!1;let e=t.replace(/\\/g,"/");return e==="lmctl-cli/dist/index.js"||e.endsWith("/lmctl-cli/dist/index.js")}function Wu(t){let e=t.replace(/\\/g,"/");return e.split("/").filter(n=>n.length>0).at(-1)??e}function Yg(t){return Array.isArray(t)&&t.length===1&&t[0]==="mcp"}function yO(t,e){return t!==void 0&&qi(t)===qi(e)}function qi(t){return Array.isArray(t)?`[${t.map(e=>qi(e)).join(",")}]`:Lt(t)?`{${Object.keys(t).sort().map(e=>`${JSON.stringify(e)}:${qi(t[e])}`).join(",")}}`:JSON.stringify(t)}function Lt(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Ui,Wi,sO,Xe,Dg,Os=b(()=>{"use strict";ve();Ui="lmctl",Wi="lmctl0",sO={existsSync:z$,mkdirSync:Z$,readFileSync:Q$,writeFileSync:rO,renameSync:eO,unlinkSync:tO},Xe=sO});import{spawnSync as ry}from"node:child_process";import{cpSync as zg,existsSync as Hu,mkdirSync as ny,mkdtempSync as wO,readFileSync as sy,statSync as EO,writeFileSync as Bu}from"node:fs";import{homedir as TO,tmpdir as bO}from"node:os";import{basename as Zg,join as ot}from"node:path";function Gt(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function qu(t,e,r){if(Array.isArray(t)){for(let n of t)qu(n,e,r);return}if(Gt(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))qu(n,e,r)}}function IO(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(!(!Gt(a)||!Array.isArray(a.steps)))for(let l of a.steps)Gt(l)&&l.members!==void 0&&qu(l.members,e.alias,r)}let s=o=>{let i=new Map;for(let a of o)i.set(kO(a),a);return[...i.values()]};return{mcp:s(r.mcp),skills:s(r.skills)}}function NO(t,e){return t.listProjects().find(r=>r.team_id===e.team_id)?.local_path}async function oy(t,e){let r;try{r=await fetch(t,{signal:AbortSignal.timeout(SO)})}catch(s){throw new it(e,`fetch ${t} failed: ${s.message}`)}if(!r.ok)throw new it(e,`fetch ${t} \u2192 HTTP ${r.status}`);let n=await r.text();if(n.length>Qg)throw new it(e,`fetched ${t} exceeds ${Qg} bytes`);return n}async function AO(t,e){if(typeof t!="string")return[t];pr(t)&&(t=await Ls(t));let r;if(Ju.test(t))r=await oy(t,e);else{if(!Hu(t))throw new it(e,`mcp file not found: ${t}`);r=sy(t,"utf8")}let n;try{n=JSON.parse(r)}catch{throw new it(e,`mcp source is not JSON: ${t}`)}if(Gt(n)&&Gt(n.mcpServers))return Object.entries(n.mcpServers).map(([s,o])=>({name:s,...Gt(o)?o:{}}));if(Gt(n)&&typeof n.name=="string")return[n];throw new it(e,`mcp source ${t} is neither {mcpServers:{\u2026}} nor a {name,\u2026} server`)}function Ji(t){return t.type==="http"||t.type==="sse"||t.url!==void 0&&t.command===void 0}function Hi(t,e,r,n){let s=ry(t,e,{cwd:r,env:Ft(void 0,r),encoding:"utf8",timeout:6e4});if(s.error)throw new it(n,`spawn ${t} failed: ${s.error.message}`);if(s.status!==0)throw new it(n,`${t} ${e.slice(0,3).join(" ")} exited ${s.status}: ${(s.stderr??"").trim().slice(0,200)}`)}function xO(t,e,r){ry(t,e,{cwd:r,env:Ft(void 0,r),encoding:"utf8",timeout:6e4})}function RO(t,e){return t==="claude"?["mcp","remove",e,"--scope","user"]:["mcp","remove",e]}function LO(t){let e=["mcp","add"];if(Ji(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 $O(t){if(Ji(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 OO(t){let e=ot(process.env.XDG_CONFIG_HOME??ot(Sn(),".config"),"opencode"),r=ot(e,"opencode.json"),n={};if(Hu(r))try{let o=JSON.parse(sy(r,"utf8"));Gt(o)&&(n=o)}catch{}let s=Gt(n.mcp)?{...n.mcp}:{};for(let o of t){let{name:i,...a}=o;s[i]=Ji(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"),ny(e,{recursive:!0}),Bu(r,`${JSON.stringify(n,null,2)}
|
|
1836
|
+
`,"utf8")}function jO(t,e){let r={};for(let n of t)r[n.name]=Ji(n)?{type:n.type==="sse"?"sse":"http",url:n.url,...n.headers?{headers:n.headers}:{}}:{type:"stdio",command:n.command,args:n.args??[],...n.env?{env:n.env}:{}};try{Pg(Uu(Sn()),r)}catch(n){throw new it(e,`copilot MCP config install failed: ${n instanceof Error?n.message:String(n)}`)}}function CO(t){if(typeof t!="string")return t.name;let e=Zg(t.replace(/\/+$/,""));return e.toLowerCase()==="skill.md"?Zg(t.replace(/\/skill\.md$/i,"")):e}async function ey(t,e,r){let n=CO(t),s=ot(e,n);if(ny(s,{recursive:!0}),typeof t!="string")return Bu(ot(s,"SKILL.md"),t.content,"utf8"),{name:n,dir:s};if(pr(t)&&(t=await Ls(t)),Ju.test(t))return Bu(ot(s,"SKILL.md"),await oy(t,r),"utf8"),{name:n,dir:s};if(!Hu(t))throw new it(r,`skill path not found: ${t}`);return EO(t).isDirectory()?(zg(t,s,{recursive:!0}),{name:n,dir:s}):(zg(t,ot(s,"SKILL.md")),{name:n,dir:s})}async function Xi(t){let{dal:e,member:r,stderr:n}=t,s=IO(e,r);if(s.mcp.length===0&&s.skills.length===0)return;let o=xe(r),i=r.sessiondir||t.baseDir||NO(e,r)||process.cwd(),a=l=>{n.write(`[seed:${r.alias}] ${l}
|
|
1837
|
+
`)};if(s.mcp.length>0){let l=[];for(let c of s.mcp)l.push(...await AO(c,r.alias));if(o==="opencode")OO(l);else if(o==="copilot")jO(l,r.alias);else if(o==="claude"||o==="gemini"||o==="qwen"||o==="agy"||o==="codex")for(let c of l)if(xO(o,RO(o,c.name),i),o==="claude"){let{name:u,...d}=c;Hi("claude",["mcp","add-json",u,JSON.stringify(d),"--scope","user"],i,r.alias)}else o==="codex"?Hi("codex",$O(c),i,r.alias):Hi(o,LO(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(vO.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=wO(ot(bO(),`lmctl-skill-${r.alias}-`));for(let c of s.skills){let u=typeof c=="string"&&!Ju.test(c)?c:(await ey(c,l,r.alias)).dir;Hi(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(ty[o]!==void 0){let l=ty[o]();for(let c of s.skills)await ey(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 it,Ju,SO,Qg,vO,kO,Sn,ty,Xu=b(()=>{"use strict";Be();Fu();rt();Os();it=class extends Error{alias;constructor(e,r){super(`capability install failed for ${e}: ${r}`),this.alias=e,this.name="CapabilityInstallError"}},Ju=/^https?:\/\//i,SO=8e3,Qg=1e6,vO=new Set(["opencode"]),kO=t=>JSON.stringify(t),Sn=()=>process.env.HOME??TO();ty={claude:()=>ot(Sn(),".claude","skills"),qwen:()=>ot(Sn(),".qwen","skills"),codex:()=>ot(Sn(),".codex","skills"),copilot:()=>ot(Sn(),".copilot","skills")}});var uy={};se(uy,{defaultTeamNameForProject:()=>ej,resolveAlias:()=>Vi,resolveProject:()=>Gi,resolveTeam:()=>Ki,runCode:()=>PO});import{execFileSync as MO}from"node:child_process";import{basename as DO,resolve as iy}from"node:path";import*as Ku from"node:readline";import{setTimeout as Gu}from"node:timers/promises";async function PO(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r===void 0)return FO(e);if(r==="chat"&&(n.includes("--help")||n.includes("-h")))return ly(e);if(r==="spec"&&(n.includes("--help")||n.includes("-h")))return KO(e);try{return await R(e,async s=>{switch(r){case"team":return UO(n,e,s);case"chat":return JO(n,e,s);case"spec":return XO(n,e,s);default:return y(e,"usage: lmctl code <team|chat|spec> ...")}})}catch(s){return _e(e,s)}}function FO(t){return t.stdout.write(["usage: lmctl code <team|chat|spec> ..."," lmctl code spec <task-description> [options]","","Manage the active project code team, chat with a code agent, or start","spec-driven code work.","","subcommands:"," team add <alias> --provider P [--model M] [--role R] [--sessiondir DIR] [--project NAME] [--team NAME] [--json]"," team list"," team show <alias>"," team rm <alias>"," chat [--alias A]"," spec <task-description> [--slug S] [--template W]",""].join(`
|
|
1838
|
+
`)),0}function UO(t,e,r){let[n,...s]=t;switch(n){case"add":return WO(s,e,r);case"list":return BO(s,e,r);case"show":return qO(s,e,r);case"rm":return HO(s,e,r);default:return y(e,"usage: lmctl code team <add|list|show|rm>")}}function WO(t,e,r){let n=P(t,["--project","--team","--provider","--model","--role","--sessiondir"]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: code team add <alias> --provider P [--model M] [--role R] [--sessiondir DIR] [--project NAME] [--team NAME] [--json]");let o=L(n,"--provider");if(o===void 0)return y(e,"code team add requires --provider");let i=vn(e,r,L(n,"--project"),L(n,"--team"));if(typeof i=="number")return i;let a=r.insertTeamMember({team_id:i.team.id,alias:s,provider:o,model:L(n,"--model")??null,role:L(n,"--role")??"agent",sessiondir:L(n,"--sessiondir")??i.project.local_path});return C(n,"--json")?F(e,a):e.stdout.write(`added member ${a.alias} to ${i.team.name}
|
|
1839
|
+
`),0}function BO(t,e,r){let n=P(t,["--project","--team"]);if(n.error!==void 0)return y(e,n.error);let s=vn(e,r,L(n,"--project"),L(n,"--team"));if(typeof s=="number")return s;let o=cy(r.listTeamMembers(s.team.id));if(C(n,"--json"))F(e,o);else for(let i of o)e.stdout.write(`${i.alias} ${i.role} ${xe(i)} ${i.sessionid??"(unseeded)"}
|
|
1840
|
+
`);return 0}function qO(t,e,r){let n=P(t,["--project","--team"]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: code team show <alias>");let o=vn(e,r,L(n,"--project"),L(n,"--team"));if(typeof o=="number")return o;let i=r.findTeamMemberByAlias(o.team.id,s);return i===null||i.state==="retired"?y(e,`member not found: ${s}`):(C(n,"--json")?F(e,i):(e.stdout.write(`member ${i.alias}
|
|
1841
1841
|
`),e.stdout.write(`role: ${i.role}
|
|
1842
|
-
`),e.stdout.write(`provider: ${
|
|
1842
|
+
`),e.stdout.write(`provider: ${xe(i)}
|
|
1843
1843
|
`),e.stdout.write(`model: ${i.model??"(default)"}
|
|
1844
1844
|
`),e.stdout.write(`sessionid: ${i.sessionid??"(unseeded)"}
|
|
1845
1845
|
`),e.stdout.write(`sessiondir: ${i.sessiondir}
|
|
1846
|
-
`)),0)}function HO(t,e,r){let n=P(t,["--project","--team"]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: code team rm <alias>");let o=vn(e,r,L(n,"--project"),L(n,"--team"));if(typeof o=="number")return o;let i=r.findTeamMemberByAlias(o.team.id,s);if(i===null||i.state==="retired")return y(e,`member not found: ${s}`);let a=r.setMemberState(i.id,"retired","removed via code team rm");return
|
|
1846
|
+
`)),0)}function HO(t,e,r){let n=P(t,["--project","--team"]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: code team rm <alias>");let o=vn(e,r,L(n,"--project"),L(n,"--team"));if(typeof o=="number")return o;let i=r.findTeamMemberByAlias(o.team.id,s);if(i===null||i.state==="retired")return y(e,`member not found: ${s}`);let a=r.setMemberState(i.id,"retired","removed via code team rm");return C(n,"--json")?F(e,a):e.stdout.write(`retired member ${i.alias}
|
|
1847
1847
|
`),0}async function JO(t,e,r){if(t.includes("--help")||t.includes("-h"))return ly(e);let n=P(t,["--project","--team","--alias"]);if(n.error!==void 0)return y(e,n.error);let s=vn(e,r,L(n,"--project"),L(n,"--team"));if(typeof s=="number")return s;let o=Vi(e,r,s.team,L(n,"--alias"));if(typeof o=="number")return o;let i=await QO(e,r,s.project,o);e.stdout.write(`[${i.alias}@${s.project.name}] type /help for commands
|
|
1848
1848
|
`);let a=e.stdin??process.stdin,l=Ku.createInterface({input:a,terminal:!1}),c=i;js(e,c,s.project);try{for await(let u of l){let d=u.trim();if(d.length===0){js(e,c,s.project);continue}if(d==="/exit")return e.stdout.write(`[bye]
|
|
1849
1849
|
`),0;if(d==="/help"){ZO(e),js(e,c,s.project);continue}if(d.startsWith("/")){e.stderr.write(`unknown command: ${d}
|
|
@@ -1861,17 +1861,17 @@ Don't dump all of durable-memory into your context. The pattern is index-first,
|
|
|
1861
1861
|
`),0;if(c==="/done")return await Cs(e,`/api/interactive/${i.id}/respond`,"POST",{input:"",done:!0}),"continue";if(c.length!==0)return await Cs(e,`/api/interactive/${i.id}/respond`,"POST",{input:c,done:!1}),"continue"}}finally{a.close()}return 0}async function Cs(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 zO(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,60);return e.length>0?e:"spec-task"}function ly(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(`
|
|
1862
1862
|
`)),0}function ZO(t){t.stderr.write(`commands: /help, /exit
|
|
1863
1863
|
`)}function js(t,e,r){t.stdout.write(`[${e.alias}@${r.name}] > `)}function Gi(t,e,r){if(r!==void 0){let a=e.findProjectByName(r);return a===null?y(t,`project not found: ${r}`):a}let n=t.cwd??process.cwd(),s;try{s=MO("git",["rev-parse","--show-toplevel"],{cwd:n,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return y(t,"not in a git repo; use --project <name>")}let o=iy(s),i=e.listProjects().find(a=>iy(a.local_path)===o);return i===void 0?y(t,"no lmctl project for this directory; create via `lmctl project create` or use --project <name>"):i}function Ki(t,e,r,n){if(n!==void 0){let o=e.findTeamByName(n);return o===null?y(t,`team not found: ${n}`):o}let s=e.getTeam(r.team_id);return s===null?y(t,`project ${r.name} has no assigned team; use --team <name>`):s}function Vi(t,e,r,n){if(n!==void 0){let o=e.findTeamMemberByAlias(r.id,n);return o===null||o.state==="retired"?y(t,`member not found: ${n}`):o}let s=cy(e.listTeamMembers(r.id)).find(o=>o.role==="agent");return s===void 0?y(t,`team ${r.name} has no active agent member; add one with \`lmctl code team add <alias> --provider <provider>\``):s}function vn(t,e,r,n){let s=Gi(t,e,r);if(typeof s=="number")return s;let o=Ki(t,e,s,n);return typeof o=="number"?o:{project:s,team:o}}function cy(t){return t.filter(e=>e.state!=="retired")}async function QO(t,e,r,n){if(n.sessionid!==null&&n.sessionid.trim().length>0)return n;t.stderr.write(`[seeding ${n.alias}...]
|
|
1864
|
-
`),
|
|
1864
|
+
`),xi(r,e),Li(r);let s=await fn({member:n,dal:e}),o=e.updateTeamMemberSession(n.id,s.sessionid);if(o===null)throw new Error(`member disappeared during seed: ${n.alias}`);let i=gn(xe(o),s.sessionid);i!==null&&t.stderr.write(`[seeded ${o.alias}] customize/compact in its native TUI:
|
|
1865
1865
|
${i}
|
|
1866
1866
|
`),await Xi({dal:e,member:o,stderr:t.stderr,baseDir:r.local_path});let a=o.role_prompt??"",l=a.length>0?`${a}
|
|
1867
1867
|
|
|
1868
|
-
${hn}`:hn;return e.setMemberPromptSnapshot(o.id,l)??o}function ej(t){return`${DO(t.local_path)}-code`}var ay,Vu=b(()=>{"use strict";bs();di();xs();Lu();$u();Me();Fr();Xu();ge();Au();ay="spec-driven-task"});import dy from"jexl";function hr(t){dy.compile(fy(t))}async function Ur(t,e){return dy.eval(fy(t),e)}function fy(t){return t.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var kn=b(()=>{"use strict"});import{z as S}from"zod";function rd(t){let e=t.trim();return e.startsWith("={{")&&e.endsWith("}}")?e.slice(3,-2).trim():t}var tj,my,Yu,zu,Zu,Qu,ed,td,py,rj,nj,sj,Ms,oj,Yi,zi,Zi,Qi,ea,_y,ij,aj,lj,cj,ta,In=b(()=>{"use strict";kn();tj=S.object({kind:S.enum(["success","neutral","failure"])}),my=S.enum(["string","number","boolean","object","array"]),Yu=S.object({name:S.string().min(1),type:my,required:S.boolean().optional(),default:S.unknown().optional(),description:S.string().optional()}),zu=S.object({name:S.string().min(1),type:my,source_step_id:S.string().min(1),source_field:S.string().min(1),description:S.string().optional()}),Zu=S.object({id:S.string().min(1),type:S.string().min(1),parameters:S.record(S.string(),S.unknown()).default({})}),Qu="__failure__",ed=S.object({tools:S.array(S.string().min(1)).optional(),auth:S.array(S.string().min(1)).optional()}).strict().optional(),td=S.object({on_unhandled_failure:S.object({attention_kind:S.string().min(1).default("workflow_failed"),severity:S.enum(["warn","error","critical"]).default("warn"),capture_evidence:S.boolean().default(!0),recommend_recovery:S.string().min(1).optional()}).optional(),on_unhandled_failure_state:S.string().min(1).optional()}).optional(),py=S.object({type:S.literal("AssertRepoClean"),fail_message:S.string().min(1).optional(),next:S.string().min(1)}),rj=S.object({name:S.string().min(1),command:S.string().min(1).optional(),args:S.array(S.string()).optional(),env:S.record(S.string(),S.string()).optional(),type:S.enum(["stdio","http","sse"]).optional(),url:S.string().min(1).optional(),headers:S.record(S.string(),S.string()).optional()}).strict(),nj=S.union([S.string().min(1),rj]),sj=S.union([S.string().min(1),S.object({name:S.string().min(1),content:S.string().min(1)}).strict()]),Ms=S.object({team:S.string().min(1),alias:S.string().min(1),prompt_template:S.string().optional(),mcp:S.array(nj).optional(),skills:S.array(sj).optional()}),oj=S.object({kind:S.literal("shell"),command:S.string().min(1),description:S.string().optional()}),Yi=S.object({type:S.literal("Review"),state_name:S.string().min(1),coder:Ms,pre_checks:S.array(oj).optional(),reviewers:S.array(Ms.extend({rubric_artifact:S.string().optional()})).optional(),outcomes:S.object({approve:S.string().min(1),request_changes:S.string().optional(),fail_pre_check:S.string().optional(),max_loops_exceeded:S.string().optional()}),writes_to_project_path:S.boolean().optional(),durable_memory_tags:S.array(S.string().min(1)).optional(),write_back_durable_memory:S.union([S.boolean(),S.string().min(1)]).optional(),max_loops:S.number().int().positive().default(5),loop_feedback_artifact:S.string().optional(),outcomes_from_stance:S.record(S.string(),S.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"})}),zi=S.object({type:S.literal("Consolidate"),state_name:S.string().min(1),researchers:S.array(Ms.extend({topic:S.string().min(1)})).optional(),consolidator:Ms,outcomes:S.object({ok:S.string().min(1),error:S.string().optional()}),research_artifact_prefix:S.string().optional(),durable_memory_tags:S.array(S.string().min(1)).optional(),write_back_durable_memory:S.union([S.boolean(),S.string().min(1)]).optional()}),Zi=S.object({type:S.literal("Interactive"),state_name:S.string().min(1),agent:Ms.extend({initial_prompt_template:S.string().min(1)}),termination:S.object({operator_signal:S.boolean().default(!0),agent_signal:S.string().optional(),max_turns:S.number().int().positive().default(20),timeout_seconds:S.number().int().positive().optional()}),outcomes:S.object({done:S.string().min(1),timeout:S.string().optional()}),artifact_name:S.string().optional(),durable_memory_tags:S.array(S.string().min(1)).optional(),write_back_durable_memory:S.union([S.boolean(),S.string().min(1)]).optional()}),Qi=S.object({type:S.literal("Loop"),state_name:S.string().min(1),over:S.string().min(1),item_var:S.string().min(1),body:S.string().min(1),outcomes:S.object({ok:S.string().min(1),error:S.string().optional()}),stop_on_error:S.boolean().default(!0),max_items:S.number().int().positive().default(1e3)}),ea=S.object({type:S.literal("ShellStep"),state_name:S.string().min(1),command:S.string().min(1),outcomes_from_exit:S.record(S.string(),S.string().min(1)),timeout_ms:S.number().int().nonnegative().optional(),capture_output_to:S.string().optional(),writes_to_project_path:S.boolean().optional()}),_y=S.object({type:S.literal("Choice"),state_name:S.string().min(1),branches:S.array(S.object({when:S.string().min(1),next:S.string().min(1)})).default([]),default_next:S.string().min(1).optional()}).superRefine((t,e)=>{for(let[r,n]of t.branches.entries())try{hr(rd(n.when))}catch(s){let o=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["branches",r,"when"],message:`invalid jexl expression: ${o}`})}}),ij=S.discriminatedUnion("type",[py,Yi,zi,Zi,Qi,ea,_y]),aj=S.object({type:S.literal("ForEach"),state_name:S.string().min(1),items_from:S.string().min(1),mode:S.enum(["sequential","parallel"]).default("sequential"),max_concurrency:S.number().int().positive().default(1),on_item_failure:S.enum(["continue","stop"]).default("stop"),body:ij,outcomes:S.object({all_ok:S.string().min(1),any_failed:S.string().optional()})}).superRefine((t,e)=>{try{hr(rd(t.items_from))}catch(r){let n=r instanceof Error?r.message:"invalid expression";e.addIssue({code:"custom",path:["items_from"],message:`invalid jexl expression: ${n}`})}}),lj=S.object({type:S.literal("Subflow"),state_name:S.string().min(1),workflow_name:S.string().min(1),inputs:S.record(S.string(),S.string().min(1)).optional(),outcomes:S.record(S.string(),S.string().min(1))}).superRefine((t,e)=>{for(let[r,n]of Object.entries(t.inputs??{}))try{hr(rd(n))}catch(s){let o=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["inputs",r],message:`invalid jexl expression: ${o}`})}}),cj=S.discriminatedUnion("type",[py,Yi,zi,Zi,Qi,ea,_y,aj,lj]),ta=S.object({name:S.string().min(1),version:S.number().int().positive(),definition_schema_version:S.union([S.literal(1),S.literal(2)]),description:S.string().optional(),estimated_duration_ms:S.number().int().nonnegative().optional(),primitive_version:S.union([S.literal(1),S.literal(2)]).default(1),start_at:S.string().min(1),states:S.record(S.string().min(1),cj),terminals:S.record(S.string().min(1),tj),errors:td,concurrency_key:S.string().min(1).optional(),concurrent_limit:S.number().int().positive().optional(),default_task_timeout_ms:S.number().int().positive().max(216e5).optional(),inputs:S.array(Yu).optional(),outputs:S.array(zu).optional(),triggers:S.array(Zu).optional(),read_only:S.boolean().optional(),requires:ed}).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 Z}from"zod";var uj,ra,dj,fj,mj,$t,Nn=b(()=>{"use strict";In();uj=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,ra=Z.string().regex(uj),dj=Z.object({step_id:ra,type:Z.literal("main"),index:Z.number().int().min(0)}),fj=Z.record(ra,Z.record(Z.string().min(1),Z.array(Z.array(dj)))),mj=Z.object({id:ra,name:Z.string().min(1),type:Z.string().min(1),typeVersion:Z.number().int().positive().default(1),parameters:Z.record(Z.string(),Z.unknown()).default({}),members:Z.record(Z.string(),Z.unknown()).optional(),estimated_duration_ms:Z.number().int().nonnegative().optional()}),$t=Z.object({schema_version:Z.literal("lmctl/v3"),definition_schema_version:Z.literal(3),name:Z.string().min(1),version:Z.number().int().positive(),description:Z.string().optional(),estimated_duration_ms:Z.number().int().nonnegative().optional(),default_task_timeout_ms:Z.number().int().positive().max(216e5).optional(),concurrency_key:Z.string().min(1).optional(),concurrent_limit:Z.number().int().positive().optional(),errors:td,inputs:Z.array(Yu).optional(),outputs:Z.array(zu).optional(),steps:Z.array(mj).min(1),connections:fj.default({}),entry_step_id:ra,triggers:Z.array(Zu).optional(),read_only:Z.boolean().optional(),requires:ed}).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 na(t){return sd(t)}function sd(t){if(Array.isArray(t))return t.map(sd);if(t===null||typeof t!="object")return t;let e=t,r={};for(let n of Object.keys(e))r[n]=sd(e[n]);if(typeof r.type=="string"){let n=_j[r.type];n!==void 0&&(r.type=n)}return r}var nd,pj,_j,od=b(()=>{"use strict";nd="lmctl.builtin.",pj={Review:`${nd}Review`,Research:`${nd}Research`,Consolidate:`${nd}Consolidate`},_j=Object.fromEntries(Object.entries(pj).map(([t,e])=>[e,t]))});import{readFileSync as hj}from"node:fs";function yy(t){return gj(t)}function gj(t){let e=na(Ej(t));if(wj(e),wy(e)===3)return yj(e);let r=ta.safeParse(e);if(!r.success)throw new Kt({errors:r.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message}))});let n=Tj(r.data);if(n.errors.length>0||n.unresolvedRefs.length>0)throw new Kt(n);return r.data}function yj(t){let e=$t.safeParse(t);if(!e.success)throw new Kt({errors:e.error.issues.map(r=>({path:r.path.length===0?"$":r.path.map(String).join("."),message:r.message}))});return e.data}function wj(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return;let e=wy(t);if(!(e===null||hy.includes(e)))throw new Kt({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${e}; supported versions: ${hy.join(", ")}`}]})}function wy(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return null;let e=t.definition_schema_version;return typeof e=="number"?e:null}function Ej(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
|
|
1869
|
-
`)||e.startsWith("{")||e.startsWith("[")?gy(t,"$"):e.endsWith(".json")?gy(hj(e,"utf8"),e):t}function gy(t,e){try{return JSON.parse(t)}catch(r){let n=r instanceof Error?r.message:"invalid JSON";throw new Kt({errors:[{path:e,message:`invalid JSON: ${n}`}]})}}function Tj(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"}),bj(t,n,r);for(let[s,o]of Object.entries(t.states))new Set(Object.keys(t.terminals));return{errors:e,unresolvedRefs:r}}function bj(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 hy,Kt,Ey=b(()=>{"use strict";In();Nn();od();hy=[1,2,3],Kt=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 Sj}from"node:crypto";function Ty(t,e){let r=vj(e),n=Sj("sha1").update(`${t}:${e}`).digest("hex").slice(0,4);return`s-${r}-${n}`}function vj(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"step"}var by=b(()=>{"use strict";Nn()});function Nj(t,e){let r=Ij[t]??[],n={},s={};for(let[o,i]of Object.entries(e))r.includes(o)?s[o]=i:n[o]=i;return{params:n,members:s}}function Iy(t){let e=[],r=(I,
|
|
1870
|
-
`),s=[];for(let I=0;I<n.length;I+=1){let j=Rj(n[I]).trim();j.length>0&&s.push({n:I+1,text:j})}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,_=new Map,g=new Map,h=(I,x,j,J,W,D)=>{l.has(I)&&r(J,`duplicate step/terminal id: ${I}`),/^[A-Za-z][\w-]*$/.test(I)||r(J,`invalid id (must start with a letter): ${I}`),l.set(I,{declId:I,type:x,params:j,line:J,isTerminal:W,...D?{members:D}:{}}),u.push(I)},T=I=>{let x=[],j=I+1;for(;j<s.length;j+=1){let J=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[j].text);if(J===null)break;x.push({label:J[1],dst:J[2]})}return{branches:x,nextIdx:j-1}};for(let I=1;I<s.length;I+=1){let{n:x,text:j}=s[I],J=j.split(/\s+/,1)[0];if(/^meta\s*\(/.test(j)){I!==1&&r(x,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let W=/^meta\s*\((.*)\)\s*$/.exec(j)??r(x,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${j}`),D=gr(W[1],x,r);for(let ee of Object.keys(D))vy.has(ee)||r(x,`unknown \`meta\` key \`${ee}\` \u2014 only workflow-level runtime metadata is allowed: ${[...vy].join(", ")} (no grammar inflation; bounded)`);m=D;continue}if(J==="step"){let W=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(j)??r(x,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${j}`),D=W[1],ee=W[2],Ee=W[3],ae=Sy[ee];ae===void 0&&r(x,`unknown step type: ${ee} (supported \`step\` archetypes: ${Object.keys(Sy).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:Se,members:Ct}=Nj(ae,gr(Ee,x,r));h(D,ae,Se,x,!1,Object.keys(Ct).length>0?Ct:void 0);continue}if(J==="trigger"){let W=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(j)??r(x,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${j}`),D=W[1],ee=W[2],Ee=W[3],ae=ky[ee];ae===void 0&&r(x,`unknown trigger type: ${ee} (registered trigger archetypes: ${Object.keys(ky).join(", ")})`),p.has(D)&&r(x,`duplicate trigger id: ${D}`),p.set(D,{id:D,type:ae,parameters:gr(Ee,x,r)});continue}if(J==="mcp"||J==="skill"){let W=new RegExp(`^${J}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(j)??r(x,`malformed \`${J}\` decl (expected \`${J} <name> = {json} | ${J} <name> = "<file|url>"\`): ${j}`),D=W[1],ee=W[2].trim(),Ee=J==="mcp"?_:g;Ee.has(D)&&r(x,`duplicate ${J} declaration: ${D}`);let ae;if(ee.startsWith("{")){let Se=gr(ee,x,r);J==="mcp"?ae={...Se,name:D}:((typeof Se.content!="string"||Se.content.length===0)&&r(x,`\`skill ${D}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),ae={name:D,content:Se.content})}else{let Se=Ny(ee);(typeof Se!="string"||Se.length===0)&&r(x,`\`${J} ${D}\`: string form must be a non-empty file path or http(s) URL`),ae=Se}Ee.set(D,ae);continue}if(J==="terminal"){let W=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(j)??r(x,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${j}`);h(W[1],"lmctl/terminal",{name:W[2],kind:W[3]??"neutral"},x,!0);continue}if(J==="seq"){let D=j.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(ee=>ee.trim()).filter(ee=>ee.length>0);(D.length<3||D.length%2===0)&&r(x,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${j}`);for(let ee=0;ee+2<D.length+1&&!(ee+2>D.length-1);ee+=2){let Ee=D[ee],ae=D[ee+1],Se=D[ee+2],Ct=ae==="->"?"main":ae.slice(1,-2);c.push({srcDeclId:Ee,port:Ct,dstDeclId:Se,line:x})}continue}if(J==="choice"){let D=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(j)??r(x,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${j}`))[1],ee=[],Ee,ae=I+1;for(;ae<s.length;ae+=1){let Se=s[ae].text,Ct=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(Se);if(Ct!==null){Ee!==void 0&&r(s[ae].n,`\`choice ${D}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let Xn=Ct[2];ee.push({when:Ct[1].trim(),next:`@terminal:${Xn}`}),c.push({srcDeclId:D,port:Xn,dstDeclId:Ct[3],line:s[ae].n});continue}let Il=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(Se);if(Il!==null){Ee!==void 0&&r(s[ae].n,`\`choice ${D}\` has more than one \`default\``);let Xn=Il[1];Ee=`@terminal:${Xn}`,c.push({srcDeclId:D,port:Xn,dstDeclId:Il[2],line:s[ae].n});continue}break}ee.length===0&&r(x,`\`choice ${D}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),h(D,"lmctl/choice",{branches:ee,...Ee!==void 0?{default_next:Ee}:{}},x,!1),I=ae-1;continue}if(J==="loop"){let W=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(j)??r(x,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${j}`);h(W[1],"lmctl/loop",gr(W[2],x,r),x,!1);continue}if(J==="foreach"){let W=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(j)??r(x,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${j}`),D=gr(W[2],x,r);"mode"in D&&r(x,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),h(W[1],"lmctl/foreach",D,x,!1);continue}if(J==="call"){let W=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(j)??r(x,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${j}`),D=W[1],ee=gr(W[2],x,r),Ee=ee.workflow;(typeof Ee!="string"||Ee.length===0)&&r(x,`\`call ${D}\` requires a \`workflow=<name>\` argument`);let{workflow:ae,...Se}=ee;h(D,"lmctl/subflow",{workflow_name:Ee,...Se},x,!1),d.push({declId:D,target:Ee,line:x});continue}if(J==="decide"){let W=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(j)??r(x,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${j}`),D=W[1],ee=gr(W[2],x,r),{branches:Ee,nextIdx:ae}=T(I);Ee.length===0&&r(x,`\`decide ${D}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),h(D,"lmctl/interactive",{termination:{operator_signal:!0}},x,!1,{agent:ee});for(let Se of Ee)c.push({srcDeclId:D,port:Se.label,dstDeclId:Se.dst,line:x});I=ae;continue}if(J==="entry"){let W=/^entry\s+([A-Za-z][\w-]*)$/.exec(j)??r(x,`malformed \`entry\` (expected \`entry <id>\`): ${j}`);f!==void 0&&r(x,`duplicate \`entry\` (already set to ${f})`),f=W[1];continue}r(x,`unknown statement \`${J}\` (grammar: workflow / meta / trigger / mcp / skill / step / terminal / seq / choice / loop / foreach / call / decide / entry)`)}u.length===0&&r(s[0].n,"composition declares no steps"),f===void 0&&(f=u[0]),l.has(f)||r(s[0].n,`entry references undeclared step: ${f}`);let w=I=>{if(Array.isArray(I)){for(let j of I)w(j);return}if(typeof I!="object"||I===null)return;let x=I;if(typeof x.alias=="string")for(let[j,J]of[["mcp",_],["skills",g]]){let W=x[j];Array.isArray(W)&&(x[j]=W.map(D=>typeof D=="string"&&J.has(D)?structuredClone(J.get(D)):D))}for(let j of Object.values(x))w(j)};for(let I of u){let x=l.get(I);x.members!==void 0&&w(x.members)}let E=I=>Ty(i,I),k=u.map(I=>{let x=l.get(I);return{id:E(I),name:I,type:x.type,typeVersion:1,parameters:x.params,...x.members?{members:x.members}:{}}}),N={};for(let I of c){l.has(I.srcDeclId)||r(I.line,`edge source references undeclared step: ${I.srcDeclId}`),l.has(I.dstDeclId)||r(I.line,`dangling edge target: ${I.dstDeclId} is not declared`),l.get(I.srcDeclId).isTerminal&&r(I.line,`terminal \`${I.srcDeclId}\` cannot have an outgoing edge`);let x=E(I.srcDeclId);N[x]??={},N[x][I.port]!==void 0&&r(I.line,`duplicate edge port \`${I.port}\` on step \`${I.srcDeclId}\``),N[x][I.port]=[[{step_id:E(I.dstDeclId),type:"main",index:0}]]}for(let I of u){let x=l.get(I);xj.has(x.type)||r(x.line,`unknown archetype \`${x.type}\` for step \`${I}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let I of d)I.target===i&&r(I.line,`subflow cycle: \`call ${I.declId}\` invokes this workflow (\`${i}\`) \u2014 direct recursion is not allowed (cross-workflow A\u2192B\u2192A cycle detection is deferred to the M3 compile.ts seam)`);let H=new Map;for(let I of c){let x=H.get(I.srcDeclId);x===void 0?H.set(I.srcDeclId,[I.dstDeclId]):x.push(I.dstDeclId)}for(let I of u){let x=l.get(I);if(x.type!=="lmctl/loop")continue;let j=x.params.body;if(typeof j=="string"&&l.has(j)){let J=H.get(I);J===void 0?H.set(I,[j]):J.push(j)}}let ne=new Set([f]),q=[f];for(;q.length>0;){let I=q.shift();for(let x of H.get(I)??[])ne.has(x)||(ne.add(x),q.push(x))}for(let I of u)ne.has(I)||r(l.get(I).line,`step \`${I}\` is unreachable from entry \`${f}\``);let O=new Map;for(let I of c){let x=O.get(I.srcDeclId);x===void 0&&(x=new Set,O.set(I.srcDeclId,x)),x.add(I.port)}let A=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let I of u){let x=l.get(I);if(x.isTerminal)continue;let j=O.get(I)??new Set;if(x.type==="lmctl/review"){let W=[...j].some(D=>!A.has(D));!j.has("approve")&&!W&&r(x.line,`uncovered outcome: review step \`${I}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${I} -approve-> <target>\`) or a stance port (run.ts:423-438 synthesizes outcomes_from_stance; review.ts:88-102 routes a stance before default approve)`);continue}let J=Aj[x.type];if(J!==void 0)for(let W of J)j.has(W)||r(x.line,`uncovered outcome: required outcome \`${W}\` of step \`${I}\` (\`${x.type}\`) has no connection \u2014 route it (\`seq ${I} -${W}-> <target|terminal>\`)`);else j.size===0&&r(x.line,`uncovered outcome: non-terminal step \`${I}\` (\`${x.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let I of u){let x=l.get(I),j=kj[x.type];if(j===void 0)continue;let J={...x.params,...x.members??{},type:j.v2type,state_name:I,...Object.keys(j.outcomes).length>0?{outcomes:j.outcomes}:{}},W=j.schema.safeParse(J);if(!W.success){let D=W.error.issues[0],ee=D.path.length===0?"$":D.path.map(String).join(".");r(x.line,`step \`${I}\` (\`${x.type}\`) has invalid params for archetype \`${j.v2type}\` at \`${ee}\`: ${D.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${I} = ${x.type.replace("lmctl/","")}({ ... })\``)}}let X={schema_version:"lmctl/v3",definition_schema_version:3,name:i,version:a,...m,...p.size>0?{triggers:[...p.values()]}:{},steps:k,connections:N,entry_step_id:E(f)},U=$t.safeParse(X);if(!U.success)throw new xn(U.error.issues.map(I=>({line:s[0].n,message:`emitted V3 invalid at ${I.path.length===0?"$":I.path.map(String).join(".")}: ${I.message}`})));return U.data}function Rj(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 gr(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 Lj(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]=Ny(l)}return s}function Lj(t){return t.split(",").map(e=>e.trim()).filter(e=>e.length>0)}function Ny(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 kj,Ij,Sy,xn,xj,Aj,vy,ky,xy=b(()=>{"use strict";Nn();by();In();kj={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:Yi},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:zi},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:Zi},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:Qi},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:ea}},Ij={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};Sy={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"},xn=class extends Error{issues;constructor(e){super(`composition DSL compile failed:
|
|
1868
|
+
${hn}`:hn;return e.setMemberPromptSnapshot(o.id,l)??o}function ej(t){return`${DO(t.local_path)}-code`}var ay,Vu=b(()=>{"use strict";bs();di();As();Lu();$u();Be();Fr();Xu();ge();xu();ay="spec-driven-task"});import dy from"jexl";function hr(t){dy.compile(fy(t))}async function Ur(t,e){return dy.eval(fy(t),e)}function fy(t){return t.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var kn=b(()=>{"use strict"});import{z as S}from"zod";function rd(t){let e=t.trim();return e.startsWith("={{")&&e.endsWith("}}")?e.slice(3,-2).trim():t}var tj,my,Yu,zu,Zu,Qu,ed,td,py,rj,nj,sj,Ms,oj,Yi,zi,Zi,Qi,ea,_y,ij,aj,lj,cj,ta,In=b(()=>{"use strict";kn();tj=S.object({kind:S.enum(["success","neutral","failure"])}),my=S.enum(["string","number","boolean","object","array"]),Yu=S.object({name:S.string().min(1),type:my,required:S.boolean().optional(),default:S.unknown().optional(),description:S.string().optional()}),zu=S.object({name:S.string().min(1),type:my,source_step_id:S.string().min(1),source_field:S.string().min(1),description:S.string().optional()}),Zu=S.object({id:S.string().min(1),type:S.string().min(1),parameters:S.record(S.string(),S.unknown()).default({})}),Qu="__failure__",ed=S.object({tools:S.array(S.string().min(1)).optional(),auth:S.array(S.string().min(1)).optional()}).strict().optional(),td=S.object({on_unhandled_failure:S.object({attention_kind:S.string().min(1).default("workflow_failed"),severity:S.enum(["warn","error","critical"]).default("warn"),capture_evidence:S.boolean().default(!0),recommend_recovery:S.string().min(1).optional()}).optional(),on_unhandled_failure_state:S.string().min(1).optional()}).optional(),py=S.object({type:S.literal("AssertRepoClean"),fail_message:S.string().min(1).optional(),next:S.string().min(1)}),rj=S.object({name:S.string().min(1),command:S.string().min(1).optional(),args:S.array(S.string()).optional(),env:S.record(S.string(),S.string()).optional(),type:S.enum(["stdio","http","sse"]).optional(),url:S.string().min(1).optional(),headers:S.record(S.string(),S.string()).optional()}).strict(),nj=S.union([S.string().min(1),rj]),sj=S.union([S.string().min(1),S.object({name:S.string().min(1),content:S.string().min(1)}).strict()]),Ms=S.object({team:S.string().min(1),alias:S.string().min(1),prompt_template:S.string().optional(),mcp:S.array(nj).optional(),skills:S.array(sj).optional()}),oj=S.object({kind:S.literal("shell"),command:S.string().min(1),description:S.string().optional()}),Yi=S.object({type:S.literal("Review"),state_name:S.string().min(1),coder:Ms,pre_checks:S.array(oj).optional(),reviewers:S.array(Ms.extend({rubric_artifact:S.string().optional()})).optional(),outcomes:S.object({approve:S.string().min(1),request_changes:S.string().optional(),fail_pre_check:S.string().optional(),max_loops_exceeded:S.string().optional()}),writes_to_project_path:S.boolean().optional(),durable_memory_tags:S.array(S.string().min(1)).optional(),write_back_durable_memory:S.union([S.boolean(),S.string().min(1)]).optional(),max_loops:S.number().int().positive().default(5),loop_feedback_artifact:S.string().optional(),outcomes_from_stance:S.record(S.string(),S.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"})}),zi=S.object({type:S.literal("Consolidate"),state_name:S.string().min(1),researchers:S.array(Ms.extend({topic:S.string().min(1)})).optional(),consolidator:Ms,outcomes:S.object({ok:S.string().min(1),error:S.string().optional()}),research_artifact_prefix:S.string().optional(),durable_memory_tags:S.array(S.string().min(1)).optional(),write_back_durable_memory:S.union([S.boolean(),S.string().min(1)]).optional()}),Zi=S.object({type:S.literal("Interactive"),state_name:S.string().min(1),agent:Ms.extend({initial_prompt_template:S.string().min(1)}),termination:S.object({operator_signal:S.boolean().default(!0),agent_signal:S.string().optional(),max_turns:S.number().int().positive().default(20),timeout_seconds:S.number().int().positive().optional()}),outcomes:S.object({done:S.string().min(1),timeout:S.string().optional()}),artifact_name:S.string().optional(),durable_memory_tags:S.array(S.string().min(1)).optional(),write_back_durable_memory:S.union([S.boolean(),S.string().min(1)]).optional()}),Qi=S.object({type:S.literal("Loop"),state_name:S.string().min(1),over:S.string().min(1),item_var:S.string().min(1),body:S.string().min(1),outcomes:S.object({ok:S.string().min(1),error:S.string().optional()}),stop_on_error:S.boolean().default(!0),max_items:S.number().int().positive().default(1e3)}),ea=S.object({type:S.literal("ShellStep"),state_name:S.string().min(1),command:S.string().min(1),outcomes_from_exit:S.record(S.string(),S.string().min(1)),timeout_ms:S.number().int().nonnegative().optional(),capture_output_to:S.string().optional(),writes_to_project_path:S.boolean().optional()}),_y=S.object({type:S.literal("Choice"),state_name:S.string().min(1),branches:S.array(S.object({when:S.string().min(1),next:S.string().min(1)})).default([]),default_next:S.string().min(1).optional()}).superRefine((t,e)=>{for(let[r,n]of t.branches.entries())try{hr(rd(n.when))}catch(s){let o=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["branches",r,"when"],message:`invalid jexl expression: ${o}`})}}),ij=S.discriminatedUnion("type",[py,Yi,zi,Zi,Qi,ea,_y]),aj=S.object({type:S.literal("ForEach"),state_name:S.string().min(1),items_from:S.string().min(1),mode:S.enum(["sequential","parallel"]).default("sequential"),max_concurrency:S.number().int().positive().default(1),on_item_failure:S.enum(["continue","stop"]).default("stop"),body:ij,outcomes:S.object({all_ok:S.string().min(1),any_failed:S.string().optional()})}).superRefine((t,e)=>{try{hr(rd(t.items_from))}catch(r){let n=r instanceof Error?r.message:"invalid expression";e.addIssue({code:"custom",path:["items_from"],message:`invalid jexl expression: ${n}`})}}),lj=S.object({type:S.literal("Subflow"),state_name:S.string().min(1),workflow_name:S.string().min(1),inputs:S.record(S.string(),S.string().min(1)).optional(),outcomes:S.record(S.string(),S.string().min(1))}).superRefine((t,e)=>{for(let[r,n]of Object.entries(t.inputs??{}))try{hr(rd(n))}catch(s){let o=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["inputs",r],message:`invalid jexl expression: ${o}`})}}),cj=S.discriminatedUnion("type",[py,Yi,zi,Zi,Qi,ea,_y,aj,lj]),ta=S.object({name:S.string().min(1),version:S.number().int().positive(),definition_schema_version:S.union([S.literal(1),S.literal(2)]),description:S.string().optional(),estimated_duration_ms:S.number().int().nonnegative().optional(),primitive_version:S.union([S.literal(1),S.literal(2)]).default(1),start_at:S.string().min(1),states:S.record(S.string().min(1),cj),terminals:S.record(S.string().min(1),tj),errors:td,concurrency_key:S.string().min(1).optional(),concurrent_limit:S.number().int().positive().optional(),default_task_timeout_ms:S.number().int().positive().max(216e5).optional(),inputs:S.array(Yu).optional(),outputs:S.array(zu).optional(),triggers:S.array(Zu).optional(),read_only:S.boolean().optional(),requires:ed}).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 Z}from"zod";var uj,ra,dj,fj,mj,$t,Nn=b(()=>{"use strict";In();uj=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,ra=Z.string().regex(uj),dj=Z.object({step_id:ra,type:Z.literal("main"),index:Z.number().int().min(0)}),fj=Z.record(ra,Z.record(Z.string().min(1),Z.array(Z.array(dj)))),mj=Z.object({id:ra,name:Z.string().min(1),type:Z.string().min(1),typeVersion:Z.number().int().positive().default(1),parameters:Z.record(Z.string(),Z.unknown()).default({}),members:Z.record(Z.string(),Z.unknown()).optional(),estimated_duration_ms:Z.number().int().nonnegative().optional()}),$t=Z.object({schema_version:Z.literal("lmctl/v3"),definition_schema_version:Z.literal(3),name:Z.string().min(1),version:Z.number().int().positive(),description:Z.string().optional(),estimated_duration_ms:Z.number().int().nonnegative().optional(),default_task_timeout_ms:Z.number().int().positive().max(216e5).optional(),concurrency_key:Z.string().min(1).optional(),concurrent_limit:Z.number().int().positive().optional(),errors:td,inputs:Z.array(Yu).optional(),outputs:Z.array(zu).optional(),steps:Z.array(mj).min(1),connections:fj.default({}),entry_step_id:ra,triggers:Z.array(Zu).optional(),read_only:Z.boolean().optional(),requires:ed}).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 na(t){return sd(t)}function sd(t){if(Array.isArray(t))return t.map(sd);if(t===null||typeof t!="object")return t;let e=t,r={};for(let n of Object.keys(e))r[n]=sd(e[n]);if(typeof r.type=="string"){let n=_j[r.type];n!==void 0&&(r.type=n)}return r}var nd,pj,_j,od=b(()=>{"use strict";nd="lmctl.builtin.",pj={Review:`${nd}Review`,Research:`${nd}Research`,Consolidate:`${nd}Consolidate`},_j=Object.fromEntries(Object.entries(pj).map(([t,e])=>[e,t]))});import{readFileSync as hj}from"node:fs";function yy(t){return gj(t)}function gj(t){let e=na(Ej(t));if(wj(e),wy(e)===3)return yj(e);let r=ta.safeParse(e);if(!r.success)throw new Kt({errors:r.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message}))});let n=Tj(r.data);if(n.errors.length>0||n.unresolvedRefs.length>0)throw new Kt(n);return r.data}function yj(t){let e=$t.safeParse(t);if(!e.success)throw new Kt({errors:e.error.issues.map(r=>({path:r.path.length===0?"$":r.path.map(String).join("."),message:r.message}))});return e.data}function wj(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return;let e=wy(t);if(!(e===null||hy.includes(e)))throw new Kt({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${e}; supported versions: ${hy.join(", ")}`}]})}function wy(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return null;let e=t.definition_schema_version;return typeof e=="number"?e:null}function Ej(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
|
|
1869
|
+
`)||e.startsWith("{")||e.startsWith("[")?gy(t,"$"):e.endsWith(".json")?gy(hj(e,"utf8"),e):t}function gy(t,e){try{return JSON.parse(t)}catch(r){let n=r instanceof Error?r.message:"invalid JSON";throw new Kt({errors:[{path:e,message:`invalid JSON: ${n}`}]})}}function Tj(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"}),bj(t,n,r);for(let[s,o]of Object.entries(t.states))new Set(Object.keys(t.terminals));return{errors:e,unresolvedRefs:r}}function bj(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 hy,Kt,Ey=b(()=>{"use strict";In();Nn();od();hy=[1,2,3],Kt=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 Sj}from"node:crypto";function Ty(t,e){let r=vj(e),n=Sj("sha1").update(`${t}:${e}`).digest("hex").slice(0,4);return`s-${r}-${n}`}function vj(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"step"}var by=b(()=>{"use strict";Nn()});function Nj(t,e){let r=Ij[t]??[],n={},s={};for(let[o,i]of Object.entries(e))r.includes(o)?s[o]=i:n[o]=i;return{params:n,members:s}}function Iy(t){let e=[],r=(I,A)=>{throw new An([{line:I,message:A}])},n=t.split(`
|
|
1870
|
+
`),s=[];for(let I=0;I<n.length;I+=1){let j=Rj(n[I]).trim();j.length>0&&s.push({n:I+1,text:j})}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,_=new Map,g=new Map,h=(I,A,j,J,W,D)=>{l.has(I)&&r(J,`duplicate step/terminal id: ${I}`),/^[A-Za-z][\w-]*$/.test(I)||r(J,`invalid id (must start with a letter): ${I}`),l.set(I,{declId:I,type:A,params:j,line:J,isTerminal:W,...D?{members:D}:{}}),u.push(I)},T=I=>{let A=[],j=I+1;for(;j<s.length;j+=1){let J=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[j].text);if(J===null)break;A.push({label:J[1],dst:J[2]})}return{branches:A,nextIdx:j-1}};for(let I=1;I<s.length;I+=1){let{n:A,text:j}=s[I],J=j.split(/\s+/,1)[0];if(/^meta\s*\(/.test(j)){I!==1&&r(A,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let W=/^meta\s*\((.*)\)\s*$/.exec(j)??r(A,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${j}`),D=gr(W[1],A,r);for(let ee of Object.keys(D))vy.has(ee)||r(A,`unknown \`meta\` key \`${ee}\` \u2014 only workflow-level runtime metadata is allowed: ${[...vy].join(", ")} (no grammar inflation; bounded)`);m=D;continue}if(J==="step"){let W=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(j)??r(A,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${j}`),D=W[1],ee=W[2],Ee=W[3],ae=Sy[ee];ae===void 0&&r(A,`unknown step type: ${ee} (supported \`step\` archetypes: ${Object.keys(Sy).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:Se,members:Ct}=Nj(ae,gr(Ee,A,r));h(D,ae,Se,A,!1,Object.keys(Ct).length>0?Ct:void 0);continue}if(J==="trigger"){let W=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(j)??r(A,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${j}`),D=W[1],ee=W[2],Ee=W[3],ae=ky[ee];ae===void 0&&r(A,`unknown trigger type: ${ee} (registered trigger archetypes: ${Object.keys(ky).join(", ")})`),p.has(D)&&r(A,`duplicate trigger id: ${D}`),p.set(D,{id:D,type:ae,parameters:gr(Ee,A,r)});continue}if(J==="mcp"||J==="skill"){let W=new RegExp(`^${J}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(j)??r(A,`malformed \`${J}\` decl (expected \`${J} <name> = {json} | ${J} <name> = "<file|url>"\`): ${j}`),D=W[1],ee=W[2].trim(),Ee=J==="mcp"?_:g;Ee.has(D)&&r(A,`duplicate ${J} declaration: ${D}`);let ae;if(ee.startsWith("{")){let Se=gr(ee,A,r);J==="mcp"?ae={...Se,name:D}:((typeof Se.content!="string"||Se.content.length===0)&&r(A,`\`skill ${D}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),ae={name:D,content:Se.content})}else{let Se=Ny(ee);(typeof Se!="string"||Se.length===0)&&r(A,`\`${J} ${D}\`: string form must be a non-empty file path or http(s) URL`),ae=Se}Ee.set(D,ae);continue}if(J==="terminal"){let W=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(j)??r(A,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${j}`);h(W[1],"lmctl/terminal",{name:W[2],kind:W[3]??"neutral"},A,!0);continue}if(J==="seq"){let D=j.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(ee=>ee.trim()).filter(ee=>ee.length>0);(D.length<3||D.length%2===0)&&r(A,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${j}`);for(let ee=0;ee+2<D.length+1&&!(ee+2>D.length-1);ee+=2){let Ee=D[ee],ae=D[ee+1],Se=D[ee+2],Ct=ae==="->"?"main":ae.slice(1,-2);c.push({srcDeclId:Ee,port:Ct,dstDeclId:Se,line:A})}continue}if(J==="choice"){let D=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(j)??r(A,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${j}`))[1],ee=[],Ee,ae=I+1;for(;ae<s.length;ae+=1){let Se=s[ae].text,Ct=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(Se);if(Ct!==null){Ee!==void 0&&r(s[ae].n,`\`choice ${D}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let Xn=Ct[2];ee.push({when:Ct[1].trim(),next:`@terminal:${Xn}`}),c.push({srcDeclId:D,port:Xn,dstDeclId:Ct[3],line:s[ae].n});continue}let Il=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(Se);if(Il!==null){Ee!==void 0&&r(s[ae].n,`\`choice ${D}\` has more than one \`default\``);let Xn=Il[1];Ee=`@terminal:${Xn}`,c.push({srcDeclId:D,port:Xn,dstDeclId:Il[2],line:s[ae].n});continue}break}ee.length===0&&r(A,`\`choice ${D}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),h(D,"lmctl/choice",{branches:ee,...Ee!==void 0?{default_next:Ee}:{}},A,!1),I=ae-1;continue}if(J==="loop"){let W=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(j)??r(A,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${j}`);h(W[1],"lmctl/loop",gr(W[2],A,r),A,!1);continue}if(J==="foreach"){let W=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(j)??r(A,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${j}`),D=gr(W[2],A,r);"mode"in D&&r(A,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),h(W[1],"lmctl/foreach",D,A,!1);continue}if(J==="call"){let W=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(j)??r(A,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${j}`),D=W[1],ee=gr(W[2],A,r),Ee=ee.workflow;(typeof Ee!="string"||Ee.length===0)&&r(A,`\`call ${D}\` requires a \`workflow=<name>\` argument`);let{workflow:ae,...Se}=ee;h(D,"lmctl/subflow",{workflow_name:Ee,...Se},A,!1),d.push({declId:D,target:Ee,line:A});continue}if(J==="decide"){let W=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(j)??r(A,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${j}`),D=W[1],ee=gr(W[2],A,r),{branches:Ee,nextIdx:ae}=T(I);Ee.length===0&&r(A,`\`decide ${D}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),h(D,"lmctl/interactive",{termination:{operator_signal:!0}},A,!1,{agent:ee});for(let Se of Ee)c.push({srcDeclId:D,port:Se.label,dstDeclId:Se.dst,line:A});I=ae;continue}if(J==="entry"){let W=/^entry\s+([A-Za-z][\w-]*)$/.exec(j)??r(A,`malformed \`entry\` (expected \`entry <id>\`): ${j}`);f!==void 0&&r(A,`duplicate \`entry\` (already set to ${f})`),f=W[1];continue}r(A,`unknown statement \`${J}\` (grammar: workflow / meta / trigger / mcp / skill / step / terminal / seq / choice / loop / foreach / call / decide / entry)`)}u.length===0&&r(s[0].n,"composition declares no steps"),f===void 0&&(f=u[0]),l.has(f)||r(s[0].n,`entry references undeclared step: ${f}`);let w=I=>{if(Array.isArray(I)){for(let j of I)w(j);return}if(typeof I!="object"||I===null)return;let A=I;if(typeof A.alias=="string")for(let[j,J]of[["mcp",_],["skills",g]]){let W=A[j];Array.isArray(W)&&(A[j]=W.map(D=>typeof D=="string"&&J.has(D)?structuredClone(J.get(D)):D))}for(let j of Object.values(A))w(j)};for(let I of u){let A=l.get(I);A.members!==void 0&&w(A.members)}let E=I=>Ty(i,I),k=u.map(I=>{let A=l.get(I);return{id:E(I),name:I,type:A.type,typeVersion:1,parameters:A.params,...A.members?{members:A.members}:{}}}),N={};for(let I of c){l.has(I.srcDeclId)||r(I.line,`edge source references undeclared step: ${I.srcDeclId}`),l.has(I.dstDeclId)||r(I.line,`dangling edge target: ${I.dstDeclId} is not declared`),l.get(I.srcDeclId).isTerminal&&r(I.line,`terminal \`${I.srcDeclId}\` cannot have an outgoing edge`);let A=E(I.srcDeclId);N[A]??={},N[A][I.port]!==void 0&&r(I.line,`duplicate edge port \`${I.port}\` on step \`${I.srcDeclId}\``),N[A][I.port]=[[{step_id:E(I.dstDeclId),type:"main",index:0}]]}for(let I of u){let A=l.get(I);Aj.has(A.type)||r(A.line,`unknown archetype \`${A.type}\` for step \`${I}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let I of d)I.target===i&&r(I.line,`subflow cycle: \`call ${I.declId}\` invokes this workflow (\`${i}\`) \u2014 direct recursion is not allowed (cross-workflow A\u2192B\u2192A cycle detection is deferred to the M3 compile.ts seam)`);let H=new Map;for(let I of c){let A=H.get(I.srcDeclId);A===void 0?H.set(I.srcDeclId,[I.dstDeclId]):A.push(I.dstDeclId)}for(let I of u){let A=l.get(I);if(A.type!=="lmctl/loop")continue;let j=A.params.body;if(typeof j=="string"&&l.has(j)){let J=H.get(I);J===void 0?H.set(I,[j]):J.push(j)}}let ne=new Set([f]),q=[f];for(;q.length>0;){let I=q.shift();for(let A of H.get(I)??[])ne.has(A)||(ne.add(A),q.push(A))}for(let I of u)ne.has(I)||r(l.get(I).line,`step \`${I}\` is unreachable from entry \`${f}\``);let O=new Map;for(let I of c){let A=O.get(I.srcDeclId);A===void 0&&(A=new Set,O.set(I.srcDeclId,A)),A.add(I.port)}let x=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let I of u){let A=l.get(I);if(A.isTerminal)continue;let j=O.get(I)??new Set;if(A.type==="lmctl/review"){let W=[...j].some(D=>!x.has(D));!j.has("approve")&&!W&&r(A.line,`uncovered outcome: review step \`${I}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${I} -approve-> <target>\`) or a stance port (run.ts:423-438 synthesizes outcomes_from_stance; review.ts:88-102 routes a stance before default approve)`);continue}let J=xj[A.type];if(J!==void 0)for(let W of J)j.has(W)||r(A.line,`uncovered outcome: required outcome \`${W}\` of step \`${I}\` (\`${A.type}\`) has no connection \u2014 route it (\`seq ${I} -${W}-> <target|terminal>\`)`);else j.size===0&&r(A.line,`uncovered outcome: non-terminal step \`${I}\` (\`${A.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let I of u){let A=l.get(I),j=kj[A.type];if(j===void 0)continue;let J={...A.params,...A.members??{},type:j.v2type,state_name:I,...Object.keys(j.outcomes).length>0?{outcomes:j.outcomes}:{}},W=j.schema.safeParse(J);if(!W.success){let D=W.error.issues[0],ee=D.path.length===0?"$":D.path.map(String).join(".");r(A.line,`step \`${I}\` (\`${A.type}\`) has invalid params for archetype \`${j.v2type}\` at \`${ee}\`: ${D.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${I} = ${A.type.replace("lmctl/","")}({ ... })\``)}}let X={schema_version:"lmctl/v3",definition_schema_version:3,name:i,version:a,...m,...p.size>0?{triggers:[...p.values()]}:{},steps:k,connections:N,entry_step_id:E(f)},U=$t.safeParse(X);if(!U.success)throw new An(U.error.issues.map(I=>({line:s[0].n,message:`emitted V3 invalid at ${I.path.length===0?"$":I.path.map(String).join(".")}: ${I.message}`})));return U.data}function Rj(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 gr(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 Lj(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]=Ny(l)}return s}function Lj(t){return t.split(",").map(e=>e.trim()).filter(e=>e.length>0)}function Ny(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 kj,Ij,Sy,An,Aj,xj,vy,ky,Ay=b(()=>{"use strict";Nn();by();In();kj={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:Yi},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:zi},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:Zi},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:Qi},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:ea}},Ij={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};Sy={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"},An=class extends Error{issues;constructor(e){super(`composition DSL compile failed:
|
|
1871
1871
|
${e.map(r=>` line ${r.line}: ${r.message}`).join(`
|
|
1872
|
-
`)}`),this.issues=e,this.name="DslCompileError"}},
|
|
1873
|
-
`)){let r=e.replace(/#.*/,"").trim();if(r.length!==0)return/^workflow\s+\S+\s+v\d+\s*$/.test(r)}return!1}function
|
|
1874
|
-
`)||e.startsWith("{")||e.startsWith("[")?Ay(t):e.endsWith(".json")?Ay($j(e,"utf8")):t}function Ay(t){return JSON.parse(t)}function Dj(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var id,Vt,An=b(()=>{"use strict";In();Ey();od();Nn();xy();id=class extends Error{causeError;constructor(e){super("compiler emitted invalid atomic workflow"),this.causeError=e,this.name="CompilerInvariantError"}},Vt=class extends Error{issues;constructor(e){super("compound workflow validation failed"),this.issues=e,this.name="CompilerValidationError"}}});function sa(t){let e=t.workflow?.concurrent_limit??1,r=t.job.concurrency_key_resolved??t.workflow?.concurrency_key??null;return r===null||r.trim().length===0?{concurrency_key:null,concurrent_limit:e}:{concurrency_key:Pj(r,{job:{id:t.job.id,kind:t.job.source,source:t.job.source,source_ref:t.job.source_ref,payload:Uj(t.job.payload)},project:t.project===null?null:{id:t.project.id,name:t.project.name}}),concurrent_limit:e}}function Pj(t,e){return t.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(r,n)=>{let s=Fj(e,n.trim());return s==null?"":typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):JSON.stringify(s)})}function Fj(t,e){let r=t;for(let n of e.split(".")){if(typeof r!="object"||r===null||!Object.prototype.hasOwnProperty.call(r,n))return;r=r[n]}return r}function Uj(t){if(t===null||t.trim().length===0)return null;try{return JSON.parse(t)}catch{return t}}var ad=b(()=>{"use strict"});var Ry={};se(Ry,{enqueueFromAgentOutput:()=>Bj,enqueueFromGitHubIssue:()=>ld,enqueueManual:()=>Wj,enqueueScheduled:()=>qj});function ld(t,e){return ia(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:oa(e.payload),concurrency_key:e.concurrency_key,priority:e.priority})}function Wj(t,e){return ia(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:oa(e.payload),concurrency_key:e.concurrency_key})}function Bj(t,e){let r=e.sequence===void 0?`run:${e.parent_run_id}`:`run:${e.parent_run_id}:${e.sequence}`;return ia(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:oa(e.payload),concurrency_key:e.concurrency_key})}function qj(t,e){return ia(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:oa(e.payload),concurrency_key:e.concurrency_key})}function oa(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function ia(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=Ue(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=sa({workflow:o,job:i,project:n});return t.enqueueJob({...e,concurrency_key:a.concurrency_key})}catch{return t.enqueueJob(e)}}var cd=b(()=>{"use strict";An();ad()});async function $y(t){let e=t.dal.listProjectWorkflows(t.project.id,{enabled_only:!0});if(e.length===0)return Ly(t.dal,t.project.id,t.issue,t.issue.url,null,t.issue,void 0);let r={event:{kind:"github_issue",issue:t.issue}},n=[],s=0;for(let o of e){if(!await Hj(o.condition,r))continue;let i=`${t.issue.url}#workflow:${o.workflow_id}`,a={issue:t.issue,...Jj(o.parameters_override)},l=Ly(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 Ly(t,e,r,n,s,o,i){let a=t.findJobBySourceAndDedupe("gh_issue",n);return{jobs:[ld(t,{project_id:e,issue_url:r.url,payload:o,workflow_id_override:s,dedupe_key:n,priority:i})],new_jobs:a===null?1:0}}async function Hj(t,e){if(t===null||t.trim().length===0)return!0;try{return await Ur(t,e)===!0}catch{return!1}}function Jj(t){if(t===null||t.trim().length===0)return{};try{let e=JSON.parse(t);if(e!==null&&typeof e=="object"&&!Array.isArray(e))return e}catch{return{}}return{}}var Oy=b(()=>{"use strict";kn();cd()});import{spawnSync as Xj}from"node:child_process";async function dd(t){let e=t.labels??["bug"],r=t.state??"open",n=["issue","list","--repo",t.project.name,"--state",r,"--json","number,title,url,body,state,labels","--limit","100"];e.length>0&&n.splice(4,0,"--label",e.join(","));let s=Xj(t.binary??"gh",n,{encoding:"utf8",timeout:t.timeoutMs??6e4,maxBuffer:10*1024*1024});if(s.error!==void 0)throw s.error;if(s.status!==0)throw new Error(`gh issue list failed: ${s.stderr??""}`.trim());let o;try{o=JSON.parse(s.stdout??"[]")}catch{throw new Error("gh issue list returned malformed JSON")}if(!Kj(o))throw new Error("gh issue list returned unexpected JSON shape");let i=0;for(let a of o){let l=await $y({dal:t.dal,project:t.project,issue:Vj(a)});i+=l.new_jobs}return{scanned:o.length,new_jobs:i}}async function Rn(t){if(process.env.LMCTL_INTAKE_DISABLED==="1")return[];let e=[];for(let r of t.listProjectsWithIntakeEnabled()){let n=Gj(r.intake_config);try{let s=await dd({dal:t,project:r,labels:n.labels,state:n.state});e.push({project_id:r.id,project_name:r.name,...s})}catch(s){let o=s instanceof Error?s.message:String(s);e.push({project_id:r.id,project_name:r.name,scanned:0,new_jobs:0,error:o});try{t.raiseAttention({kind:"daemon_intake_scan_failed",severity:"warn",project_id:r.id,payload:JSON.stringify({project_id:r.id,project_name:r.name,error:o})})}catch{}}}return e}function Gj(t){if(t===null)return{};try{let e=JSON.parse(t);if(!ud(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 Kj(t){return Array.isArray(t)&&t.every(e=>{if(!ud(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:ud(n)&&typeof n.name=="string"))})}function Vj(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 ud(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var aa=b(()=>{"use strict";Oy()});function Cy(t){return async e=>zj(t.app,e,t.log!==void 0?{log:t.log}:{})}async function zj(t,e,r={}){let n=Zj(e.path),s={"content-type":"application/json",...e.headers??{},[la]:fd},o={method:e.method,headers:s};e.body!==void 0&&e.method!=="GET"&&e.method!=="DELETE"&&(o.body=typeof e.body=="string"?e.body:JSON.stringify(e.body));let i=new Request(n,o),a=Date.now();try{let l=await t.fetch(i),c=await Qj(l);if(r.log!==void 0){let u=Date.now()-a;r.log(`[mailbox-dispatch] ${e.method} ${jy(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} ${jy(e.path)} \u2192 ERR (${c}ms)`)}throw l}}function jy(t){let e=t.startsWith("/")?t:`/${t}`,r=e.search(/[?#]/);return r===-1?e:e.slice(0,r)}function Zj(t){let e=t.startsWith("/")?t:`/${t}`;return`${Yj}${e}`}async function Qj(t){let e=await t.text(),r;if(e==="")r=void 0;else try{r=JSON.parse(e)}catch{r=e}let n={};t.headers.forEach((o,i)=>{i.toLowerCase()!==la&&(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 la,fd,Yj,md=b(()=>{"use strict";la="x-mailbox-channel",fd="1",Yj="http://mailbox.local"});import{createHash as My,createHmac as eC,timingSafeEqual as tC}from"node:crypto";function Dy(){return async(t,e)=>{let r=Py();if(r===null||iC(t.req.path)){await e();return}if(t.req.path.startsWith("/mailbox/")&&t.req.header(la)===fd){await e();return}let n=t.req.query("token");if(n!==void 0&&ca(n,r)){_d(t,r),await e();return}if(oC(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 Py(){let t=process.env.LMCTL_API_TOKEN;return t&&t.length>0?t:null}function Fy(t){let e=Py();return e!==null&&ca(t,e)}function _d(t,e,r=new Date){t.header("Set-Cookie",`${pd}=${nC(e,r)}; Path=/; HttpOnly; SameSite=Lax`)}function Uy(t){t.header("Set-Cookie",`${pd}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`)}function nC(t,e=new Date){let n=`auth=ok|${new Date(e.getTime()+rC*24*60*60*1e3).toISOString()}`;return Buffer.from(`${n}|${Wy(t,n)}`,"utf8").toString("base64url")}function sC(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:ca(s[2],Wy(e,`${s[0]}|${s[1]}`))}function ca(t,e){return tC(My("sha256").update(t).digest(),My("sha256").update(e).digest())}function oC(t,e){let r=/^Bearer\s+(.+)$/i.exec(t.req.header("authorization")??"")?.[1];if(r!==void 0&&ca(r,e))return!0;let n=aC(t.req.header("cookie")??"")[pd];return n!==void 0&&sC(n,e)}function iC(t){return t==="/login"||t==="/logout"}function aC(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 Wy(t,e){return eC("sha256",t).update(e).digest("hex")}var pd,rC,By=b(()=>{"use strict";md();pd="lmctl_next_session",rC=30});import{existsSync as Ln,mkdirSync as lC,readdirSync as cC,readFileSync as ua,unlinkSync as uC,writeFileSync as yd}from"node:fs";import{join as Wr}from"node:path";function at(t){if(!dC.test(t))throw new Error(`invalid memory name "${t}": only alphanumeric characters, underscores, and hyphens are allowed`)}function Hy(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 _C(a)?{name:t,type:a,description:i?.[1]?.trim()??null,body:s,created_at:qy,updated_at:qy}:null}function fC(t,e,r,n){let s=r!==null?`
|
|
1872
|
+
`)}`),this.issues=e,this.name="DslCompileError"}},Aj=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"]),xj={"lmctl/consolidate":["ok"],"lmctl/interactive":["done"],"lmctl/loop":["ok"],"lmctl/foreach":["all_ok"]},vy=new Set(["requires","default_task_timeout_ms","errors","concurrency_key","concurrent_limit"]),ky={"trigger-schedule":"lmctl/trigger-schedule","trigger-gh-issue":"lmctl/trigger-gh-issue"}});import{readFileSync as $j}from"node:fs";function Oj(){let t=process.env.LMCTL_DSL;return t===void 0?!0:!["0","false","off"].includes(t.trim().toLowerCase())}function jj(t){for(let e of t.split(`
|
|
1873
|
+
`)){let r=e.replace(/#.*/,"").trim();if(r.length!==0)return/^workflow\s+\S+\s+v\d+\s*$/.test(r)}return!1}function Fe(t){if(typeof t=="string"&&Oj()&&jj(t)){let r;try{r=Iy(t)}catch(s){throw s instanceof An?new Vt(s.issues.map(o=>({path:`dsl:${o.line}`,message:o.message}))):s}let n=$t.safeParse(r);if(!n.success)throw new Vt(n.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));return n.data}let e=na(Mj(t));if(Dj(e)&&e.definition_schema_version===3){let r=$t.safeParse(e);if(!r.success)throw new Vt(r.error.issues.map(n=>({path:n.path.length===0?"$":n.path.map(String).join("."),message:n.message})));return r.data}return Cj(e)}function Cj(t){let e=ta.safeParse(t);if(!e.success)throw new Vt(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 Vt([{path:`states.${s}`,message:`v2 workflows (primitive_version: 2) may not use v1 primitive type: ${o.type}`}]);try{return yy(r)}catch(s){throw s instanceof Kt?new id(s):s}}function Mj(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
|
|
1874
|
+
`)||e.startsWith("{")||e.startsWith("[")?xy(t):e.endsWith(".json")?xy($j(e,"utf8")):t}function xy(t){return JSON.parse(t)}function Dj(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var id,Vt,xn=b(()=>{"use strict";In();Ey();od();Nn();Ay();id=class extends Error{causeError;constructor(e){super("compiler emitted invalid atomic workflow"),this.causeError=e,this.name="CompilerInvariantError"}},Vt=class extends Error{issues;constructor(e){super("compound workflow validation failed"),this.issues=e,this.name="CompilerValidationError"}}});function sa(t){let e=t.workflow?.concurrent_limit??1,r=t.job.concurrency_key_resolved??t.workflow?.concurrency_key??null;return r===null||r.trim().length===0?{concurrency_key:null,concurrent_limit:e}:{concurrency_key:Pj(r,{job:{id:t.job.id,kind:t.job.source,source:t.job.source,source_ref:t.job.source_ref,payload:Uj(t.job.payload)},project:t.project===null?null:{id:t.project.id,name:t.project.name}}),concurrent_limit:e}}function Pj(t,e){return t.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(r,n)=>{let s=Fj(e,n.trim());return s==null?"":typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):JSON.stringify(s)})}function Fj(t,e){let r=t;for(let n of e.split(".")){if(typeof r!="object"||r===null||!Object.prototype.hasOwnProperty.call(r,n))return;r=r[n]}return r}function Uj(t){if(t===null||t.trim().length===0)return null;try{return JSON.parse(t)}catch{return t}}var ad=b(()=>{"use strict"});var Ry={};se(Ry,{enqueueFromAgentOutput:()=>Bj,enqueueFromGitHubIssue:()=>ld,enqueueManual:()=>Wj,enqueueScheduled:()=>qj});function ld(t,e){return ia(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:oa(e.payload),concurrency_key:e.concurrency_key,priority:e.priority})}function Wj(t,e){return ia(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:oa(e.payload),concurrency_key:e.concurrency_key})}function Bj(t,e){let r=e.sequence===void 0?`run:${e.parent_run_id}`:`run:${e.parent_run_id}:${e.sequence}`;return ia(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:oa(e.payload),concurrency_key:e.concurrency_key})}function qj(t,e){return ia(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:oa(e.payload),concurrency_key:e.concurrency_key})}function oa(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function ia(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=Fe(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=sa({workflow:o,job:i,project:n});return t.enqueueJob({...e,concurrency_key:a.concurrency_key})}catch{return t.enqueueJob(e)}}var cd=b(()=>{"use strict";xn();ad()});async function $y(t){let e=t.dal.listProjectWorkflows(t.project.id,{enabled_only:!0});if(e.length===0)return Ly(t.dal,t.project.id,t.issue,t.issue.url,null,t.issue,void 0);let r={event:{kind:"github_issue",issue:t.issue}},n=[],s=0;for(let o of e){if(!await Hj(o.condition,r))continue;let i=`${t.issue.url}#workflow:${o.workflow_id}`,a={issue:t.issue,...Jj(o.parameters_override)},l=Ly(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 Ly(t,e,r,n,s,o,i){let a=t.findJobBySourceAndDedupe("gh_issue",n);return{jobs:[ld(t,{project_id:e,issue_url:r.url,payload:o,workflow_id_override:s,dedupe_key:n,priority:i})],new_jobs:a===null?1:0}}async function Hj(t,e){if(t===null||t.trim().length===0)return!0;try{return await Ur(t,e)===!0}catch{return!1}}function Jj(t){if(t===null||t.trim().length===0)return{};try{let e=JSON.parse(t);if(e!==null&&typeof e=="object"&&!Array.isArray(e))return e}catch{return{}}return{}}var Oy=b(()=>{"use strict";kn();cd()});import{spawnSync as Xj}from"node:child_process";async function dd(t){let e=t.labels??["bug"],r=t.state??"open",n=["issue","list","--repo",t.project.name,"--state",r,"--json","number,title,url,body,state,labels","--limit","100"];e.length>0&&n.splice(4,0,"--label",e.join(","));let s=Xj(t.binary??"gh",n,{encoding:"utf8",timeout:t.timeoutMs??6e4,maxBuffer:10*1024*1024});if(s.error!==void 0)throw s.error;if(s.status!==0)throw new Error(`gh issue list failed: ${s.stderr??""}`.trim());let o;try{o=JSON.parse(s.stdout??"[]")}catch{throw new Error("gh issue list returned malformed JSON")}if(!Kj(o))throw new Error("gh issue list returned unexpected JSON shape");let i=0;for(let a of o){let l=await $y({dal:t.dal,project:t.project,issue:Vj(a)});i+=l.new_jobs}return{scanned:o.length,new_jobs:i}}async function Rn(t){if(process.env.LMCTL_INTAKE_DISABLED==="1")return[];let e=[];for(let r of t.listProjectsWithIntakeEnabled()){let n=Gj(r.intake_config);try{let s=await dd({dal:t,project:r,labels:n.labels,state:n.state});e.push({project_id:r.id,project_name:r.name,...s})}catch(s){let o=s instanceof Error?s.message:String(s);e.push({project_id:r.id,project_name:r.name,scanned:0,new_jobs:0,error:o});try{t.raiseAttention({kind:"daemon_intake_scan_failed",severity:"warn",project_id:r.id,payload:JSON.stringify({project_id:r.id,project_name:r.name,error:o})})}catch{}}}return e}function Gj(t){if(t===null)return{};try{let e=JSON.parse(t);if(!ud(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 Kj(t){return Array.isArray(t)&&t.every(e=>{if(!ud(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:ud(n)&&typeof n.name=="string"))})}function Vj(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 ud(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var aa=b(()=>{"use strict";Oy()});function Cy(t){return async e=>zj(t.app,e,t.log!==void 0?{log:t.log}:{})}async function zj(t,e,r={}){let n=Zj(e.path),s={"content-type":"application/json",...e.headers??{},[la]:fd},o={method:e.method,headers:s};e.body!==void 0&&e.method!=="GET"&&e.method!=="DELETE"&&(o.body=typeof e.body=="string"?e.body:JSON.stringify(e.body));let i=new Request(n,o),a=Date.now();try{let l=await t.fetch(i),c=await Qj(l);if(r.log!==void 0){let u=Date.now()-a;r.log(`[mailbox-dispatch] ${e.method} ${jy(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} ${jy(e.path)} \u2192 ERR (${c}ms)`)}throw l}}function jy(t){let e=t.startsWith("/")?t:`/${t}`,r=e.search(/[?#]/);return r===-1?e:e.slice(0,r)}function Zj(t){let e=t.startsWith("/")?t:`/${t}`;return`${Yj}${e}`}async function Qj(t){let e=await t.text(),r;if(e==="")r=void 0;else try{r=JSON.parse(e)}catch{r=e}let n={};t.headers.forEach((o,i)=>{i.toLowerCase()!==la&&(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 la,fd,Yj,md=b(()=>{"use strict";la="x-mailbox-channel",fd="1",Yj="http://mailbox.local"});import{createHash as My,createHmac as eC,timingSafeEqual as tC}from"node:crypto";function Dy(){return async(t,e)=>{let r=Py();if(r===null||iC(t.req.path)){await e();return}if(t.req.path.startsWith("/mailbox/")&&t.req.header(la)===fd){await e();return}let n=t.req.query("token");if(n!==void 0&&ca(n,r)){_d(t,r),await e();return}if(oC(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 Py(){let t=process.env.LMCTL_API_TOKEN;return t&&t.length>0?t:null}function Fy(t){let e=Py();return e!==null&&ca(t,e)}function _d(t,e,r=new Date){t.header("Set-Cookie",`${pd}=${nC(e,r)}; Path=/; HttpOnly; SameSite=Lax`)}function Uy(t){t.header("Set-Cookie",`${pd}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`)}function nC(t,e=new Date){let n=`auth=ok|${new Date(e.getTime()+rC*24*60*60*1e3).toISOString()}`;return Buffer.from(`${n}|${Wy(t,n)}`,"utf8").toString("base64url")}function sC(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:ca(s[2],Wy(e,`${s[0]}|${s[1]}`))}function ca(t,e){return tC(My("sha256").update(t).digest(),My("sha256").update(e).digest())}function oC(t,e){let r=/^Bearer\s+(.+)$/i.exec(t.req.header("authorization")??"")?.[1];if(r!==void 0&&ca(r,e))return!0;let n=aC(t.req.header("cookie")??"")[pd];return n!==void 0&&sC(n,e)}function iC(t){return t==="/login"||t==="/logout"}function aC(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 Wy(t,e){return eC("sha256",t).update(e).digest("hex")}var pd,rC,By=b(()=>{"use strict";md();pd="lmctl_next_session",rC=30});import{existsSync as Ln,mkdirSync as lC,readdirSync as cC,readFileSync as ua,unlinkSync as uC,writeFileSync as yd}from"node:fs";import{join as Wr}from"node:path";function at(t){if(!dC.test(t))throw new Error(`invalid memory name "${t}": only alphanumeric characters, underscores, and hyphens are allowed`)}function Hy(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 _C(a)?{name:t,type:a,description:i?.[1]?.trim()??null,body:s,created_at:qy,updated_at:qy}:null}function fC(t,e,r,n){let s=r!==null?`
|
|
1875
1875
|
description: ${r}`:"";return`---
|
|
1876
1876
|
name: ${t}${s}
|
|
1877
1877
|
type: ${e}
|
|
@@ -1885,7 +1885,7 @@ description: ${n}`:"",i=`---
|
|
|
1885
1885
|
name: ${e}${o}
|
|
1886
1886
|
type: ${r}
|
|
1887
1887
|
---
|
|
1888
|
-
${s}`;SC(t,i,"utf8")}function IC(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 NC(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?
|
|
1888
|
+
${s}`;SC(t,i,"utf8")}function IC(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 NC(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?AC(t.path):xC(t.kind);return`step-${t.step_id}-${e}/${t.id}-${r}${n}`}function AC(t){let e=t.lastIndexOf(".");if(e<0)return"";let r=t.slice(e);return/^\.[A-Za-z0-9]+$/.test(r)?r:""}function xC(t){return t.endsWith("_md")||t.includes("markdown")?".md":t.endsWith("_json")||t.includes("json")?".json":".txt"}var da,fa,zy,tw=b(()=>{"use strict";Jt();Yy();Ed();da=["user","feedback","project","reference"],fa=new Set(["smoke","integration","vision","scenario","regression"]),zy="operator"});function $e(t,e){return`<!doctype html>
|
|
1889
1889
|
<html lang="en">
|
|
1890
1890
|
<head>
|
|
1891
1891
|
<meta charset="utf-8">
|
|
@@ -1950,45 +1950,45 @@ ${s}`;SC(t,i,"utf8")}function IC(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r
|
|
|
1950
1950
|
JOIN step s ON s.id = sa.step_id
|
|
1951
1951
|
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
|
|
1952
1952
|
JOIN step s ON s.id = sa.step_id
|
|
1953
|
-
WHERE s.run_id = ? ORDER BY sa.id ASC`,t),l=new Map;for(let
|
|
1953
|
+
WHERE s.run_id = ? ORDER BY sa.id ASC`,t),l=new Map;for(let x of a){let X=l.get(x.step_id)??[];X.push({kind:x.kind,id:x.id}),l.set(x.step_id,X)}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 X=JSON.parse(x.payload);typeof X.elapsedMs=="number"&&X.elapsedMs>0&&(f+=X.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"),_=[...new Set(p.map(x=>x.state_name))],g=new Date(n.started_at).getTime(),h=n.ended_at!==null?new Date(n.ended_at).getTime():Date.now(),w=e.query("SELECT project_id FROM job WHERE id = ?",n.job_id)[0]?.project_id??null,E=w!==null?e.query(`SELECT id, signal_kind, severity, description, detected_at FROM drift_signal
|
|
1954
1954
|
WHERE project_id = ? AND detected_at >= ? AND detected_at <= ? ORDER BY detected_at ASC`,w,g,h):[],N=e.query(`SELECT SUM(input_tokens) AS input, SUM(output_tokens) AS output
|
|
1955
1955
|
FROM session_size WHERE observed_at >= ? AND observed_at <= ?`,n.started_at,n.ended_at??new Date().toISOString())[0],H=N?.input!==null&&N?.input!==void 0?`input: ${N.input}, output: ${N.output??0}`:"n/a",ne=e.getWorkflow(n.workflow_id),q=n.started_at!==null&&n.ended_at!==null?Math.max(0,new Date(n.ended_at).getTime()-new Date(n.started_at).getTime()):null,O={run_id:t,workflow_name:ne?.name??null,started_at:n.started_at,ended_at:n.ended_at,terminal_state:n.terminal_state,duration_ms:q,steps:c,tool_stats:m,reviewer_interventions:{count:p.length,state_names:_},drift_signals:E,token_totals:H};e.insertStepArtifact({step_id:o,kind:"run_report",content:JSON.stringify(O)})}var nw=b(()=>{"use strict"});import{spawnSync as ow}from"node:child_process";function bd(t){return RC[t]??`no install hint; ensure '${t}' is on PATH`}function LC(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 sw(t){return ow("which",[t],{encoding:"utf8"}).status===0}function iw(t){if(t===void 0)return null;for(let e of t.tools??[])if(!sw(e)){let r=bd(e);return{kind:"missing_tool",tool:e,install_hint:r,message:`missing dependency: ${e}; ${r}`}}for(let e of t.auth??[]){if(!sw(e)){let s=bd(e);return{kind:"missing_tool",tool:e,install_hint:s,message:`missing dependency: ${e}; ${s}`}}let r=LC(e);if(r===null)continue;let n=ow(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:bd(e),message:`${e} not authenticated; run \`${e} login\` or equivalent`,detail:s.length>0?s:void 0}}}return null}var RC,aw=b(()=>{"use strict";RC={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 $C,readdirSync as OC,readFileSync as jC}from"node:fs";import{join as lw}from"node:path";function CC(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(`
|
|
1956
1956
|
`).map(o=>o.replace(/^\s*-\s+/,"").trim()).filter(Boolean):[]}function cw(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 uw(t,e){if(e.length===0)return null;let r=lw(t,"durable-memory");if(!$C(r))return null;let n;try{n=OC(r).filter(o=>o.endsWith(".md")&&o!=="index.md")}catch{return null}let s=[];for(let o of n)try{let i=jC(lw(r,o),"utf8");if(CC(i).some(l=>e.includes(l))){let l=cw(i,"name")??o.replace(".md",""),c=cw(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 dw=b(()=>{"use strict"});function kd(t){let e=t.trim().replace(MC,"").trim();for(let r=0;r<4;r+=1){let n=DC.exec(e);if(n===null)break;e=n[2].trim()}return e}function fw(t){let e=t.trim(),r=PC.exec(e);if(r!==null)return r[2];let n=FC.exec(e);return n!==null?n[0]:null}function Us(t,e){let r=t.split(`
|
|
1957
1957
|
`),n=null,s=-1;for(let i=0;i<r.length;i+=1){let a=kd(r[i]),l=Sd.exec(a);if(l===null)continue;let c=l[1].trim();if(vd.test(c))continue;let u=fw(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=kd(r[i]),l=Sd.exec(a);if(l===null)break;let c=vd.exec(l[1].trim());if(c===null)break;o[c[1]]=c[2].trim()}return{outcome:n,evidence:o}}function mw(t){let e=t.split(`
|
|
1958
|
-
`),r=null;for(let n=0;n<e.length;n+=1){let s=kd(e[n]),o=Sd.exec(s);if(o===null)continue;let i=o[1].trim();if(vd.test(i))continue;let a=fw(i);if(a===null||!Zr(a))continue;let c=i.slice(i.indexOf(a)+a.length).replace(/^[`*_:\s\-–—]+/,"").trim();r={token:a,reason:c}}return r}var MC,DC,Sd,vd,PC,FC,Id=b(()=>{"use strict";is();MC=/^#{1,6}\s+/,DC=/^(```|\*\*|__|`|\*|_)([\s\S]+?)\1$/,Sd=/^STANCE:\s+(.+)$/,vd=/^([A-Z][A-Z0-9_]*):\s*(.+)$/,PC=/^(```|\*\*|__|`|\*|_)([A-Za-z0-9_-]+)\1/,FC=/^[A-Za-z0-9_-]+/});function pw(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 _w=b(()=>{"use strict"});import{readFileSync as UC}from"node:fs";import{dirname as WC,join as BC}from"node:path";import{fileURLToPath as qC}from"node:url";function XC(t){return t.rules.map(e=>({command:e.command,subcommands:e.argv_patterns.map(r=>r.trim().split(/\s+/)),kind:e.kind}))}function YC(t){let e=[],r=[];for(let n of t)HC.has(n)?(r.length>0&&e.push(r),r=[]):r.push(n);return r.length>0&&e.push(r),e}function zC(t,e){if(t.length===0)return{matched:!1};let r=0;for(;r<t.length&&JC.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 ZC(t,e){if(t.length===0)return{matched:!1};let r=YC(t);for(let n of r){let s=zC(n,e);if(s.matched)return s}return{matched:!1}}function Nd(t){return ZC(t,VC)}function QC(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
|
|
1959
|
-
\u2026[truncated ${t.length-8e3} chars]`:t}function Y(t,e,r,n){t.outcomes[e]=n,r!==e&&(t.outcomes[r]=n)}function Q(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 vw(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=yr(t.job.payload)?.[n];if(Array.isArray(o)&&o.every(i=>typeof i=="string"))return o}return null}async function Ze(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=yr(e.job.payload);return i===null?"":JSON.stringify(i)}if(o.startsWith("job_payload.")){let i=o.slice(12),l=yr(e.job.payload)?.[i];return l==null?"":String(l)}if(o.startsWith("outcomes.")){let i=nM(e.outcomes,o.slice(9));return i==null?"":typeof i=="string"?i:JSON.stringify(i)}return""});return ww(n,e)}function nM(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 yr(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 qs(t){let{context:e,stateId:r,member:n,prompt:s,stepId:o,timeoutMs:i,writesToProjectPath:a}=t,l=pw(e.dal,e.run_id,()=>o),c=Rd(e,r),u={violation:null},d=T=>{if(l(T),u.violation===null&&T.kind==="tool_use"&&T.tool==="Bash"&&T.summary){let w=
|
|
1958
|
+
`),r=null;for(let n=0;n<e.length;n+=1){let s=kd(e[n]),o=Sd.exec(s);if(o===null)continue;let i=o[1].trim();if(vd.test(i))continue;let a=fw(i);if(a===null||!Zr(a))continue;let c=i.slice(i.indexOf(a)+a.length).replace(/^[`*_:\s\-–—]+/,"").trim();r={token:a,reason:c}}return r}var MC,DC,Sd,vd,PC,FC,Id=b(()=>{"use strict";is();MC=/^#{1,6}\s+/,DC=/^(```|\*\*|__|`|\*|_)([\s\S]+?)\1$/,Sd=/^STANCE:\s+(.+)$/,vd=/^([A-Z][A-Z0-9_]*):\s*(.+)$/,PC=/^(```|\*\*|__|`|\*|_)([A-Za-z0-9_-]+)\1/,FC=/^[A-Za-z0-9_-]+/});function pw(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 _w=b(()=>{"use strict"});import{readFileSync as UC}from"node:fs";import{dirname as WC,join as BC}from"node:path";import{fileURLToPath as qC}from"node:url";function XC(t){return t.rules.map(e=>({command:e.command,subcommands:e.argv_patterns.map(r=>r.trim().split(/\s+/)),kind:e.kind}))}function YC(t){let e=[],r=[];for(let n of t)HC.has(n)?(r.length>0&&e.push(r),r=[]):r.push(n);return r.length>0&&e.push(r),e}function zC(t,e){if(t.length===0)return{matched:!1};let r=0;for(;r<t.length&&JC.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 ZC(t,e){if(t.length===0)return{matched:!1};let r=YC(t);for(let n of r){let s=zC(n,e);if(s.matched)return s}return{matched:!1}}function Nd(t){return ZC(t,VC)}function QC(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 Ad(t){return QC(t).split(" ").filter(e=>e.length>0)}var HC,JC,GC,KC,VC,hw=b(()=>{"use strict";HC=new Set(["&&","||",";","|",">",">>","<","<<"]),JC=/^[A-Za-z_][A-Za-z0-9_]*=/;GC=WC(qC(import.meta.url)),KC=JSON.parse(UC(BC(GC,"side_effect_classifier.json"),"utf-8")),VC=XC(KC)});function pa(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 gw(t,e){try{return await Ur(xd(t)??t,pa(e))===!0}catch{return!1}}async function _a(t,e){try{return await Ur(xd(t)??t,pa(e))}catch{return}}async function yw(t,e){if(typeof t!="string")return t;let r=xd(t);if(r===null)return t;try{return await Ur(r,pa(e))}catch{return}}async function ww(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+=eM(await Ur(a,pa(e)))}catch{n+=""}s=i+o[0].length}return n+=t.slice(s),n}function xd(t){let e=t.trim();return!e.startsWith("={{")||!e.endsWith("}}")?null:e.slice(3,-2).trim()}function eM(t){return t==null?"":typeof t=="string"?t:JSON.stringify(t)}var Ws=b(()=>{"use strict";kn()});import{existsSync as Ew,readdirSync as Tw,readFileSync as tM,statSync as bw}from"node:fs";import{join as ga}from"node:path";function Sw(t,e,r,n){return Object.assign(t,{stateId:e,state:r,displayName:n})}function G(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 lt(t,e,r,n,s={}){let o=M(),i=G(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,`${Bs}${e.id}`,o);let a=t.dal.getRun(t.run_id),l=Zr(r)?"generic":"unhandled";return t.dal.raiseAttention({kind:Ao,severity:"attn",project_id:t.project.id,run_id:t.run_id,requires_user:!0,payload:JSON.stringify({run_id:t.run_id,step_id: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:rM(s.agent_output??n),paused_at:o,created_at:o})}),t.dal.pauseJob(t.job.id),{kind:"paused"}}function rM(t){return t.length>8e3?`${t.slice(0,8e3)}
|
|
1959
|
+
\u2026[truncated ${t.length-8e3} chars]`:t}function Y(t,e,r,n){t.outcomes[e]=n,r!==e&&(t.outcomes[r]=n)}function Q(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 vw(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=yr(t.job.payload)?.[n];if(Array.isArray(o)&&o.every(i=>typeof i=="string"))return o}return null}async function Ze(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=yr(e.job.payload);return i===null?"":JSON.stringify(i)}if(o.startsWith("job_payload.")){let i=o.slice(12),l=yr(e.job.payload)?.[i];return l==null?"":String(l)}if(o.startsWith("outcomes.")){let i=nM(e.outcomes,o.slice(9));return i==null?"":typeof i=="string"?i:JSON.stringify(i)}return""});return ww(n,e)}function nM(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 yr(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 qs(t){let{context:e,stateId:r,member:n,prompt:s,stepId:o,timeoutMs:i,writesToProjectPath:a}=t,l=pw(e.dal,e.run_id,()=>o),c=Rd(e,r),u={violation:null},d=T=>{if(l(T),u.violation===null&&T.kind==="tool_use"&&T.tool==="Bash"&&T.summary){let w=Ad(T.summary),E=Nd(w);E.matched&&!c&&(u.violation={summary:T.summary,kind:E.kind})}},f=new Date(Date.now()-1),m=0,p=0,_=T=>{d(T),sM(T,(w,E)=>{m+=w,p+=E})},g=await dn({sessionid:n.sessionid,sessiondir:n.sessiondir,prompt:s,timeoutMs:i,dal:e.dal,team_member_id:n.id,onProgress:_});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:xe(n),model:n.model??"unknown",tokens_in:m,tokens_out:p,wall_time_ms:g.ms})}),oM(e.project,e.dal,f);let h=u.violation;return h!==null?{kind:"g3_violation",summary:h.summary,violationKind:h.kind}:!a&&e.project.local_path.trim().length>0&&Ld(e.project.local_path,f)?{kind:"g2_violation"}:{kind:"ok",text:g.text,ms:g.ms,argv:g.argv}}function sM(t,e){let r=t.raw;if(r==null)return;let s=r.message?.usage;if(s!==void 0){let i=ha(s.input_tokens),a=ha(s.output_tokens);(i>0||a>0)&&e(i,a);return}let o=r.usage;if(o!==void 0){let i=ha(o.input_tokens),a=ha(o.output_tokens);(i>0||a>0)&&e(i,a)}}function ha(t){return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:0}async function Yt(t,e,r,n){if(r.sessionid===null)return;let s=`${e}:write_back`,o=G(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 qs({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 $n(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=G(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(Lp(s)),l!=null&&l.length>0&&d.push(l);let f=r.prompt_template!==void 0?await Ze(r.prompt_template,t,e):"";f.length>0&&d.push(f),n!==null&&n.length>0&&d.push(n);let m=d.join(`
|
|
1960
1960
|
|
|
1961
|
-
`);try{let p=await qs({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 _=Us(p.text,s);return t.dal.finishStep(u.id,_.outcome,_.outcome!==null?`chat_ms=${p.ms}`:_.reason),_.outcome!==null&&(t.outcomes[e]=_.outcome),{outcome:_.outcome,text:p.text,status_detail:_.outcome!==null?`chat_ms=${p.ms}`:_.reason}}catch(p){let _=p instanceof Ne?`chat_${p.kind}`:"chat_other";return t.dal.finishStep(u.id,null,_),{outcome:null,text:"",status_detail:_}}}function On(t,e){return(e?.length??0)>0?uw(t.project.local_path,e):null}function kw(t){return Nd(
|
|
1961
|
+
`);try{let p=await qs({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 _=Us(p.text,s);return t.dal.finishStep(u.id,_.outcome,_.outcome!==null?`chat_ms=${p.ms}`:_.reason),_.outcome!==null&&(t.outcomes[e]=_.outcome),{outcome:_.outcome,text:p.text,status_detail:_.outcome!==null?`chat_ms=${p.ms}`:_.reason}}catch(p){let _=p instanceof Ne?`chat_${p.kind}`:"chat_other";return t.dal.finishStep(u.id,null,_),{outcome:null,text:"",status_detail:_}}}function On(t,e){return(e?.length??0)>0?uw(t.project.local_path,e):null}function kw(t){return Nd(Ad(t))}function Rd(t,e){let r=t.dal.query(`SELECT state_name, outcome FROM step
|
|
1962
1962
|
WHERE run_id = ? AND state_name != ? AND ended_at IS NOT NULL
|
|
1963
1963
|
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 Ld(t,e){if(!Ew(t))return!1;let r=ga(t,"durable-memory");function n(s){let o;try{o=Tw(s,{withFileTypes:!0})}catch{return!1}for(let i of o){if(i.name===".git")continue;let a=ga(s,i.name);if(a!==r)if(i.isDirectory()){if(n(a))return!0}else try{if(bw(a).mtime>e)return!0}catch{}}return!1}return n(t)}function oM(t,e,r){let n=ga(t.local_path,"durable-memory");if(!Ew(n))return;let s;try{s=Tw(n)}catch{return}for(let o of s){if(!o.endsWith(".md")||o==="MEMORY.md")continue;let i=ga(n,o),a;try{a=bw(i).mtime}catch{continue}if(a<=r)continue;let l;try{l=tM(i,"utf8")}catch{continue}let c=aM(l);if(c===null){process.stderr.write(`[durable-memory-sync] warning: ${o} has no valid frontmatter, skipping
|
|
1964
|
-
`);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 aM(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||!iM.has(l)?null:{name:a,type:l,description:i?.[1]?.trim()??null,body:n}}var Bs,iM,Ge=b(()=>{"use strict";
|
|
1964
|
+
`);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 aM(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||!iM.has(l)?null:{name:a,type:l,description:i?.[1]?.trim()??null,body:n}}var Bs,iM,Ge=b(()=>{"use strict";Be();In();bs();dw();Id();is();_w();hw();Ws();Bs="__paused__:";iM=new Set(["user","feedback","project","reference"])});import{spawnSync as Iw}from"node:child_process";function lM(t,e){let r=t.stateId,n=t.displayName,s=G(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let o=t.project.local_path,i=Iw("git",["diff","--quiet"],{cwd:o}).status!==0,a=Iw("git",["diff","--cached","--quiet"],{cwd:o}).status!==0;if(i||a){let l=e.fail_message??"repository has uncommitted changes";return t.dal.finishStep(s.id,null,l),Y(t,r,n,Qu),{kind:"terminal",terminal:Q(t.workflow)}}return t.dal.finishStep(s.id,"clean","repo_clean"),Y(t,r,n,"clean"),V(t.workflow,e.next)}var Nw,Aw=b(()=>{"use strict";Ge();Nw={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=>lM(t,t.state)}});async function cM(t,e){let r=t.stateId,n=t.displayName,s=G(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;for(let o of e.branches)if(await gw(o.when,t))return t.dal.finishStep(s.id,"matched",o.when),Y(t,r,n,"matched"),V(t.workflow,o.next);return t.dal.finishStep(s.id,"no_match","choice_no_match"),Y(t,r,n,"no_match"),e.default_next!==void 0?V(t.workflow,e.default_next):{kind:"terminal",terminal:t.workflow.terminals.no_match?"no_match":Q(t.workflow)}}var xw,Rw=b(()=>{"use strict";Ge();Ws();xw={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=>cM(t,t.state)}});async function uM(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms,o=e.researchers??[],i=On(t,e.durable_memory_tags),a=new Array(o.length).fill(null);await Promise.all(o.map(async(m,p)=>{let _=`${n}:researcher_${m.alias}[${p}]`,g=await $n(t,_,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??""}
|
|
1965
1965
|
${m}`:null).filter(m=>m!==null).join(`
|
|
1966
1966
|
|
|
1967
1967
|
`),c=`${n}:consolidator`,u=await $n(t,c,e.consolidator,l.length>0?l:null,["ok","error"],!0,s,!1,i),d=G(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,u.outcome===null||u.outcome==="error"){t.dal.finishStep(d.id,u.outcome,u.status_detail),u.outcome==="error"&&Y(t,r,n,"error");let m=e.outcomes.error;return m!==void 0?V(t.workflow,m):{kind:"terminal",terminal:Q(t.workflow)}}let f=e.research_artifact_prefix??n;if(t.dal.insertStepArtifact({step_id:d.id,kind:`${f}_consolidated`,content:u.text}),t.dal.finishStep(d.id,"ok","consolidated"),Y(t,r,n,"ok"),e.write_back_durable_memory){let m=t.membersByAlias.get(e.consolidator.alias);m!==void 0&&await Yt(t,n,m,e.write_back_durable_memory)}return V(t.workflow,e.outcomes.ok)}var Lw,$w=b(()=>{"use strict";Ge();Lw={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=>uM(t,t.state)}});async function dM(t,e){let r=t.stateId,n=t.displayName,s=G(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 _a(e.items_from,t),a=_M(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:Q(t.workflow)}}let l={routed:null},c=e.mode==="parallel"?await mM(t,e,s.id,a,l):await fM(t,e,s.id,a,l);if(l.routed!==null)return t.dal.finishStep(s.id,null,`foreach_propagated:${l.routed.kind}`),l.routed;let u=c.some(f=>f.outcome===null||f.outcome==="__failure__"),d=u?"any_failed":"all_ok";if(t.dal.finishStep(s.id,d,JSON.stringify({iterations:c,count:a.length})),Y(t,r,n,d),u){let f=e.outcomes.any_failed;return f!==void 0?V(t.workflow,f):{kind:"terminal",terminal:Q(t.workflow)}}return V(t.workflow,e.outcomes.all_ok)}finally{t.progress_step_id=o}}async function fM(t,e,r,n,s){let o=[];for(let i=0;i<n.length;i+=1){let a=await jw(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 mM(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 jw(t,e,r,n[l],l,s)}});return await Promise.all(a),o}async function jw(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__":pM(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 pM(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function _M(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 Ow,Cw=b(()=>{"use strict";Ge();Ws();Ow={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=>dM(t,t.state)}});async function hM(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=G(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:Q(t.workflow)}}let i=On(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 Yt(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}`),Y(t,r,n,"timeout");let m=e.outcomes.timeout;return m!==void 0?V(t.workflow,m):{kind:"terminal",terminal:Q(t.workflow)}}let f=a.last_operator_input??"";try{let m=await qs({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:Q(t.workflow)}}return t.dal.setInteractiveAgentOutput(a.id,m.text,"waiting_operator"),e.termination.agent_signal!==void 0&&m.text.includes(e.termination.agent_signal)?(e.artifact_name!==void 0&&t.dal.insertStepArtifact({step_id:a.step_id,kind:e.artifact_name,content:m.text}),t.dal.finishStep(a.step_id,"done","agent_signal"),Y(t,r,n,"done"),e.write_back_durable_memory&&await Yt(t,n,o,e.write_back_durable_memory),V(t.workflow,e.outcomes.done)):(Mw({context:t,state:e,stateId:r,displayName:n,stepId:a.step_id,agentText:m.text}),{kind:"paused"})}catch(m){let p=m instanceof Ne?`chat_${m.kind}`:"chat_other";return t.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:Q(t.workflow)}}}return{kind:"paused"}}let l=G(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 Ze(e.agent.initial_prompt_template,t,n),d=i?`${i}
|
|
1968
1968
|
|
|
1969
|
-
${u}`:u;try{let f=await qs({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:Q(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 Yt(t,n,o,e.write_back_durable_memory),V(t.workflow,e.outcomes.done)):(Mw({context:t,state:e,stateId:r,displayName:n,stepId:l.id,agentText:f.text}),{kind:"paused"})}catch(f){let m=f instanceof Ne?`chat_${f.kind}`:"chat_other";return t.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:Q(t.workflow)}}}function Mw(t){let{context:e,state:r,stateId:n,displayName:s,stepId:o,agentText:i}=t,a=
|
|
1969
|
+
${u}`:u;try{let f=await qs({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:Q(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 Yt(t,n,o,e.write_back_durable_memory),V(t.workflow,e.outcomes.done)):(Mw({context:t,state:e,stateId:r,displayName:n,stepId:l.id,agentText:f.text}),{kind:"paused"})}catch(f){let m=f instanceof Ne?`chat_${f.kind}`:"chat_other";return t.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:Q(t.workflow)}}}function Mw(t){let{context:e,state:r,stateId:n,displayName:s,stepId:o,agentText:i}=t,a=M();e.dal.setRunPausedState(e.run_id,`${Bs}${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(gM({context:e,stateId:s,state:r,stepId:o,agentText:i,pausedAt:a}))}),e.dal.pauseJob(e.job.id)}function gM(t){let{context:e,stateId:r,state:n,stepId:s,agentText:o,pausedAt:i}=t,a=e.dal.getRun(e.run_id),l=yM(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:wM(o,3),paused_at:i,created_run_inputs:yr(e.job.payload)}}function yM(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 wM(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 Dw,Pw=b(()=>{"use strict";bs();Ge();Dw={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=>hM(t,t.state)}});async function EM(t,e){let r=t.stateId,n=t.displayName,s=vw(t,e.over);if(s===null){let d=G(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:Q(t.workflow)}}let o=t.workflow.states[e.body];if(o===void 0){let d=G(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:Q(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 _;try{_=await t.dispatchState(m,o,{iteration:{item:f,index:d}})}finally{t.iteration=p}if(_.kind==="paused"||_.kind==="escalate")return _;let g=TM(t.outcomes[m]);if(a.push({index:d,value:f,outcome:g}),g===null&&e.stop_on_error){l=!0;break}}let c=G(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let u=l?"error":"ok";if(t.dal.finishStep(c.id,u,JSON.stringify({iterations:a,count:i.length})),Y(t,r,n,u),l){let d=e.outcomes.error;return d!==void 0?V(t.workflow,d):{kind:"terminal",terminal:Q(t.workflow)}}return V(t.workflow,e.outcomes.ok)}function TM(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}var Fw,Uw=b(()=>{"use strict";Ge();Fw={description:{displayName:"Loop",name:"loop",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],builtin:!0},execute:async t=>EM(t,t.state)}});import{createHash as bM}from"node:crypto";import{existsSync as SM,mkdirSync as vM,readFileSync as kM,writeFileSync as IM}from"node:fs";import{dirname as NM,isAbsolute as Bw,normalize as AM,resolve as Hs}from"node:path";import{Document as xM,ExternalHyperlink as RM,HeadingLevel as jn,LevelFormat as LM,Packer as $M,Paragraph as yt,Table as OM,TableCell as jM,TableRow as CM,TextRun as wt,WidthType as MM}from"docx";import{marked as DM}from"marked";async function PM(t,e){let r=t.stateId,n=t.displayName,s=G(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;try{let o=await FM(t,e,n),i=await UM(t,e),a=await WM(t,e.title),l=await XM(o,a??t.workflow.name);if(l.length===0)throw new Error("rendered DOCX buffer was empty");return vM(NM(i),{recursive:!0}),IM(i,l),t.dal.insertStepArtifact({step_id:s.id,kind:"render_docx",path:i,sha:bM("sha256").update(l).digest("hex"),provider_call_mode:"library"}),t.dal.finishStep(s.id,"done",`wrote:${i}`),Y(t,r,n,{output_path:i,path:i,bytes:l.length}),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),Y(t,r,n,{error:i}),V(t.workflow,e.outcomes?.error??"@terminal:error")}}async function FM(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 Ze(e.markdown_source,t,r)).trim(),o=(n.length===0?JM(t,e.markdown_source):null)??n;if(o.length===0)throw new Error("markdown_source resolved empty");let i=qM(t.project.local_path,o);if(i!==null){if(!SM(i))throw new Error(`markdown_source file not found: ${i}`);return ya(kM(i,"utf8"))}return ya(o)}async function UM(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let r=(await Ze(e.output_path,t,t.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=BM(t.project.local_path,r);if(!n.endsWith(".docx"))throw new Error(`output_path must end with .docx: ${n}`);return n}async function WM(t,e){if(typeof e!="string"||e.trim().length===0)return null;let r=(await Ze(e,t,t.stateId)).trim();return r.length===0?null:r}function BM(t,e){let r=Hs(t);return AM(Bw(e)?Hs(e):Hs(r,e))}function qM(t,e){return HM(e)?Bw(e)?Hs(e):Hs(t,e):null}function HM(t){return t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function JM(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 ya(s);let o=t.dal.query(`SELECT sa.content
|
|
1970
1970
|
FROM step_artifact sa
|
|
1971
1971
|
JOIN step s ON s.id = sa.step_id
|
|
1972
1972
|
WHERE s.run_id = ?
|
|
1973
1973
|
AND s.state_name LIKE ?
|
|
1974
1974
|
AND sa.content IS NOT NULL
|
|
1975
1975
|
ORDER BY sa.id DESC
|
|
1976
|
-
LIMIT 1`,t.run_id,`${n}:coder[%`);return o[0]?.content===void 0?null:ya(o[0].content)}function ya(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}async function XM(t,e){let r=Hw(DM.lexer(t,{gfm:!0})),n=new
|
|
1977
|
-
`).map(r=>new yt({children:[new wt({text:r.length===0?" ":r,font:"Courier New"})]}))}function wr(t){let e=t.tokens;return Array.isArray(e)?e:[]}function YM(t){return t.type==="list"&&Array.isArray(t.items)}function zM(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function ZM(t){return t.type==="code"&&typeof t.text=="string"}function QM(t){switch(t){case 1:return jn.HEADING_1;case 2:return jn.HEADING_2;case 3:return jn.HEADING_3;case 4:return jn.HEADING_4;case 5:return jn.HEADING_5;default:return jn.HEADING_6}}var qw,Jw=b(()=>{"use strict";Ge();qw={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=>PM(t,t.state)}});import{createHash as eD}from"node:crypto";import{existsSync as tD,mkdirSync as rD,readFileSync as Xw,statSync as nD}from"node:fs";import{dirname as sD,isAbsolute as Gw,normalize as oD,resolve as Js}from"node:path";import{marked as iD}from"marked";import aD from"write-excel-file/node";async function lD(t,e){let r=t.stateId,n=t.displayName,s=G(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;try{let o=await cD(t,e),i=uD(e.input_format),a=await dD(t,e),l=await fD(t,e.title),c=i==="markdown"?TD(o):hD(o);await bD({sheets:c.length===0?[{name:"Sheet1",headers:[],rows:[]}]:c,outputPath:a,title:l??t.workflow.name});let u=nD(a).size;if(u===0)throw new Error("rendered XLSX file was empty");let d=eD("sha256").update(Xw(a)).digest("hex");return t.dal.insertStepArtifact({step_id:s.id,kind:"render_xlsx",path:a,sha:d,provider_call_mode:"library"}),t.dal.finishStep(s.id,"done",`wrote:${a}`),Y(t,r,n,{output_path:a,path:a,bytes:u}),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),Y(t,r,n,{error:i}),V(t.workflow,e.outcomes?.error??"@terminal:error")}}async function cD(t,e){if(typeof e.source!="string"||e.source.trim().length===0)return"";let r=(await Ze(e.source,t,t.stateId)).trim(),n=pD(t.project.local_path,r);if(n!==null){if(!tD(n))throw new Error(`source file not found: ${n}`);return Xw(n,"utf8")}return r}function uD(t){if(t==null||t==="")return"json";if(t==="json"||t==="markdown")return t;throw new Error(`unsupported input_format: ${String(t)}`)}async function dD(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let r=(await Ze(e.output_path,t,t.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=mD(t.project.local_path,r);if(!n.endsWith(".xlsx"))throw new Error(`output_path must end with .xlsx: ${n}`);return n}async function fD(t,e){if(typeof e!="string"||e.trim().length===0)return null;let r=(await Ze(e,t,t.stateId)).trim();return r.length===0?null:r}function mD(t,e){let r=Js(t);return oD(Gw(e)?Js(e):Js(r,e))}function pD(t,e){return _D(e)?Gw(e)?Js(e):Js(t,e):null}function _D(t){return t.endsWith(".json")||t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function hD(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(!wa(e)||!Array.isArray(e.sheets))throw new Error("JSON source must be an object with sheets[]");return e.sheets.map((r,n)=>gD(r,n))}function gD(t,e){if(!wa(t))throw new Error(`sheets[${e}] must be an object`);let r=yD(t.headers,`sheets[${e}].headers`),n=wD(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:ED(t.styles)}}function yD(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 wD(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 ED(t){if(!wa(t)||!wa(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 TD(t){let e=iD.lexer(t,{gfm:!0}),r=[],n=null;for(let s of e){if(
|
|
1976
|
+
LIMIT 1`,t.run_id,`${n}:coder[%`);return o[0]?.content===void 0?null:ya(o[0].content)}function ya(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}async function XM(t,e){let r=Hw(DM.lexer(t,{gfm:!0})),n=new xM({title:e,numbering:{config:[{reference:"ordered-list",levels:[{level:0,format:LM.DECIMAL,text:"%1."}]}]},sections:[{children:r.length===0?[new yt("")]:r}]});return $M.toBuffer(n)}function Hw(t){let e=[];for(let r of t)switch(r.type){case"space":break;case"heading":e.push(new yt({heading:QM(r.depth),children:Er(wr(r))}));break;case"paragraph":e.push(new yt({children:Er(wr(r))}));break;case"text":e.push(new yt({children:wr(r).length===0?[new wt(r.text)]:Er(wr(r))}));break;case"blockquote":e.push(...Hw(wr(r)).map(n=>n instanceof yt?n:new yt({children:[new wt(r.text)]})));break;case"list":YM(r)&&e.push(...GM(r));break;case"table":zM(r)&&e.push(KM(r));break;case"code":ZM(r)&&e.push(...VM(r));break;case"hr":e.push(new yt(""));break;case"html":r.text.trim().length>0&&e.push(new yt({children:[new wt(r.text)]}));break;default:break}return e}function Er(t,e){let r=[];for(let n of t)switch(n.type){case"text":case"escape":r.push(new wt({text:n.text,...$d(e)}));break;case"strong":r.push(...Er(wr(n),{...e,bold:!0}));break;case"em":r.push(...Er(wr(n),{...e,italics:!0}));break;case"codespan":r.push(new wt({text:n.text,...$d({...e,code:!0})}));break;case"link":r.push(new RM({link:n.href,children:Er(wr(n),{...e})}));break;case"br":r.push(new wt({text:"",break:1}));break;case"image":r.push(new wt({text:`[image: ${n.text}]`,italics:!0}));break;case"del":r.push(new wt({text:n.text,strike:!0}));break;default:r.push(new wt({text:n.raw,...$d(e)}));break}return r.length===0?[new wt("")]:r}function $d(t){return{...t?.bold===!0?{bold:!0}:{},...t?.italics===!0?{italics:!0}:{},...t?.code===!0?{font:"Courier New"}:{}}}function GM(t){return t.items.map(e=>new yt({children:Er(e.tokens.length===1&&e.tokens[0]?.type==="text"?[{...e.tokens[0],text:Ww(e)+e.tokens[0].text}]:[{type:"text",raw:e.text,text:Ww(e)+e.text}]),...t.ordered?{numbering:{reference:"ordered-list",level:0}}:{bullet:{level:0}}}))}function Ww(t){return t.task?`[${t.checked?"x":" "}] `:""}function KM(t){let e=[t.header,...t.rows].map(r=>new CM({children:r.map(n=>new jM({children:[new yt({children:Er(n.tokens,n.header?{bold:!0}:void 0)})]}))}));return new OM({width:{size:100,type:MM.PERCENTAGE},rows:e})}function VM(t){return t.text.split(`
|
|
1977
|
+
`).map(r=>new yt({children:[new wt({text:r.length===0?" ":r,font:"Courier New"})]}))}function wr(t){let e=t.tokens;return Array.isArray(e)?e:[]}function YM(t){return t.type==="list"&&Array.isArray(t.items)}function zM(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function ZM(t){return t.type==="code"&&typeof t.text=="string"}function QM(t){switch(t){case 1:return jn.HEADING_1;case 2:return jn.HEADING_2;case 3:return jn.HEADING_3;case 4:return jn.HEADING_4;case 5:return jn.HEADING_5;default:return jn.HEADING_6}}var qw,Jw=b(()=>{"use strict";Ge();qw={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=>PM(t,t.state)}});import{createHash as eD}from"node:crypto";import{existsSync as tD,mkdirSync as rD,readFileSync as Xw,statSync as nD}from"node:fs";import{dirname as sD,isAbsolute as Gw,normalize as oD,resolve as Js}from"node:path";import{marked as iD}from"marked";import aD from"write-excel-file/node";async function lD(t,e){let r=t.stateId,n=t.displayName,s=G(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;try{let o=await cD(t,e),i=uD(e.input_format),a=await dD(t,e),l=await fD(t,e.title),c=i==="markdown"?TD(o):hD(o);await bD({sheets:c.length===0?[{name:"Sheet1",headers:[],rows:[]}]:c,outputPath:a,title:l??t.workflow.name});let u=nD(a).size;if(u===0)throw new Error("rendered XLSX file was empty");let d=eD("sha256").update(Xw(a)).digest("hex");return t.dal.insertStepArtifact({step_id:s.id,kind:"render_xlsx",path:a,sha:d,provider_call_mode:"library"}),t.dal.finishStep(s.id,"done",`wrote:${a}`),Y(t,r,n,{output_path:a,path:a,bytes:u}),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),Y(t,r,n,{error:i}),V(t.workflow,e.outcomes?.error??"@terminal:error")}}async function cD(t,e){if(typeof e.source!="string"||e.source.trim().length===0)return"";let r=(await Ze(e.source,t,t.stateId)).trim(),n=pD(t.project.local_path,r);if(n!==null){if(!tD(n))throw new Error(`source file not found: ${n}`);return Xw(n,"utf8")}return r}function uD(t){if(t==null||t==="")return"json";if(t==="json"||t==="markdown")return t;throw new Error(`unsupported input_format: ${String(t)}`)}async function dD(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let r=(await Ze(e.output_path,t,t.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=mD(t.project.local_path,r);if(!n.endsWith(".xlsx"))throw new Error(`output_path must end with .xlsx: ${n}`);return n}async function fD(t,e){if(typeof e!="string"||e.trim().length===0)return null;let r=(await Ze(e,t,t.stateId)).trim();return r.length===0?null:r}function mD(t,e){let r=Js(t);return oD(Gw(e)?Js(e):Js(r,e))}function pD(t,e){return _D(e)?Gw(e)?Js(e):Js(t,e):null}function _D(t){return t.endsWith(".json")||t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function hD(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(!wa(e)||!Array.isArray(e.sheets))throw new Error("JSON source must be an object with sheets[]");return e.sheets.map((r,n)=>gD(r,n))}function gD(t,e){if(!wa(t))throw new Error(`sheets[${e}] must be an object`);let r=yD(t.headers,`sheets[${e}].headers`),n=wD(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:ED(t.styles)}}function yD(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 wD(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 ED(t){if(!wa(t)||!wa(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 TD(t){let e=iD.lexer(t,{gfm:!0}),r=[],n=null;for(let s of e){if(xD(s)){n=s.text;continue}RD(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 bD(t){rD(sD(t.outputPath),{recursive:!0});let e=new Set,r=t.sheets.map(n=>({sheet:ID(n.name,e),data:SD(n),columns:kD(n)}));await aD(r).toFile(t.outputPath)}function SD(t){let e=[];if(t.headers.length>0){let r=AD(t.headerStyle?.fill);e.push(t.headers.map(n=>({value:n,type:String,fontWeight:t.headerStyle?.bold===!1?void 0:"bold",backgroundColor:r??void 0})))}for(let r of t.rows)e.push(r.map(vD));return e.length===0?[[{}]]:e}function vD(t){return t===null?{}:typeof t=="string"?{value:t,type:String}:typeof t=="number"?{value:t,type:Number}:typeof t=="boolean"?{value:t,type:Boolean}:{}}function kD(t){let e=Math.max(t.headers.length,...t.rows.map(n=>n.length),1),r=[];for(let n=1;n<=e;n+=1){let s=[t.headers[n-1],...t.rows.map(i=>i[n-1])],o=Math.min(60,Math.max(10,...s.map(i=>String(i??"").length+2)));r.push({width:o})}return r}function ID(t,e){let r=ND(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 ND(t){let e=t.replace(/[\[\]:*?/\\]/g," ").trim();return(e.length===0?"Sheet":e).slice(0,31)}function AD(t){if(t===void 0)return null;let e=t.startsWith("#")?t.slice(1):t;return/^[0-9a-fA-F]{6}$/.test(e)?`#${e.toUpperCase()}`:null}function xD(t){return t.type==="heading"&&typeof t.text=="string"}function RD(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function wa(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Kw,Vw=b(()=>{"use strict";Ge();Kw={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=>lD(t,t.state)}});import{spawnSync as LD}from"node:child_process";async function OD(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms;for(let f of e.pre_checks??[])if(LD("sh",["-c",f.command],{cwd:t.project.local_path}).status!==0){let p=G(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(p.id,"fail_pre_check",`pre_check_failed:${f.description??f.command}`),Y(t,r,n,"fail_pre_check");let _=e.outcomes.fail_pre_check;return _!==void 0?V(t.workflow,_):{kind:"terminal",terminal:Q(t.workflow)}}let o=On(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 $n(t,m,e.coder,a!==null?`PRIOR REVIEW FEEDBACK:
|
|
1978
1978
|
${a}`:null,c,l,s,e.writes_to_project_path===!0,o);if(l){let g=mw(p.text);if(g!==null){let h=G(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(h.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=G(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),w=Us(p.text,T);if(w.outcome===null){let k=G(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(k.id,null,`unhandled_stance:${w.reason}`),{kind:"escalate",token:"",reason:`no_stance:${w.reason}`}}let E=G(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(E.id,w.outcome,"outcomes_from_stance"),Y(t,r,n,w.outcome),V(t.workflow,e.outcomes_from_stance[w.outcome])}let g=Us(p.text,$D);if(g.outcome!==null){let T=G(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(T.id,g.outcome,"default_failure_stance"),Y(t,r,n,g.outcome),{kind:"escalate",token:g.outcome,reason:`failure_stance:${g.outcome}`}}let h=G(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,t.dal.finishStep(h.id,"approve","no_reviewers"),Y(t,r,n,"approve"),e.write_back_durable_memory){let T=t.membersByAlias.get(e.coder.alias);T!==void 0&&await Yt(t,n,T,e.write_back_durable_memory)}return V(t.workflow,e.outcomes.approve)}let _=await Promise.all(i.map(g=>$n(t,`${n}:reviewer_${g.alias}[${f}]`,g,`CODER OUTPUT:
|
|
1979
1979
|
${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));if(_.every(g=>g.outcome==="approve")){let g=G(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,t.dal.finishStep(g.id,"approve",`loop=${f}`),Y(t,r,n,"approve"),e.write_back_durable_memory){let h=t.membersByAlias.get(e.coder.alias);h!==void 0&&await Yt(t,n,h,e.write_back_durable_memory)}return V(t.workflow,e.outcomes.approve)}if(a=_.filter(g=>g.outcome==="request_changes").map(g=>g.text).join(`
|
|
1980
1980
|
|
|
1981
|
-
`),e.loop_feedback_artifact!==void 0){let g=G(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=G(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(u.id,"max_loops_exceeded",`loops=${e.max_loops}`),Y(t,r,n,"max_loops_exceeded");let d=e.outcomes.max_loops_exceeded;return d!==void 0?V(t.workflow,d):{kind:"terminal",terminal:Q(t.workflow)}}var $D,Yw,zw=b(()=>{"use strict";Id();Ge();$D=["blocked","failed","aborted"],Yw={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=>OD(t,t.state)}});import{spawnSync as jD}from"node:child_process";async function CD(t,e){let r=t.stateId,n=t.displayName,s=await Ze(e.command,t,n),o=Rd(t,n),i=kw(s);if(i.matched&&!o){let _=G(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.insertSessionEvent({run_id:t.run_id,step_id:_.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(_.id,null,`policy_violation:side_effect_without_pause:${i.kind}`),{kind:"terminal",terminal:Q(t.workflow)}}let a=new Date(Date.now()-1),l=typeof e.timeout_ms=="number"&&e.timeout_ms>0,c=jD("sh",["-c",s],{cwd:t.project.local_path,...l?{timeout:e.timeout_ms}:{},encoding:"utf8",env:{...process.env}}),u=G(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:Q(t.workflow)});if(e.writes_to_project_path!==!0&&t.project.local_path.trim().length>0&&Ld(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:Q(t.workflow)};if(e.capture_output_to!==void 0){let _=c.stdout??"";t.dal.insertStepArtifact({step_id:u.id,kind:e.capture_output_to,content:_})}let m=String(c.status),p=e.outcomes_from_exit[m]??e.outcomes_from_exit.default;return p===void 0?(t.dal.insertStepArtifact({step_id:u.id,kind:"unhandled_exit",content:m}),t.dal.finishStep(u.id,null,`shell_step_unhandled_exit:${m}`),{kind:"terminal",terminal:"shell_step_unhandled_exit"}):(t.dal.finishStep(u.id,m,`exit=${c.status}`),Y(t,r,n,m),V(t.workflow,p))}var Zw,Qw=b(()=>{"use strict";Ge();Zw={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=>CD(t,t.state)}});async function MD(t,e){let r=t.stateId,n=t.displayName,s=G(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:Q(t.workflow)};let i=Ue(o.definition),a=await DD(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:Q(t.workflow)};Y(t,r,n,PD(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:Q(t.workflow)}:V(t.workflow,u)}async function DD(t,e){let r={};for(let[n,s]of Object.entries(e.inputs??{})){let o=await yw(s,t);r[n]=o===s?await _a(s,t):o}return r}function PD(t,e,r){let n={};for(let s of r)n[s.name]=FD(t,e,s);return n}function FD(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=UD(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 UD(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 eE,tE=b(()=>{"use strict";An();Ge();Ws();eE={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=>MD(t,t.state)}});function WD(t,e){let r=t.stateId,n=t.displayName,s=e.name??n,o=G(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(o.id,s,e.kind??"neutral"),Y(t,r,n,s),{kind:"terminal",terminal:s}}var rE,nE=b(()=>{"use strict";Ge();rE={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=>WD(t,t.state)}});async function BD(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=qD(t.cursor),a=o.filter(HD).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 qD(t){if(t===void 0)return 0;let e=Number(t);return Number.isFinite(e)?e:0}function HD(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 sE,oE=b(()=>{"use strict";sE={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=>BD(t)}});async function JD(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 iE,aE=b(()=>{"use strict";iE={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=>JD(t)}});function lE(t){t.register(Nw),t.register(Yw),t.register(Lw),t.register(Dw),t.register(Fw),t.register(qw),t.register(Kw),t.register(Zw),t.register(Aw),t.register(Ow),t.register(eE),t.register(rE),t.register(iE),t.register(sE)}var cE=b(()=>{"use strict";xw();Rw();$w();Cw();Pw();Uw();Jw();Vw();zw();Qw();tE();nE();oE();aE()});function Ta(){return Ea===null&&(Ea=new Od,lE(Ea)),Ea}var XD,Od,Ea,jd=b(()=>{"use strict";cE();XD={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"},Od=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:XD[e];return r?this.types.get(r):void 0}list(){return Array.from(this.types.values())}},Ea=null});async function fE(t){gE(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=KD(e.definition,t.workflow),s=t.job.run_id===null?null:t.dal.getRun(t.job.run_id),o=Xs(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=iw(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(Xs(n)){let m=Cd({dal:t.dal,workflow:Sa(n),job:t.job,project:r,run:i,membersByAlias:c,outcomes:s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},inputs:yr(t.job.payload)??{},team_id:t.team.id}),p=await pE(n,m,i.current_state??n.entry_step_id);return dE(t.dal,r.id,i.id,n.name,p),p}let u=s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},d=Cd({dal:t.dal,workflow:n,job:t.job,project:r,run:i,membersByAlias:c,outcomes:u,inputs:yr(t.job.payload)??{},team_id:t.team.id}),f=await mE(d,i.current_state??n.start_at);return dE(t.dal,r.id,i.id,n.name,f),f}function dE(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 h=g.parameters;if(h.name===o&&(h.kind==="success"||h.kind==="failure"||h.kind==="neutral")){i=h.kind;break}}}let _=f.errors;if(_!==null&&typeof _=="object"){let g=_;(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 Cd(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 Md(e,r,n,s?.display_name??r)}finally{e.parent_step_id=o,e.iteration=i}},runChildWorkflow:async(r,n,s)=>{gE(n);let o=Xs(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=Cd({dal:t.dal,workflow:Xs(n)?Sa(n):n,job:t.job,project:t.project,run:i,membersByAlias:t.membersByAlias,outcomes:{},inputs:s,team_id:t.team_id});return Xs(n)?pE(n,a,i.current_state??n.entry_step_id):mE(a,i.current_state??n.start_at)}};return e}async function mE(t,e){let r=e;if(r.startsWith(Bs))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 zt(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=ba(t,Q(t.workflow));if(l.kind==="paused")return We(t);if(l.kind==="escalate")return lt(t,{id:r,name:r,type:"unknown"},l.token,l.reason),We(t);if(l.kind==="terminal")return zt(t,l.terminal);r=l.state;continue}let i,a=hE(t,r);if(a!==null){let l=G(t,{run_id:t.run_id,state_name:r});if(t.steps_executed+=1,t.dal.finishStep(l.id,a,"escalation_resume"),Y(t,r,r,a),a===os)return zt(t,Gl);let c=o.outcomes?.[a];i=c!==void 0?V(t.workflow,c):lt(t,{id:r,name:r,type:o.type},a,`no declared edge for resumed outcome '${a}' from state '${r}'`)}else i=await Md(t,r,o);if(i.kind==="paused")return We(t);if(i.kind==="escalate")return lt(t,{id:r,name:r,type:o.type},i.token,i.reason),We(t);if(i.kind==="terminal"){let l=ba(t,i.terminal);if(l.kind==="paused")return We(t);if(l.kind==="escalate")return lt(t,{id:r,name:r,type:o.type},l.token,l.reason),We(t);if(l.kind==="terminal")return zt(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=ba(t,Q(t.workflow));return n.kind==="terminal"?zt(t,n.terminal):zt(t,Q(t.workflow))}async function pE(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 lt(e,{id:o,name:o,type:"unknown"},"",`internal:unknown v3 step '${o}'`),We(e);let l=hE(e,a.id);if(l!==null){let m=G(e,{run_id:e.run_id,state_name:a.name});if(e.steps_executed+=1,e.dal.finishStep(m.id,l,"escalation_resume"),Y(e,a.id,a.name,l),l===os)return zt(e,Gl);let p=Object.keys(t.connections[a.id]??{}),_=t.connections[a.id]?.[l]?.[0]?.[0]?.step_id??t.connections[a.id]?.main?.[0]?.[0]?.step_id;if(_===void 0)return lt(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}),We(e);o=_;continue}let c=await GD(e,t,a);if(c.kind==="paused")return We(e);let u=Object.keys(t.connections[a.id]??{});if(c.kind==="escalate")return lt(e,{id:a.id,name:a.name,type:a.type},c.token,c.reason,{declared_outcomes:u}),We(e);let d=c.kind==="terminal"?c.terminal:c.state;if(a.type==="lmctl/terminal"){let m=e.workflow;e.workflow=Sa(t,a);try{let p=ba(e,d);if(p.kind==="paused")return We(e);if(p.kind==="escalate")return lt(e,{id:a.id,name:a.name,type:a.type},p.token,p.reason),We(e);if(p.kind==="terminal")return zt(e,p.terminal);let _=s.get(p.state);if(_===void 0)return lt(e,{id:a.id,name:a.name,type:a.type},"",`internal:unknown v3 error handler step '${p.state}'`),We(e);o=_.id;continue}finally{e.workflow=m}}if(Zr(d))return lt(e,{id:a.id,name:a.name,type:a.type},d,`generic escalation '${d}' from step '${a.id}'`,{declared_outcomes:u}),We(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 lt(e,{id:a.id,name:a.name,type:a.type},d,`no declared edge for outcome '${d}' from step '${a.id}'`,{declared_outcomes:u}),We(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})}),zt(e,"aborted")}async function GD(t,e,r){let n=_E(e,r),s=t.workflow;t.workflow=Sa(e,r);try{return await Md(t,r.id,n,r.name)}finally{t.workflow=s}}function _E(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 Md(t,e,r,n){let s=Ta().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?zD(t,s):void 0,t.progress_step_id=null;try{return await s.execute(Sw(t,e,r,n??e))}finally{t.emit_progress=o,t.progress_step_id=i}}function KD(t,e){try{let r=JSON.parse(t);if(YD(r)&&r.definition_schema_version===3)return $t.parse(r)}catch{return e}return e}function Xs(t){return t.definition_schema_version===3}function Sa(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]=_E(t,o))}return e?.type==="lmctl/terminal"&&typeof e.parameters.name=="string"&&(n[e.parameters.name]={kind:VD(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 VD(t){return t==="success"||t==="failure"||t==="neutral"?t:"neutral"}function YD(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function zD(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 zt(t,e){t.dal.setRunTerminalState(t.run_id,e);try{rw(t.run_id,t.dal)}catch{}return{run_id:t.run_id,terminal_state:e,steps_executed:t.steps_executed}}function We(t){return{run_id:t.run_id,terminal_state:null,steps_executed:t.steps_executed,paused:!0}}function hE(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 ba(t,e){if(!ZD(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&&QD(t,e,r.on_unhandled_failure),{kind:"terminal",terminal:e}))}function ZD(t,e){return t.definition_schema_version===2&&t.terminals[e]?.kind==="failure"}function QD(t,e,r){let n=eP(t),s=r.capture_evidence&&n!==null?tP(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 eP(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 tP(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 gE(t){if(!uE.includes(t.definition_schema_version))throw new Error(`unsupported definition_schema_version ${t.definition_schema_version}; supported versions: ${uE.join(", ")}`)}var uE,yE=b(()=>{"use strict";Nn();nw();aw();Ge();jd();is();uE=[1,2,3]});import{readFileSync as rP,readdirSync as nP}from"node:fs";import{basename as sP,join as oP,resolve as iP}from"node:path";function TE(t={}){let e=iP(t.workflowsDir??"workflows"),r=nP(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=>aP(oP(e,n)))}}function aP(t){let e=sP(t);try{let r=rP(t,"utf8"),n=Ue(r);return vE(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:kE(r)}}}function bE(t,e){try{let r=Ue(e);return vE(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:kE(r)}}}function SE(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(`
|
|
1981
|
+
`),e.loop_feedback_artifact!==void 0){let g=G(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=G(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(u.id,"max_loops_exceeded",`loops=${e.max_loops}`),Y(t,r,n,"max_loops_exceeded");let d=e.outcomes.max_loops_exceeded;return d!==void 0?V(t.workflow,d):{kind:"terminal",terminal:Q(t.workflow)}}var $D,Yw,zw=b(()=>{"use strict";Id();Ge();$D=["blocked","failed","aborted"],Yw={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=>OD(t,t.state)}});import{spawnSync as jD}from"node:child_process";async function CD(t,e){let r=t.stateId,n=t.displayName,s=await Ze(e.command,t,n),o=Rd(t,n),i=kw(s);if(i.matched&&!o){let _=G(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.insertSessionEvent({run_id:t.run_id,step_id:_.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(_.id,null,`policy_violation:side_effect_without_pause:${i.kind}`),{kind:"terminal",terminal:Q(t.workflow)}}let a=new Date(Date.now()-1),l=typeof e.timeout_ms=="number"&&e.timeout_ms>0,c=jD("sh",["-c",s],{cwd:t.project.local_path,...l?{timeout:e.timeout_ms}:{},encoding:"utf8",env:{...process.env}}),u=G(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:Q(t.workflow)});if(e.writes_to_project_path!==!0&&t.project.local_path.trim().length>0&&Ld(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:Q(t.workflow)};if(e.capture_output_to!==void 0){let _=c.stdout??"";t.dal.insertStepArtifact({step_id:u.id,kind:e.capture_output_to,content:_})}let m=String(c.status),p=e.outcomes_from_exit[m]??e.outcomes_from_exit.default;return p===void 0?(t.dal.insertStepArtifact({step_id:u.id,kind:"unhandled_exit",content:m}),t.dal.finishStep(u.id,null,`shell_step_unhandled_exit:${m}`),{kind:"terminal",terminal:"shell_step_unhandled_exit"}):(t.dal.finishStep(u.id,m,`exit=${c.status}`),Y(t,r,n,m),V(t.workflow,p))}var Zw,Qw=b(()=>{"use strict";Ge();Zw={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=>CD(t,t.state)}});async function MD(t,e){let r=t.stateId,n=t.displayName,s=G(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:Q(t.workflow)};let i=Fe(o.definition),a=await DD(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:Q(t.workflow)};Y(t,r,n,PD(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:Q(t.workflow)}:V(t.workflow,u)}async function DD(t,e){let r={};for(let[n,s]of Object.entries(e.inputs??{})){let o=await yw(s,t);r[n]=o===s?await _a(s,t):o}return r}function PD(t,e,r){let n={};for(let s of r)n[s.name]=FD(t,e,s);return n}function FD(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=UD(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 UD(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 eE,tE=b(()=>{"use strict";xn();Ge();Ws();eE={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=>MD(t,t.state)}});function WD(t,e){let r=t.stateId,n=t.displayName,s=e.name??n,o=G(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(o.id,s,e.kind??"neutral"),Y(t,r,n,s),{kind:"terminal",terminal:s}}var rE,nE=b(()=>{"use strict";Ge();rE={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=>WD(t,t.state)}});async function BD(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=qD(t.cursor),a=o.filter(HD).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 qD(t){if(t===void 0)return 0;let e=Number(t);return Number.isFinite(e)?e:0}function HD(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 sE,oE=b(()=>{"use strict";sE={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=>BD(t)}});async function JD(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 iE,aE=b(()=>{"use strict";iE={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=>JD(t)}});function lE(t){t.register(Nw),t.register(Yw),t.register(Lw),t.register(Dw),t.register(Fw),t.register(qw),t.register(Kw),t.register(Zw),t.register(xw),t.register(Ow),t.register(eE),t.register(rE),t.register(iE),t.register(sE)}var cE=b(()=>{"use strict";Aw();Rw();$w();Cw();Pw();Uw();Jw();Vw();zw();Qw();tE();nE();oE();aE()});function Ta(){return Ea===null&&(Ea=new Od,lE(Ea)),Ea}var XD,Od,Ea,jd=b(()=>{"use strict";cE();XD={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"},Od=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:XD[e];return r?this.types.get(r):void 0}list(){return Array.from(this.types.values())}},Ea=null});async function fE(t){gE(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=KD(e.definition,t.workflow),s=t.job.run_id===null?null:t.dal.getRun(t.job.run_id),o=Xs(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=iw(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(Xs(n)){let m=Cd({dal:t.dal,workflow:Sa(n),job:t.job,project:r,run:i,membersByAlias:c,outcomes:s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},inputs:yr(t.job.payload)??{},team_id:t.team.id}),p=await pE(n,m,i.current_state??n.entry_step_id);return dE(t.dal,r.id,i.id,n.name,p),p}let u=s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},d=Cd({dal:t.dal,workflow:n,job:t.job,project:r,run:i,membersByAlias:c,outcomes:u,inputs:yr(t.job.payload)??{},team_id:t.team.id}),f=await mE(d,i.current_state??n.start_at);return dE(t.dal,r.id,i.id,n.name,f),f}function dE(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 h=g.parameters;if(h.name===o&&(h.kind==="success"||h.kind==="failure"||h.kind==="neutral")){i=h.kind;break}}}let _=f.errors;if(_!==null&&typeof _=="object"){let g=_;(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 Cd(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 Md(e,r,n,s?.display_name??r)}finally{e.parent_step_id=o,e.iteration=i}},runChildWorkflow:async(r,n,s)=>{gE(n);let o=Xs(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=Cd({dal:t.dal,workflow:Xs(n)?Sa(n):n,job:t.job,project:t.project,run:i,membersByAlias:t.membersByAlias,outcomes:{},inputs:s,team_id:t.team_id});return Xs(n)?pE(n,a,i.current_state??n.entry_step_id):mE(a,i.current_state??n.start_at)}};return e}async function mE(t,e){let r=e;if(r.startsWith(Bs))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 zt(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=ba(t,Q(t.workflow));if(l.kind==="paused")return Ue(t);if(l.kind==="escalate")return lt(t,{id:r,name:r,type:"unknown"},l.token,l.reason),Ue(t);if(l.kind==="terminal")return zt(t,l.terminal);r=l.state;continue}let i,a=hE(t,r);if(a!==null){let l=G(t,{run_id:t.run_id,state_name:r});if(t.steps_executed+=1,t.dal.finishStep(l.id,a,"escalation_resume"),Y(t,r,r,a),a===os)return zt(t,Gl);let c=o.outcomes?.[a];i=c!==void 0?V(t.workflow,c):lt(t,{id:r,name:r,type:o.type},a,`no declared edge for resumed outcome '${a}' from state '${r}'`)}else i=await Md(t,r,o);if(i.kind==="paused")return Ue(t);if(i.kind==="escalate")return lt(t,{id:r,name:r,type:o.type},i.token,i.reason),Ue(t);if(i.kind==="terminal"){let l=ba(t,i.terminal);if(l.kind==="paused")return Ue(t);if(l.kind==="escalate")return lt(t,{id:r,name:r,type:o.type},l.token,l.reason),Ue(t);if(l.kind==="terminal")return zt(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=ba(t,Q(t.workflow));return n.kind==="terminal"?zt(t,n.terminal):zt(t,Q(t.workflow))}async function pE(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 lt(e,{id:o,name:o,type:"unknown"},"",`internal:unknown v3 step '${o}'`),Ue(e);let l=hE(e,a.id);if(l!==null){let m=G(e,{run_id:e.run_id,state_name:a.name});if(e.steps_executed+=1,e.dal.finishStep(m.id,l,"escalation_resume"),Y(e,a.id,a.name,l),l===os)return zt(e,Gl);let p=Object.keys(t.connections[a.id]??{}),_=t.connections[a.id]?.[l]?.[0]?.[0]?.step_id??t.connections[a.id]?.main?.[0]?.[0]?.step_id;if(_===void 0)return lt(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}),Ue(e);o=_;continue}let c=await GD(e,t,a);if(c.kind==="paused")return Ue(e);let u=Object.keys(t.connections[a.id]??{});if(c.kind==="escalate")return lt(e,{id:a.id,name:a.name,type:a.type},c.token,c.reason,{declared_outcomes:u}),Ue(e);let d=c.kind==="terminal"?c.terminal:c.state;if(a.type==="lmctl/terminal"){let m=e.workflow;e.workflow=Sa(t,a);try{let p=ba(e,d);if(p.kind==="paused")return Ue(e);if(p.kind==="escalate")return lt(e,{id:a.id,name:a.name,type:a.type},p.token,p.reason),Ue(e);if(p.kind==="terminal")return zt(e,p.terminal);let _=s.get(p.state);if(_===void 0)return lt(e,{id:a.id,name:a.name,type:a.type},"",`internal:unknown v3 error handler step '${p.state}'`),Ue(e);o=_.id;continue}finally{e.workflow=m}}if(Zr(d))return lt(e,{id:a.id,name:a.name,type:a.type},d,`generic escalation '${d}' from step '${a.id}'`,{declared_outcomes:u}),Ue(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 lt(e,{id:a.id,name:a.name,type:a.type},d,`no declared edge for outcome '${d}' from step '${a.id}'`,{declared_outcomes:u}),Ue(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})}),zt(e,"aborted")}async function GD(t,e,r){let n=_E(e,r),s=t.workflow;t.workflow=Sa(e,r);try{return await Md(t,r.id,n,r.name)}finally{t.workflow=s}}function _E(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 Md(t,e,r,n){let s=Ta().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?zD(t,s):void 0,t.progress_step_id=null;try{return await s.execute(Sw(t,e,r,n??e))}finally{t.emit_progress=o,t.progress_step_id=i}}function KD(t,e){try{let r=JSON.parse(t);if(YD(r)&&r.definition_schema_version===3)return $t.parse(r)}catch{return e}return e}function Xs(t){return t.definition_schema_version===3}function Sa(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]=_E(t,o))}return e?.type==="lmctl/terminal"&&typeof e.parameters.name=="string"&&(n[e.parameters.name]={kind:VD(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 VD(t){return t==="success"||t==="failure"||t==="neutral"?t:"neutral"}function YD(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function zD(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 zt(t,e){t.dal.setRunTerminalState(t.run_id,e);try{rw(t.run_id,t.dal)}catch{}return{run_id:t.run_id,terminal_state:e,steps_executed:t.steps_executed}}function Ue(t){return{run_id:t.run_id,terminal_state:null,steps_executed:t.steps_executed,paused:!0}}function hE(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 ba(t,e){if(!ZD(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&&QD(t,e,r.on_unhandled_failure),{kind:"terminal",terminal:e}))}function ZD(t,e){return t.definition_schema_version===2&&t.terminals[e]?.kind==="failure"}function QD(t,e,r){let n=eP(t),s=r.capture_evidence&&n!==null?tP(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 eP(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 tP(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 gE(t){if(!uE.includes(t.definition_schema_version))throw new Error(`unsupported definition_schema_version ${t.definition_schema_version}; supported versions: ${uE.join(", ")}`)}var uE,yE=b(()=>{"use strict";Nn();nw();aw();Ge();jd();is();uE=[1,2,3]});import{readFileSync as rP,readdirSync as nP}from"node:fs";import{basename as sP,join as oP,resolve as iP}from"node:path";function TE(t={}){let e=iP(t.workflowsDir??"workflows"),r=nP(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=>aP(oP(e,n)))}}function aP(t){let e=sP(t);try{let r=rP(t,"utf8"),n=Fe(r);return vE(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:kE(r)}}}function bE(t,e){try{let r=Fe(e);return vE(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:kE(r)}}}function SE(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(`
|
|
1982
1982
|
`)}
|
|
1983
|
-
`}function vE(t,e){let r=cP(e),n=uP(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=lP(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 lP(t){return(t??[]).filter(e=>e.required===!0&&e.default===void 0).map(e=>e.name)}function cP(t){return Dd(t)?t.entry_step_id:t.start_at}function uP(t){return Dd(t)?t.steps.find(e=>e.id===t.entry_step_id)?.type??null:t.states[t.start_at]?.type??null}function Dd(t){return t.definition_schema_version===3}function kE(t){return t instanceof Vt?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 IE(t){let e=new Set;if(Dd(t))for(let r of t.steps){let n=r.members??{};wE(n,e)}else for(let r of Object.values(t.states))wE(r,e);return[...e].sort()}function wE(t,e){let r=["coder","agent","consolidator"],n=["reviewers","researchers"];for(let s of r){let o=t[s],i=EE(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=EE(i);a!==null&&e.add(a)}}}function EE(t){if(t===null||typeof t!="object")return null;let e=t.alias;return typeof e=="string"&&e.length>0?e:null}var va=b(()=>{"use strict";
|
|
1983
|
+
`}function vE(t,e){let r=cP(e),n=uP(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=lP(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 lP(t){return(t??[]).filter(e=>e.required===!0&&e.default===void 0).map(e=>e.name)}function cP(t){return Dd(t)?t.entry_step_id:t.start_at}function uP(t){return Dd(t)?t.steps.find(e=>e.id===t.entry_step_id)?.type??null:t.states[t.start_at]?.type??null}function Dd(t){return t.definition_schema_version===3}function kE(t){return t instanceof Vt?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 IE(t){let e=new Set;if(Dd(t))for(let r of t.steps){let n=r.members??{};wE(n,e)}else for(let r of Object.values(t.states))wE(r,e);return[...e].sort()}function wE(t,e){let r=["coder","agent","consolidator"],n=["reviewers","researchers"];for(let s of r){let o=t[s],i=EE(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=EE(i);a!==null&&e.add(a)}}}function EE(t){if(t===null||typeof t!="object")return null;let e=t.alias;return typeof e=="string"&&e.length>0?e:null}var va=b(()=>{"use strict";xn()});function dP({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,ka)[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}=fP(t,r,i);if(a<20)continue;let c=i??"initial",u=`${Gs}:${r.id}:${c}`;t.enqueueJob({project_id:r.id,source:ka,source_ref:Gs,payload:JSON.stringify({kind:Gs,project_id:r.id,completed_sessions:a,max_run_id:l,since_run_id:i}),dedupe_key:u})}}function fP(t,e,r){let n=t.query(`SELECT COUNT(*) AS cnt, MAX(r.id) AS max_id
|
|
1984
1984
|
FROM run r
|
|
1985
1985
|
JOIN job j ON j.id = r.job_id
|
|
1986
1986
|
WHERE j.project_id = ?
|
|
1987
1987
|
AND r.terminal_state IS NOT NULL
|
|
1988
|
-
${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 NE(t){for(let e of mP)try{e(t)}catch{}}var ka,Gs,mP,Pd=b(()=>{"use strict";ka="memory_policy",Gs="memory_consolidation_request";mP=[dP]});var OE={};se(OE,{getOrInsertConsolidationWorkflow:()=>
|
|
1988
|
+
${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 NE(t){for(let e of mP)try{e(t)}catch{}}var ka,Gs,mP,Pd=b(()=>{"use strict";ka="memory_policy",Gs="memory_consolidation_request";mP=[dP]});var OE={};se(OE,{getOrInsertConsolidationWorkflow:()=>xE,runJobById:()=>Ks,runOnce:()=>qr,startWorker:()=>yP});import{createHash as pP}from"node:crypto";import{readFileSync as _P}from"node:fs";import{pathToFileURL as hP}from"node:url";function xE(t,e="durable-memory-consolidation-v2"){let r=t.getWorkflowByName(e);if(r!==null)return r;try{Di({swallow:!0});let n=Pi(e);if(n===null)return null;let s=_P(n,"utf8"),o=Fe(s);return t.insertWorkflow({name:e,version:o.version,definition_schema_version:o.definition_schema_version,definition:s,source_uri:hP(n).href,source_sha256:pP("sha256").update(s).digest("hex")})}catch{return null}}async function qr(t){let e=Date.now(),r=null;try{return r=t.dal.claimNextJobWithConcurrency({worker_id:t.worker_id,lease_ms:t.lease_ms??AE,evaluator:n=>LE(t.dal,n)}),r===null?null:await RE(t.dal,r,e)}catch(n){if(r!==null)return Tr(t.dal,r,"worker_run_failed",Br(n),e);try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:Ia(Br(n))})})}catch{}return null}finally{t.max_concurrent}}async function Ks(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??AE,evaluator:s=>LE(t.dal,s)});return n.claimed?(r=n.job,{claimed:!0,...await RE(t.dal,r,e)}):n}catch(n){if(r!==null)return{claimed:!0,...Tr(t.dal,r,"worker_run_failed",Br(n),e)};try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:Ia(Br(n)),job_id:t.job_id})})}catch{}return{claimed:!1,reason:"not_claimable",job_id:t.job_id}}finally{t.max_concurrent}}async function RE(t,e,r){let n=t.getProjectByJob(e.id);if(n===null)return Tr(t,e,"worker_project_missing","project_not_found",r);let s=e.source===ka&&e.source_ref===Gs,o=e.run_id===null?null:t.getRun(e.run_id),i;if(o!==null?i=t.getWorkflow(o.workflow_id):s?i=xE(t):i=$E(t,e,n),i===null)return Tr(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 Tr(t,e,"worker_team_missing","team_not_found",r,n);let c;try{c=Fe(i.definition)}catch(d){return Tr(t,e,"worker_workflow_invalid",Br(d),r,n)}let u=wP(c,l);if(u.length>0)return Tr(t,e,"worker_team_missing_aliases",`missing_aliases:${u.join(",")}`,r,n,a);try{let d=await fE({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 Tr(t,e,"worker_run_failed",Br(d),r,n,a)}}function LE(t,e){let r=t.getProjectByJob(e.id);if(r===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let n=$E(t,e,r);if(n===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let s=null;try{s=Fe(n.definition)}catch{s=null}return sa({workflow:s,job:e,project:r})}function $E(t,e,r){return e.workflow_id_override!==null?t.getWorkflow(e.workflow_id_override):t.getWorkflowByName(r.workflow_name)}async function yP(t){let e=!1,r=null,n=Promise.resolve(),s=async()=>{if(!e){try{let o;do o=await qr(t);while(!e&&o!==null)}catch(o){try{t.dal.raiseAttention({kind:"worker_loop_error",severity:"error",payload:JSON.stringify({error:Ia(Br(o))})})}catch{}}e||(r=setTimeout(()=>{n=s()},t.poll_interval_ms??gP))}};return n=s(),{stop:async()=>{e=!0,r!==null&&clearTimeout(r),await n.catch(()=>{})}}}function Tr(t,e,r,n,s,o,i){let a=Ia(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 Br(t){return t instanceof Error?t.message:String(t)}function Ia(t){return t.length>4096?t.slice(0,4096):t}function wP(t,e){let r=IE(t);if(r.length===0)return[];let n=new Set(e.map(s=>s.alias));return r.filter(s=>!n.has(s))}var AE,gP,Vs=b(()=>{"use strict";Fi();yE();xn();va();ad();Pd();AE=6e5,gP=5e3});import{existsSync as EP,readFileSync as TP}from"node:fs";import{marked as bP}from"marked";function DE(t,e){t.get("/layman",r=>r.html($e("Layman Home",SP(e.dal)))),t.get("/api/layman",r=>r.json(WE(e.dal))),t.get("/layman/start/:workflow",r=>{let n=ME(r);return n===null?r.notFound():r.html($e(`Start ${Cn(n)}`,IP(e.dal,n)))}),t.post("/layman/start/:workflow",async r=>{let n=ME(r);return n===null?r.notFound():n==="newspaper"?jE(r,e.dal):NP(r,e.dal,n)}),t.get("/layman/run/:id",r=>{let n=Mr(e.dal,Na(r,"id"));return n===null?r.notFound():r.html($e(`Run ${n.id}`,RP(e.dal,n)))}),t.get("/api/layman/run/:id",r=>{let n=Mr(e.dal,Na(r,"id"));return n===null?r.notFound():r.json(WP(e.dal,n))}),t.post("/layman/run/:id/respond",async r=>$P(r,e.dal)),t.get("/layman/newspaper",r=>r.html($e("Newspaper Subscriptions",FP(e.dal)))),t.post("/layman/newspaper",r=>jE(r,e.dal)),t.delete("/layman/newspaper/:id",r=>CE(r,e.dal)),t.post("/layman/newspaper/:id/delete",r=>CE(r,e.dal))}function SP(t){let e=WE(t);return`<section class="layman-home">
|
|
1989
1989
|
<h1>Welcome</h1>
|
|
1990
1990
|
<p class="muted">Choose a workflow and answer a few plain-language prompts.</p>
|
|
1991
|
-
<div class="grid">${
|
|
1991
|
+
<div class="grid">${Aa.map(vP).join("")}</div>
|
|
1992
1992
|
<h2>Recent Activity</h2>
|
|
1993
1993
|
${kP(e.recent_runs)}
|
|
1994
1994
|
<section class="metric">
|
|
@@ -2013,7 +2013,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
|
|
|
2013
2013
|
<label>Slug<input name="slug" placeholder="my-document" required></label>
|
|
2014
2014
|
<label>Output directory<input name="output_dir" value="drafts"></label>
|
|
2015
2015
|
<button type="submit">Start Document Wizard</button>
|
|
2016
|
-
</form>`:UE(n,"/layman/start/newspaper")}function PE(t){return`<label>Project<select name="project_id" required>${t.map(e=>`<option value="${v(e.id)}">${v(e.name)}</option>`).join("")}</select></label>`}async function NP(t,e,r){let n=await t.req.parseBody(),s=HE(e,n);if(s===null)return t.html($e("Start workflow",'<p class="error">Choose a valid project.</p>'),400);let o=e.getWorkflowByName(r);if(o===null)return t.html($e("Start workflow",`<p class="error">${v(Cn(r))} is not loaded.</p>`),400);let i=r==="info-qa"?
|
|
2016
|
+
</form>`:UE(n,"/layman/start/newspaper")}function PE(t){return`<label>Project<select name="project_id" required>${t.map(e=>`<option value="${v(e.id)}">${v(e.name)}</option>`).join("")}</select></label>`}async function NP(t,e,r){let n=await t.req.parseBody(),s=HE(e,n);if(s===null)return t.html($e("Start workflow",'<p class="error">Choose a valid project.</p>'),400);let o=e.getWorkflowByName(r);if(o===null)return t.html($e("Start workflow",`<p class="error">${v(Cn(r))} is not loaded.</p>`),400);let i=r==="info-qa"?AP(n):xP(n);if(typeof i=="string")return t.html($e("Start workflow",`<p class="error">${v(i)}</p>`),400);let a=e.enqueueJob({project_id:s.id,workflow_id_override:o.id,source:"layman",source_ref:r,dedupe_key:`layman:${r}:${Date.now()}:${Math.random()}`,payload:JSON.stringify(i)}),l=await qr({dal:e,worker_id:`layman-start-${Date.now()}`}),c=e.getJob(a.id),u=l?.job_id===a.id?l.run_id:c?.run_id??null;return u===null?t.redirect("/layman?queued=1",302):t.redirect(`/layman/run/${u}`,302)}function AP(t){let e=Qe(t.question).trim();if(e.length===0)return"Enter a question.";let r=Qe(t.output_path).trim();return{question:e,...r.length>0?{output_path:r}:{}}}function xP(t){let e=Qe(t.task_description).trim(),r=KP(Qe(t.slug).trim()),n=Qe(t.output_dir).trim()||"drafts";return e.length===0?"Describe the document you want.":r.length===0?"Enter a document slug.":{task_description:e,slug:r,output_dir:n}}function RP(t,e){let r=e.workflow?.name??"unknown",n=`<h1>${v(Cn(r))}</h1>
|
|
2017
2017
|
<p><a href="/layman">Layman home</a></p>`;if(e.terminal_state!==null)return`${n}${jP(t,e,r)}`;let s=qE(t,e);return s!==null&&s.status==="waiting_operator"?`${n}${LP(e,s)}`:`${n}<section hx-get="/layman/run/${v(e.id)}" hx-trigger="every 2s" hx-swap="outerHTML">
|
|
2018
2018
|
<h2>Running</h2>
|
|
2019
2019
|
<p class="muted">Current stage: <strong>${v(e.current_state??"starting")}</strong></p>
|
|
@@ -2052,7 +2052,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
|
|
|
2052
2052
|
<label>Custom cron<input name="cron" placeholder="0 6 * * *"></label>
|
|
2053
2053
|
<label>Output directory<input name="output_dir" value="digests"></label>
|
|
2054
2054
|
<button type="submit">Create subscription</button>
|
|
2055
|
-
</form>`}async function jE(t,e){let r=await t.req.parseBody(),n=HE(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:qP(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 CE(t,e){let r=Na(t,"id");return e.removeProjectWorkflow(r)?t.redirect("/layman/newspaper?removed=1",302):t.notFound()}function UP(t){return pe(["id","project","topics","status","action"],t.map(e=>{let r=VP(e.parameters_override),n=Array.isArray(r.topics)?r.topics.join(", "):"";return[v(e.id),v(e.project_name),v(n),e.enabled===1?"enabled":"disabled",`<form method="post" action="/layman/newspaper/${e.id}/delete"><button type="submit">Remove</button></form>`]}))}function WE(t){let e=BE(t);return{workflows:
|
|
2055
|
+
</form>`}async function jE(t,e){let r=await t.req.parseBody(),n=HE(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:qP(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 CE(t,e){let r=Na(t,"id");return e.removeProjectWorkflow(r)?t.redirect("/layman/newspaper?removed=1",302):t.notFound()}function UP(t){return pe(["id","project","topics","status","action"],t.map(e=>{let r=VP(e.parameters_override),n=Array.isArray(r.topics)?r.topics.join(", "):"";return[v(e.id),v(e.project_name),v(n),e.enabled===1?"enabled":"disabled",`<form method="post" action="/layman/newspaper/${e.id}/delete"><button type="submit">Remove</button></form>`]}))}function WE(t){let e=BE(t);return{workflows:Aa,recent_runs:BP(t),newspaper_subscriptions:e.length}}function WP(t,e){let r=qE(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 BP(t){return t.query(`SELECT r.*, w.name AS workflow_name
|
|
2056
2056
|
FROM run r
|
|
2057
2057
|
JOIN workflow w ON w.id = r.workflow_id
|
|
2058
2058
|
WHERE w.name IN (${Wd.map(()=>"?").join(",")})
|
|
@@ -2062,21 +2062,21 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
|
|
|
2062
2062
|
JOIN workflow w ON w.id = pw.workflow_id
|
|
2063
2063
|
JOIN project p ON p.id = pw.project_id
|
|
2064
2064
|
WHERE w.name = ?
|
|
2065
|
-
ORDER BY pw.id DESC`,"newspaper")}function qE(t,e){for(let r of[...e.steps].reverse()){let n=t.getInteractiveSessionByStepId(r.id);if(n!==null)return n}return null}function HE(t,e){let r=Number(Qe(e.project_id));return Number.isInteger(r)?t.getProject(r):null}function qP(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 ME(t){let e=t.req.param("workflow");return Wd.includes(e)?e:null}function Cn(t){return
|
|
2065
|
+
ORDER BY pw.id DESC`,"newspaper")}function qE(t,e){for(let r of[...e.steps].reverse()){let n=t.getInteractiveSessionByStepId(r.id);if(n!==null)return n}return null}function HE(t,e){let r=Number(Qe(e.project_id));return Number.isInteger(r)?t.getProject(r):null}function qP(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 ME(t){let e=t.req.param("workflow");return Wd.includes(e)?e:null}function Cn(t){return Aa.find(e=>e.name===t)?.title??t}function HP(t){return t.split(/[_:-]/).filter(Boolean).map(e=>`${e[0]?.toUpperCase()??""}${e.slice(1)}`).join(" ")}function qd(t){return bP.parse(t,{async:!1})}function JP(t){return t==="done"||t==="pr_ready"||t==="merged"}function XP(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}function GP(t,e){return t.split(`
|
|
2066
2066
|
`).slice(0,e).join(`
|
|
2067
|
-
`)}function KP(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function Qe(t){return typeof t=="string"?t:""}function VP(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 Ud(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Na(t,e){return Number(t.req.param(e))}var xa,Wd,JE=b(()=>{"use strict";Vs();Jt();Td();xa=[{name:"info-qa",title:"Ask a Question",description:"Get a grounded answer from multiple researchers and one consolidator."},{name:"document-creation",title:"Create a Document",description:"Draft, review, and render a polished document with an interactive wizard."},{name:"newspaper",title:"Daily Newspaper",description:"Subscribe to recurring digests for topics you care about."}],Wd=xa.map(t=>t.name)});function zP(t){return t.replace(/^\/+/,"")}function XE(t){return typeof t=="string"&&t!==""&&!t.includes("/")&&!t.includes("\\")}function Mn(t){if(t.mailboxKey!==void 0&&t.mailboxKey!==null&&t.mailboxKey!==""){let e=zP(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 XE(t.userId)&&XE(t.deviceId)?`${t.userId}/${t.deviceId}/`:`${YP}/${t.identityId}/`}function QP(t){return String(Math.max(0,Math.floor(t))).padStart(ZP,"0")}function Hd(t,e,r){return`${t}${e}${QP(r)}.json`}function Aa(t,e){return`${t}${e}`}function Ra(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 YP,ZP,La=b(()=>{"use strict";YP="mailbox";ZP=12});function Zt(t,e){let r=Math.floor(t),n="",s=r;for(let u=0;u<12;u++)n=$a[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=$a[a&15]+i,a=a>>4;let l=$a[8|Math.floor(e()*4)&3],c="";for(let u=0;u<15;u++)c+=$a[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 $a,Oa=b(()=>{"use strict";$a="0123456789abcdef"});function Xd(t,e){return!Number.isFinite(t)||t<=0?e:t}function Gd(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 zE(t){return t.conversation_id===YE&&rF(t.payload)}function rF(t){return typeof t=="object"&&t!==null&&t.kind==="heartbeat"}function nF(t){let e=typeof t.hb=="string"&&t.hb!==""?t.hb:zE(t)?t.timestamp:void 0;if(e===void 0)return;let r=Date.parse(e);return Number.isFinite(r)?r:void 0}var GE,KE,VE,eF,YE,tF,Jd,Hr,ja=b(()=>{"use strict";La();Oa();GE=3e3,KE=1e4,VE=12e3,eF=1e3,YE="__lmctl_heartbeat__",tF={kind:"heartbeat"},Jd={setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t)},Hr=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=Mn({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=Xd(e.readIntervalMs??e.pollIntervalMs??GE,GE),this.heartbeatIdleMs=Xd(e.heartbeatIdleMs??KE,KE),this.backoffReadIntervalMs=Xd(e.backoffReadIntervalMs??e.pollIntervalMs??VE,VE)}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??Jd;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=Aa(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:eF,...s!==void 0&&{ContinuationToken:s}}));this.opts.onS3Op?.("list");for(let i of o.Contents??[]){let a=Ra(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:Zt(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=Hd(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??Jd;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=Hd(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(Gd(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),zE(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=nF(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??Jd;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(YE,tF)}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 sF}from"@hono/node-server/conninfo";function ZE(t,e){let r=e.bucket??oF,n=e.remoteAddressOf??(o=>aF(o)),s=o=>{let i=n(o);return lF(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=Kd(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 Gd(l)?o.json({error:"not_found"},404):o.json({error:"internal",message:Vd(l)},500)}}),t.put("/local-mailbox/object",async o=>{let i=s(o);if(i!==null)return i;let a=Kd(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:Vd(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=Kd(a,{allowEmpty:!0});if(typeof l!="string")return o.json({error:"bad_request",message:l.error},400);let c=iF(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:Vd(d)},500)}})}function Kd(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 iF(t){if(t===void 0||t==="")return;let e=Number(t);return Number.isInteger(e)&&e>0?e:void 0}function aF(t){try{return sF(t).remote.address}catch{return}}function lF(t){return t===void 0||t===""?!1:!!(t==="127.0.0.1"||t==="::1"||t.startsWith("::ffff:127.")||t.startsWith("127."))}function Vd(t){return t instanceof Error?t.message:String(t)}var oF,QE=b(()=>{"use strict";ja();oF="local"});function eT(t,e){t.get("/mailbox/workspace",r=>dF(r,e)),t.get("/mailbox/projects",r=>fF(r,e)),t.get("/mailbox/projects/:id",r=>mF(r,e)),t.post("/mailbox/projects",r=>pF(r,e)),t.patch("/mailbox/projects/:id",r=>_F(r,e)),t.delete("/mailbox/projects/:id",r=>hF(r,e)),t.post("/mailbox/projects/:project_id/prompts",r=>gF(r,e)),t.get("/mailbox/prompts/:id",r=>yF(r,e))}function dF(t,e){e.dal.ensureWorkspace({id:Pn,name:Yd});let r=tT(e.dal),n={id:Pn,name:Yd,created_at:uF,projects:r};return t.json({workspace:n})}function fF(t,e){return t.json({projects:tT(e.dal)})}function mF(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(Dn)){let s=zd(e.dal,r);return s===null||s.deleted_at!==null?t.json({project:null},404):t.json({project:Da(s)})}let n=nT(e.dal,r);return n===null?t.json({project:null},404):t.json({project:rT(n)})}async function pF(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:Pn,name:Yd});let s=e.dal.insertWebProject({workspace_id:Pn,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:Da(s)},201)}async function _F(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(Dn)){let o=zd(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:Da(i)})}return t.json({error:"project_not_found",message:`project not found: ${r}`},404)}function hF(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(Dn)){let n=zd(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 gF(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=nT(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=`${cF}${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 wF({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:`${Ma}${i.id}`,text:s.text,status:"pending",created_at:new Date().toISOString(),completed_at:null};return t.json({prompt:d},201)}function yF(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=EF(e.dal,r);return t.json({result:n})}function tT(t){let e=t.listProjects().map(rT),r=t.listWebProjectsActive(Pn).map(Da);return[...e,...r].sort(RF)}function rT(t){return{id:`${Ma}${t.id}`,workspace_id:Pn,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 Da(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:`${Dn}${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 zd(t,e){if(!e.startsWith(Dn))return null;let r=e.slice(Dn.length),n=Number.parseInt(r,10);return!Number.isFinite(n)||String(n)!==r?null:t.getWebProject(n)}function nT(t,e){if(e.startsWith(Ma)){let n=e.slice(Ma.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 wF(t){let{enqueueManual:e}=await Promise.resolve().then(()=>(cd(),Ry));return{id:e(t.dal,{project_id:t.project_id,source_ref:t.source_ref,payload:t.payload}).id}}function EF(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=NF(t,o?.team_id??null),a=IF(s),l=xF(n,a,i.length>0),c=AF(r.created_at,s),u=o===null?{totalEstimatedMs:void 0,perStep:new Map}:TF(t,o.workflow_name),d=u.totalEstimatedMs,f=sT(r.created_at),m=o?.workflow_name,p=u.perStep.size>0?u.perStep.size:void 0,_=s===null?[]:bF(t,s.id),g=SF(s,a,_,u.perStep,i),h=vF(_,u.perStep),T=kF(g,h,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,...Ca(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,...Ca(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,...Ca(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,...Ca(d,f),...T},errors_json:null,duration_ms:c}}function TF(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 bF(t,e){try{return t.listStepsForRun(e)}catch{return[]}}function SF(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=sT(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 vF(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 kF(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 sT(t){let e=Date.parse(t);return Number.isNaN(e)?0:Math.max(0,Date.now()-e)}function Ca(t,e){return t===void 0?{elapsed_ms:e}:{elapsed_ms:e,estimated_duration_ms:t}}function IF(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 NF(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 xF(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 AF(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 RF(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 Ma,Dn,cF,Pn,Yd,uF,oT=b(()=>{"use strict";Ma="project:",Dn="web_project:",cF="prompt:",Pn="default",Yd="Default workspace",uF=new Date(0).toISOString()});import{Buffer as iT}from"node:buffer";function aT(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 lT(t){return OF[t]}function cT(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 LF,$F,Pa,OF,Zd=b(()=>{"use strict";LF=1e4,$F=256*1024,Pa=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=aT(e.pushWindowMs,process.env.LMCTL_TERMINAL_PUSH_WINDOW_MS,LF),this.pushByteCap=aT(e.pushByteCap,process.env.LMCTL_TERMINAL_PUSH_BYTE_CAP,$F),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+=iT.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=${iT.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
|
|
2067
|
+
`)}function KP(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function Qe(t){return typeof t=="string"?t:""}function VP(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 Ud(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Na(t,e){return Number(t.req.param(e))}var Aa,Wd,JE=b(()=>{"use strict";Vs();Jt();Td();Aa=[{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."}],Wd=Aa.map(t=>t.name)});function zP(t){return t.replace(/^\/+/,"")}function XE(t){return typeof t=="string"&&t!==""&&!t.includes("/")&&!t.includes("\\")}function Mn(t){if(t.mailboxKey!==void 0&&t.mailboxKey!==null&&t.mailboxKey!==""){let e=zP(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 XE(t.userId)&&XE(t.deviceId)?`${t.userId}/${t.deviceId}/`:`${YP}/${t.identityId}/`}function QP(t){return String(Math.max(0,Math.floor(t))).padStart(ZP,"0")}function Hd(t,e,r){return`${t}${e}${QP(r)}.json`}function xa(t,e){return`${t}${e}`}function Ra(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 YP,ZP,La=b(()=>{"use strict";YP="mailbox";ZP=12});function Zt(t,e){let r=Math.floor(t),n="",s=r;for(let u=0;u<12;u++)n=$a[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=$a[a&15]+i,a=a>>4;let l=$a[8|Math.floor(e()*4)&3],c="";for(let u=0;u<15;u++)c+=$a[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 $a,Oa=b(()=>{"use strict";$a="0123456789abcdef"});function Xd(t,e){return!Number.isFinite(t)||t<=0?e:t}function Gd(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 zE(t){return t.conversation_id===YE&&rF(t.payload)}function rF(t){return typeof t=="object"&&t!==null&&t.kind==="heartbeat"}function nF(t){let e=typeof t.hb=="string"&&t.hb!==""?t.hb:zE(t)?t.timestamp:void 0;if(e===void 0)return;let r=Date.parse(e);return Number.isFinite(r)?r:void 0}var GE,KE,VE,eF,YE,tF,Jd,Hr,ja=b(()=>{"use strict";La();Oa();GE=3e3,KE=1e4,VE=12e3,eF=1e3,YE="__lmctl_heartbeat__",tF={kind:"heartbeat"},Jd={setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t)},Hr=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=Mn({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=Xd(e.readIntervalMs??e.pollIntervalMs??GE,GE),this.heartbeatIdleMs=Xd(e.heartbeatIdleMs??KE,KE),this.backoffReadIntervalMs=Xd(e.backoffReadIntervalMs??e.pollIntervalMs??VE,VE)}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??Jd;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=xa(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:eF,...s!==void 0&&{ContinuationToken:s}}));this.opts.onS3Op?.("list");for(let i of o.Contents??[]){let a=Ra(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:Zt(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=Hd(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??Jd;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=Hd(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(Gd(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),zE(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=nF(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??Jd;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(YE,tF)}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 sF}from"@hono/node-server/conninfo";function ZE(t,e){let r=e.bucket??oF,n=e.remoteAddressOf??(o=>aF(o)),s=o=>{let i=n(o);return lF(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=Kd(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 Gd(l)?o.json({error:"not_found"},404):o.json({error:"internal",message:Vd(l)},500)}}),t.put("/local-mailbox/object",async o=>{let i=s(o);if(i!==null)return i;let a=Kd(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:Vd(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=Kd(a,{allowEmpty:!0});if(typeof l!="string")return o.json({error:"bad_request",message:l.error},400);let c=iF(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:Vd(d)},500)}})}function Kd(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 iF(t){if(t===void 0||t==="")return;let e=Number(t);return Number.isInteger(e)&&e>0?e:void 0}function aF(t){try{return sF(t).remote.address}catch{return}}function lF(t){return t===void 0||t===""?!1:!!(t==="127.0.0.1"||t==="::1"||t.startsWith("::ffff:127.")||t.startsWith("127."))}function Vd(t){return t instanceof Error?t.message:String(t)}var oF,QE=b(()=>{"use strict";ja();oF="local"});function eT(t,e){t.get("/mailbox/workspace",r=>dF(r,e)),t.get("/mailbox/projects",r=>fF(r,e)),t.get("/mailbox/projects/:id",r=>mF(r,e)),t.post("/mailbox/projects",r=>pF(r,e)),t.patch("/mailbox/projects/:id",r=>_F(r,e)),t.delete("/mailbox/projects/:id",r=>hF(r,e)),t.post("/mailbox/projects/:project_id/prompts",r=>gF(r,e)),t.get("/mailbox/prompts/:id",r=>yF(r,e))}function dF(t,e){e.dal.ensureWorkspace({id:Pn,name:Yd});let r=tT(e.dal),n={id:Pn,name:Yd,created_at:uF,projects:r};return t.json({workspace:n})}function fF(t,e){return t.json({projects:tT(e.dal)})}function mF(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(Dn)){let s=zd(e.dal,r);return s===null||s.deleted_at!==null?t.json({project:null},404):t.json({project:Da(s)})}let n=nT(e.dal,r);return n===null?t.json({project:null},404):t.json({project:rT(n)})}async function pF(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:Pn,name:Yd});let s=e.dal.insertWebProject({workspace_id:Pn,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:Da(s)},201)}async function _F(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(Dn)){let o=zd(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:Da(i)})}return t.json({error:"project_not_found",message:`project not found: ${r}`},404)}function hF(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(Dn)){let n=zd(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 gF(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=nT(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=`${cF}${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 wF({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:`${Ma}${i.id}`,text:s.text,status:"pending",created_at:new Date().toISOString(),completed_at:null};return t.json({prompt:d},201)}function yF(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=EF(e.dal,r);return t.json({result:n})}function tT(t){let e=t.listProjects().map(rT),r=t.listWebProjectsActive(Pn).map(Da);return[...e,...r].sort(RF)}function rT(t){return{id:`${Ma}${t.id}`,workspace_id:Pn,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 Da(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:`${Dn}${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 zd(t,e){if(!e.startsWith(Dn))return null;let r=e.slice(Dn.length),n=Number.parseInt(r,10);return!Number.isFinite(n)||String(n)!==r?null:t.getWebProject(n)}function nT(t,e){if(e.startsWith(Ma)){let n=e.slice(Ma.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 wF(t){let{enqueueManual:e}=await Promise.resolve().then(()=>(cd(),Ry));return{id:e(t.dal,{project_id:t.project_id,source_ref:t.source_ref,payload:t.payload}).id}}function EF(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=NF(t,o?.team_id??null),a=IF(s),l=AF(n,a,i.length>0),c=xF(r.created_at,s),u=o===null?{totalEstimatedMs:void 0,perStep:new Map}:TF(t,o.workflow_name),d=u.totalEstimatedMs,f=sT(r.created_at),m=o?.workflow_name,p=u.perStep.size>0?u.perStep.size:void 0,_=s===null?[]:bF(t,s.id),g=SF(s,a,_,u.perStep,i),h=vF(_,u.perStep),T=kF(g,h,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,...Ca(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,...Ca(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,...Ca(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,...Ca(d,f),...T},errors_json:null,duration_ms:c}}function TF(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 bF(t,e){try{return t.listStepsForRun(e)}catch{return[]}}function SF(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=sT(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 vF(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 kF(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 sT(t){let e=Date.parse(t);return Number.isNaN(e)?0:Math.max(0,Date.now()-e)}function Ca(t,e){return t===void 0?{elapsed_ms:e}:{elapsed_ms:e,estimated_duration_ms:t}}function IF(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 NF(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 AF(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 xF(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 RF(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 Ma,Dn,cF,Pn,Yd,uF,oT=b(()=>{"use strict";Ma="project:",Dn="web_project:",cF="prompt:",Pn="default",Yd="Default workspace",uF=new Date(0).toISOString()});import{Buffer as iT}from"node:buffer";function aT(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 lT(t){return OF[t]}function cT(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 LF,$F,Pa,OF,Zd=b(()=>{"use strict";LF=1e4,$F=256*1024,Pa=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=aT(e.pushWindowMs,process.env.LMCTL_TERMINAL_PUSH_WINDOW_MS,LF),this.pushByteCap=aT(e.pushByteCap,process.env.LMCTL_TERMINAL_PUSH_BYTE_CAP,$F),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+=iT.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=${iT.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
|
|
2068
2068
|
[process exited with code ${r.exitCode}${r.signal!==void 0?` signal ${r.signal}`:""}]\r
|
|
2069
2069
|
`,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)}};OF={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 dT(t,e){t.post("/mailbox/terminal/launch",r=>jF(r,e)),t.post("/mailbox/terminal/end/:session_id",r=>CF(r,e)),t.get("/mailbox/terminal/sessions",r=>MF(r,e))}async function jF(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"||!uT.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=cT(n.command_line),i===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=lT(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 CF(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||!uT.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 MF(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 uT,fT=b(()=>{"use strict";Zd();uT=/^[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 DF}from"node:buffer";function UF(t){try{return DF.byteLength(JSON.stringify(t),"utf8")}catch{return 256}}function mT(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 pT(t){return WF[t]}function _T(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 PF,FF,Fa,WF,Qd=b(()=>{"use strict";PF=2e3,FF=64*1024,Fa=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=mT(e.pushWindowMs,process.env.LMCTL_PROVIDER_PUSH_WINDOW_MS,PF),this.pushByteCap=mT(e.pushByteCap,process.env.LMCTL_PROVIDER_PUSH_BYTE_CAP,FF),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=UF(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")))})}};WF={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 gT(t,e){t.post("/mailbox/chat/launch",r=>BF(r,e)),t.post("/mailbox/chat/end/:session_id",r=>qF(r,e)),t.get("/mailbox/chat/sessions",r=>HF(r,e))}async function BF(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"||!hT.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=_T(n.command_line),i===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=pT(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 qF(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||!hT.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 HF(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 hT,yT=b(()=>{"use strict";Qd();hT=/^[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 JF}from"node:fs";function ET(t){let e=t.artifacts.find(r=>r.kind===`${t.state_name}_transcript`);if(e?.content!==void 0&&e.content!==null)return wT(e.content);if(e?.path===void 0||e.path===null)return[];try{let r=JF(e.path,{encoding:"utf8"});return wT(r)}catch{return[]}}function wT(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 TT=b(()=>{"use strict"});function bT(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 Ua(t,e){let r=t.query(`SELECT id, kind FROM attention
|
|
2070
2070
|
WHERE run_id = ?
|
|
2071
2071
|
AND acknowledged_at IS NULL
|
|
2072
2072
|
AND requires_user = 1
|
|
2073
|
-
ORDER BY id DESC LIMIT 1`,e);return r.length===0?null:{kind:r[0].kind,attention_id:r[0].id}}var Wa=b(()=>{"use strict"});function $T(t,e){t.all("/runtime/*",r=>XF(r.req.raw,e))}async function XF(t,e){try{return Response.json(await GF(t,e))}catch(r){if(r instanceof ie)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 GF(t,e){let r=new URL(t.url),n=e1(e),s=r.pathname.split("/").filter(Boolean).map(decodeURIComponent);if(t.method==="GET"&&r.pathname==="/runtime/workspaces")return ef(t),[{id:n.id,name:n.name}];if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="workspaces")return Ba(t,n.id,s[2]),KF(e.dal,n);if(t.method==="GET"&&s.length===5&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"){Ba(t,n.id,s[2]);let o=vT(e.dal,s[4]);return ST(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/lead-teams")return ef(t),e.dal.listTeams().map(o=>QF(o));if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="chat"){let o=kT(e.dal,IT(s[2])),i=await t.json();if(i.teamId!==`team:${o.name}`)throw new ie(400,"runtime lead chat body does not match route team");return xT(t,n.id,i.context),NT(o,i.context)}if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="messages"){let o=kT(e.dal,IT(s[2])),i=await t.json();if(i.teamId!==`team:${o.name}`)throw new ie(400,"runtime lead message body does not match route team");xT(t,n.id,i.context);let a=i.draft?.body;if(typeof a!="string"||a.length===0)throw new ie(400,"runtime lead message requires draft.body");return NT(o,i.context,a)}if(t.method==="POST"&&s.length===6&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"&&s[5]==="workflow-message"){Ba(t,n.id,s[2]);let o=vT(e.dal,s[4]),i=await t.json();if(i.workspaceId!==n.id||i.projectId!==o.name)throw new ie(400,"runtime request body does not match route workspace/project");let a=i.draft?.body;if(typeof a!="string"||a.length===0)throw new ie(400,"runtime workflow message requires draft.body");return zF(e.dal,o,a),ST(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/templates")return Ys(t,n.id),e.dal.listWorkflows().map(o=>t1(o));if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="templates"){Ys(t,n.id);let o=n1(e.dal,s[2]);return r1(o)}if(t.method==="GET"&&r.pathname==="/runtime/runs"){Ys(t,n.id);let o=r.searchParams.get("project"),i=r.searchParams.get("template");if(o!==null&&i!==null)throw new ie(400,"conflicting_filters: ?project= and ?template= are mutually exclusive");return s1(e.dal,o,i).map(l=>RT(e.dal,l))}if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="runs"){Ys(t,n.id);let o=AT(e.dal,s[2]);return RT(e.dal,o)}if(t.method==="GET"&&s.length===4&&s[0]==="runtime"&&s[1]==="runs"&&s[3]==="events"){Ys(t,n.id);let o=AT(e.dal,s[2]),i=i1(e.dal,o);return{runId:of(o),events:i,...i.length>0?{cursor:i[i.length-1].id}:{}}}throw new ie(404,`unknown runtime request: ${t.method} ${r.pathname}`)}function KF(t,e){return{id:e.id,name:e.name,projects:t.listProjects().map(r=>OT(t,e,r))}}function ST(t,e,r){let n=OT(t,e,r);return{...n,managedWorkflow:{...n.managedWorkflow,instance:VF(t,r),composerTarget:{kind:"workflow-initial",label:`Project Workflow: ${r.workflow_name}`,templateId:`template:${r.workflow_name}`,runId:n.managedWorkflow.runId}},workflowMessages:YF(t,r)}}function OT(t,e,r){let n=jT(t,r.id),s=rf(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 VF(t,e){let r=jT(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:rf(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 YF(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 zF(t,e,r){let n=ZF(t,e.id);if(n!==null){let s=Ua(t,n.id);if(s?.kind==="workflow_escalation"){let o=t.resumeEscalation(s.attention_id,r);if(!o.resumed)throw new ie(409,`workflow escalation resume failed: ${o.reason}`);return}if(s?.kind==="interactive_waiting_operator"){let o=Rt(t,s.attention_id);if(o?.step_id===null||o?.step_id===void 0)throw new ie(409,"interactive resume failed: missing step");let i=t.resumeInteractive(o.step_id,r,!0);if(!i.resumed)throw new ie(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 jT(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 ZF(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 rf(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 vT(t,e){let r=t.findProjectByName(e);if(r===null)throw new ie(404,`project not found: ${e}`);return r}function kT(t,e){let r=t.listTeams().find(n=>n.name===e);if(r===void 0)throw new ie(404,`team not found: ${e}`);return r}function IT(t){return t.startsWith("team:")?t.slice(5):t}function QF(t){return{id:`team:${t.name}`,name:t.name,teamfile:"",hasLead:!0,kind:t.name.toLowerCase().includes("manager")?"global-manager":"custom-ai-led"}}function NT(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??LT}`,teamId:`team:${t.name}`,title:`${t.name} Lead`,messages:s,...e===void 0?{}:{context:e}}}function e1(t){let e=t.workspaceName??Kn()??Ir.default;return{id:e,name:e}}function ef(t){if(t.headers.get("x-lmctl-workspace-id")!==LT)throw new ie(400,"runtime request requires global-admin workspace identity")}function Ba(t,e,r){let n=t.headers.get("x-lmctl-workspace-id");if(n===null)throw new ie(400,"runtime request requires workspace identity");if(r!==e||n!==e)throw new ie(400,"runtime workspace identity does not match route")}function Ys(t,e){let r=t.headers.get("x-lmctl-workspace-id");if(r===null)throw new ie(400,"runtime request requires workspace identity");if(r!==e)throw new ie(400,"runtime workspace identity does not match server workspace")}function xT(t,e,r){if(r?.scope==="workspace"){if(r.workspaceId===void 0)throw new ie(400,"workspace manager context requires workspace identity");Ba(t,e,r.workspaceId);return}ef(t)}function nf(t){return`${Fn}${sf(t.name)}`}function sf(t){return t.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"item"}function of(t){return`${tf}${t.id}`}function t1(t){let e=qa(t.definition);return{id:nf(t),name:t.name,...e.description===null?{}:{description:e.description}}}function r1(t){let e=qa(t.definition);return{id:nf(t),name:t.name,...e.description===null?{}:{description:e.description},graph:e.graph}}function qa(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 n1(t,e){if(!e.startsWith(Fn))throw new ie(404,`template not found: ${e}`);let r=e.slice(Fn.length),n=t.listWorkflows().filter(s=>sf(s.name)===r);if(n.length===0)throw new ie(404,`template not found: ${e}`);if(n.length>1){let s=n.map(o=>o.name).join(", ");throw new ie(409,`template_id_ambiguous: ${e} matches multiple workflow names [${s}]; rename to ensure unique slugs`)}return n[0]}function AT(t,e){if(!e.startsWith(tf))throw new ie(404,`run not found: ${e}`);let r=e.slice(tf.length);if(!/^[1-9]\d*$/.test(r))throw new ie(404,`run not found: ${e}`);let n=Number.parseInt(r,10);if(!Number.isFinite(n)||n<=0||String(n)!==r)throw new ie(404,`run not found: ${e}`);let s=t.getRun(n);if(s===null)throw new ie(404,`run not found: ${e}`);return s}function s1(t,e,r){if(r!==null){if(!r.startsWith(Fn))return[];let s=r.slice(Fn.length),o=t.listWorkflows().filter(a=>sf(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 RT(t,e){let r=t.getWorkflow(e.workflow_id),n=rf(e),s=o1(r,e);return{id:of(e),templateId:r===null?`${Fn}unknown`:nf(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 o1(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]:[qa(t.definition).nameToId.get(r)??r]}function i1(t,e){let r=t.getWorkflow(e.workflow_id),n=r===null?{stepIds:[],nameToId:new Map}:qa(r.definition),s=c=>n.nameToId.get(c)??c,o=of(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=a1(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 a1(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 LT,Fn,tf,ie,CT=b(()=>{"use strict";Ve();Wa();Jt();LT="global-admin";Fn="template:",tf="run:";ie=class extends Error{status;constructor(e,r){super(r),this.status=e}}});import{mkdirSync as l1,writeFileSync as c1}from"node:fs";import{randomUUID as MT}from"node:crypto";import{dirname as u1,resolve as Ha,sep as DT}from"node:path";async function FT(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(!_1(n))return t.text("missing image file",400);if(n.size>d1)return t.text("upload too large",413);let s=Buffer.from(await n.arrayBuffer()),o=h1(s);if(o===null||!(o in PT))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=f1(e,r.project);if(typeof i=="string")return t.text(i,404);let a=i===null?Ha(p1()):Ha(i.local_path),l=Ha(a,"uploads",MT()),c=Ha(l,`${MT()}${PT[o]}`);if(!m1(c,a))return t.text("invalid upload path",400);l1(l,{recursive:!0});let u=new Uint8Array(s.buffer,s.byteOffset,s.byteLength);c1(c,u);let d={path:c,size:s.byteLength,mime:o,project:i?.name??null};return t.json(d)}function f1(t,e){return e==null||e===""?null:typeof e!="string"?"invalid project":t.findProjectByName(e)??`project not found: ${e}`}function m1(t,e){let r=e.endsWith(DT)?e:`${e}${DT}`;return t.startsWith(r)}function p1(){return u1(le())}function _1(t){return typeof File<"u"&&t instanceof File}function h1(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 d1,PT,UT=b(()=>{"use strict";Ve();d1=10*1024*1024,PT={"image/png":".png","image/jpeg":".jpg","image/webp":".webp","image/heic":".heic","application/pdf":".pdf"}});import{existsSync as Ja}from"node:fs";import{basename as g1,dirname as y1,extname as w1,isAbsolute as E1,join as T1,relative as b1}from"node:path";import{fileURLToPath as S1}from"node:url";import{Hono as v1}from"hono";import{serveStatic as Ot}from"@hono/node-server/serve-static";function GT(t){let e=new v1,r=[],n=t.localWebui!==void 0?lf(t.localWebui.webuiDir):k1();if(t.localWebui!==void 0&&ZE(e,{s3:t.localWebui.localMailbox.s3,commands:t.localWebui.localMailbox.commands}),n!==null){let s=I1();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,Ot({root:n})),e.use("/vendor/*",s,Ot({root:n})),e.use("/src/*",s,Ot({root:n})),e.get("/",s,Ot({root:n,path:"index.html"})),e.get("/admin",s,Ot({root:n,path:"index.html"})),e.get("/admin/*",s,Ot({root:n,path:"index.html"})),e.get("/terminal",s,Ot({root:n,path:"index.html"})),e.get("/terminal/*",s,Ot({root:n,path:"index.html"})),e.get("/chat",s,Ot({root:n,path:"index.html"})),e.get("/chat/*",s,Ot({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("*",Dy()),e.get("/login",s=>s.html($e("Login",`
|
|
2073
|
+
ORDER BY id DESC LIMIT 1`,e);return r.length===0?null:{kind:r[0].kind,attention_id:r[0].id}}var Wa=b(()=>{"use strict"});function $T(t,e){t.all("/runtime/*",r=>XF(r.req.raw,e))}async function XF(t,e){try{return Response.json(await GF(t,e))}catch(r){if(r instanceof ie)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 GF(t,e){let r=new URL(t.url),n=e1(e),s=r.pathname.split("/").filter(Boolean).map(decodeURIComponent);if(t.method==="GET"&&r.pathname==="/runtime/workspaces")return ef(t),[{id:n.id,name:n.name}];if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="workspaces")return Ba(t,n.id,s[2]),KF(e.dal,n);if(t.method==="GET"&&s.length===5&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"){Ba(t,n.id,s[2]);let o=vT(e.dal,s[4]);return ST(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/lead-teams")return ef(t),e.dal.listTeams().map(o=>QF(o));if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="chat"){let o=kT(e.dal,IT(s[2])),i=await t.json();if(i.teamId!==`team:${o.name}`)throw new ie(400,"runtime lead chat body does not match route team");return AT(t,n.id,i.context),NT(o,i.context)}if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="messages"){let o=kT(e.dal,IT(s[2])),i=await t.json();if(i.teamId!==`team:${o.name}`)throw new ie(400,"runtime lead message body does not match route team");AT(t,n.id,i.context);let a=i.draft?.body;if(typeof a!="string"||a.length===0)throw new ie(400,"runtime lead message requires draft.body");return NT(o,i.context,a)}if(t.method==="POST"&&s.length===6&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"&&s[5]==="workflow-message"){Ba(t,n.id,s[2]);let o=vT(e.dal,s[4]),i=await t.json();if(i.workspaceId!==n.id||i.projectId!==o.name)throw new ie(400,"runtime request body does not match route workspace/project");let a=i.draft?.body;if(typeof a!="string"||a.length===0)throw new ie(400,"runtime workflow message requires draft.body");return zF(e.dal,o,a),ST(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/templates")return Ys(t,n.id),e.dal.listWorkflows().map(o=>t1(o));if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="templates"){Ys(t,n.id);let o=n1(e.dal,s[2]);return r1(o)}if(t.method==="GET"&&r.pathname==="/runtime/runs"){Ys(t,n.id);let o=r.searchParams.get("project"),i=r.searchParams.get("template");if(o!==null&&i!==null)throw new ie(400,"conflicting_filters: ?project= and ?template= are mutually exclusive");return s1(e.dal,o,i).map(l=>RT(e.dal,l))}if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="runs"){Ys(t,n.id);let o=xT(e.dal,s[2]);return RT(e.dal,o)}if(t.method==="GET"&&s.length===4&&s[0]==="runtime"&&s[1]==="runs"&&s[3]==="events"){Ys(t,n.id);let o=xT(e.dal,s[2]),i=i1(e.dal,o);return{runId:of(o),events:i,...i.length>0?{cursor:i[i.length-1].id}:{}}}throw new ie(404,`unknown runtime request: ${t.method} ${r.pathname}`)}function KF(t,e){return{id:e.id,name:e.name,projects:t.listProjects().map(r=>OT(t,e,r))}}function ST(t,e,r){let n=OT(t,e,r);return{...n,managedWorkflow:{...n.managedWorkflow,instance:VF(t,r),composerTarget:{kind:"workflow-initial",label:`Project Workflow: ${r.workflow_name}`,templateId:`template:${r.workflow_name}`,runId:n.managedWorkflow.runId}},workflowMessages:YF(t,r)}}function OT(t,e,r){let n=jT(t,r.id),s=rf(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 VF(t,e){let r=jT(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:rf(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 YF(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 zF(t,e,r){let n=ZF(t,e.id);if(n!==null){let s=Ua(t,n.id);if(s?.kind==="workflow_escalation"){let o=t.resumeEscalation(s.attention_id,r);if(!o.resumed)throw new ie(409,`workflow escalation resume failed: ${o.reason}`);return}if(s?.kind==="interactive_waiting_operator"){let o=Rt(t,s.attention_id);if(o?.step_id===null||o?.step_id===void 0)throw new ie(409,"interactive resume failed: missing step");let i=t.resumeInteractive(o.step_id,r,!0);if(!i.resumed)throw new ie(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 jT(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 ZF(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 rf(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 vT(t,e){let r=t.findProjectByName(e);if(r===null)throw new ie(404,`project not found: ${e}`);return r}function kT(t,e){let r=t.listTeams().find(n=>n.name===e);if(r===void 0)throw new ie(404,`team not found: ${e}`);return r}function IT(t){return t.startsWith("team:")?t.slice(5):t}function QF(t){return{id:`team:${t.name}`,name:t.name,teamfile:"",hasLead:!0,kind:t.name.toLowerCase().includes("manager")?"global-manager":"custom-ai-led"}}function NT(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??LT}`,teamId:`team:${t.name}`,title:`${t.name} Lead`,messages:s,...e===void 0?{}:{context:e}}}function e1(t){let e=t.workspaceName??Kn()??Ir.default;return{id:e,name:e}}function ef(t){if(t.headers.get("x-lmctl-workspace-id")!==LT)throw new ie(400,"runtime request requires global-admin workspace identity")}function Ba(t,e,r){let n=t.headers.get("x-lmctl-workspace-id");if(n===null)throw new ie(400,"runtime request requires workspace identity");if(r!==e||n!==e)throw new ie(400,"runtime workspace identity does not match route")}function Ys(t,e){let r=t.headers.get("x-lmctl-workspace-id");if(r===null)throw new ie(400,"runtime request requires workspace identity");if(r!==e)throw new ie(400,"runtime workspace identity does not match server workspace")}function AT(t,e,r){if(r?.scope==="workspace"){if(r.workspaceId===void 0)throw new ie(400,"workspace manager context requires workspace identity");Ba(t,e,r.workspaceId);return}ef(t)}function nf(t){return`${Fn}${sf(t.name)}`}function sf(t){return t.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"item"}function of(t){return`${tf}${t.id}`}function t1(t){let e=qa(t.definition);return{id:nf(t),name:t.name,...e.description===null?{}:{description:e.description}}}function r1(t){let e=qa(t.definition);return{id:nf(t),name:t.name,...e.description===null?{}:{description:e.description},graph:e.graph}}function qa(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 n1(t,e){if(!e.startsWith(Fn))throw new ie(404,`template not found: ${e}`);let r=e.slice(Fn.length),n=t.listWorkflows().filter(s=>sf(s.name)===r);if(n.length===0)throw new ie(404,`template not found: ${e}`);if(n.length>1){let s=n.map(o=>o.name).join(", ");throw new ie(409,`template_id_ambiguous: ${e} matches multiple workflow names [${s}]; rename to ensure unique slugs`)}return n[0]}function xT(t,e){if(!e.startsWith(tf))throw new ie(404,`run not found: ${e}`);let r=e.slice(tf.length);if(!/^[1-9]\d*$/.test(r))throw new ie(404,`run not found: ${e}`);let n=Number.parseInt(r,10);if(!Number.isFinite(n)||n<=0||String(n)!==r)throw new ie(404,`run not found: ${e}`);let s=t.getRun(n);if(s===null)throw new ie(404,`run not found: ${e}`);return s}function s1(t,e,r){if(r!==null){if(!r.startsWith(Fn))return[];let s=r.slice(Fn.length),o=t.listWorkflows().filter(a=>sf(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 RT(t,e){let r=t.getWorkflow(e.workflow_id),n=rf(e),s=o1(r,e);return{id:of(e),templateId:r===null?`${Fn}unknown`:nf(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 o1(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]:[qa(t.definition).nameToId.get(r)??r]}function i1(t,e){let r=t.getWorkflow(e.workflow_id),n=r===null?{stepIds:[],nameToId:new Map}:qa(r.definition),s=c=>n.nameToId.get(c)??c,o=of(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=a1(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 a1(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 LT,Fn,tf,ie,CT=b(()=>{"use strict";Ve();Wa();Jt();LT="global-admin";Fn="template:",tf="run:";ie=class extends Error{status;constructor(e,r){super(r),this.status=e}}});import{mkdirSync as l1,writeFileSync as c1}from"node:fs";import{randomUUID as MT}from"node:crypto";import{dirname as u1,resolve as Ha,sep as DT}from"node:path";async function FT(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(!_1(n))return t.text("missing image file",400);if(n.size>d1)return t.text("upload too large",413);let s=Buffer.from(await n.arrayBuffer()),o=h1(s);if(o===null||!(o in PT))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=f1(e,r.project);if(typeof i=="string")return t.text(i,404);let a=i===null?Ha(p1()):Ha(i.local_path),l=Ha(a,"uploads",MT()),c=Ha(l,`${MT()}${PT[o]}`);if(!m1(c,a))return t.text("invalid upload path",400);l1(l,{recursive:!0});let u=new Uint8Array(s.buffer,s.byteOffset,s.byteLength);c1(c,u);let d={path:c,size:s.byteLength,mime:o,project:i?.name??null};return t.json(d)}function f1(t,e){return e==null||e===""?null:typeof e!="string"?"invalid project":t.findProjectByName(e)??`project not found: ${e}`}function m1(t,e){let r=e.endsWith(DT)?e:`${e}${DT}`;return t.startsWith(r)}function p1(){return u1(le())}function _1(t){return typeof File<"u"&&t instanceof File}function h1(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 d1,PT,UT=b(()=>{"use strict";Ve();d1=10*1024*1024,PT={"image/png":".png","image/jpeg":".jpg","image/webp":".webp","image/heic":".heic","application/pdf":".pdf"}});import{existsSync as Ja}from"node:fs";import{basename as g1,dirname as y1,extname as w1,isAbsolute as E1,join as T1,relative as b1}from"node:path";import{fileURLToPath as S1}from"node:url";import{Hono as v1}from"hono";import{serveStatic as Ot}from"@hono/node-server/serve-static";function GT(t){let e=new v1,r=[],n=t.localWebui!==void 0?lf(t.localWebui.webuiDir):k1();if(t.localWebui!==void 0&&ZE(e,{s3:t.localWebui.localMailbox.s3,commands:t.localWebui.localMailbox.commands}),n!==null){let s=I1();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,Ot({root:n})),e.use("/vendor/*",s,Ot({root:n})),e.use("/src/*",s,Ot({root:n})),e.get("/",s,Ot({root:n,path:"index.html"})),e.get("/admin",s,Ot({root:n,path:"index.html"})),e.get("/admin/*",s,Ot({root:n,path:"index.html"})),e.get("/terminal",s,Ot({root:n,path:"index.html"})),e.get("/terminal/*",s,Ot({root:n,path:"index.html"})),e.get("/chat",s,Ot({root:n,path:"index.html"})),e.get("/chat/*",s,Ot({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("*",Dy()),e.get("/login",s=>s.html($e("Login",`
|
|
2074
2074
|
<h1>Login</h1>
|
|
2075
2075
|
<form method="post" action="/login">
|
|
2076
2076
|
<label>Token <input name="token" type="password"></label>
|
|
2077
2077
|
<button type="submit">Login</button>
|
|
2078
2078
|
</form>
|
|
2079
|
-
`))),e.post("/login",async s=>{let o=await s.req.parseBody(),i=typeof o.token=="string"?o.token:"";return Fy(i)?(_d(s,i),s.redirect("/",302)):s.html($e("Login","<p>Invalid token</p>"),401)}),e.post("/logout",s=>(Uy(s),s.redirect("/login",302))),DE(e,{dal:t.dal}),$T(e,{dal:t.dal}),eT(e,{dal:t.dal}),dT(e,{terminalSessionManager:t.terminalSessionManager}),gT(e,{persistentSessionManager:t.persistentSessionManager}),e.post("/api/teams/:team_name/refresh",async s=>{let o=vs(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 wu(t.dal,o,f.alias),t.dal.setMemberState(f.id,"idle",null),u.push(f.alias)}catch(m){let p=m instanceof Error?m.message:String(m);t.dal.setMemberState(f.id,"attention_needed",`refresh failed: ${p}`),d.push({alias:f.alias,error:p})}return B(s,{team:o,seeded:u,failed:d},f=>`<p>refreshed team ${v(f.team)}: seeded [${f.seeded.map(m=>v(m)).join(", ")}]${f.failed.length>0?` failed [${f.failed.map(m=>`${v(m.alias)}: ${v(m.error)}`).join(", ")}]`:""}</p>`)}),Gy(e,{dal:t.dal}),ew(e,{dal:t.dal}),e.get("/api/status",s=>B(s,gi(t.dal),O1)),e.get("/api/projects",s=>B(s,yi(t.dal),j1)),e.get("/api/teams",s=>B(s,Gh(t.dal),D1)),e.get("/api/workflows",s=>B(s,wi(t.dal),P1)),e.get("/api/workflows/verify",s=>{let o=TE();return s.req.header("accept")?.includes("text/plain")?s.text(SE(o)):s.json(o)}),e.get("/api/jobs",s=>B(s,Kh(t.dal,{status:s.req.query("status")}),F1)),e.post("/api/uploads",s=>FT(s,t.dal)),e.get("/api/jobs/:id",s=>{let o=Ei(t.dal,te(s,"id"));return o===null?s.notFound():B(s,o,fe)}),e.post("/api/jobs",async s=>{let o;try{o=await s.req.json()}catch{return s.text("invalid JSON body",400)}let i=null;if(typeof o.project_id=="number")i=o.project_id;else if(typeof o.project=="string"){let f=t.dal.findProjectByName(o.project);if(f===null)return s.text(`project not found: ${o.project}`,404);i=f.id}else{let f=t.dal.listProjects();f.length===1&&(i=f[0].id)}if(i===null)return s.text("missing project or project_id",400);let a=typeof o.workflow_id_override=="number"?o.workflow_id_override:null;if(a===null&&typeof o.workflow=="string"){let f=t.dal.getWorkflowByName(o.workflow);if(f===null)return s.text(`workflow not found: ${o.workflow}`,404);a=f.id}let l=typeof o.source=="string"?o.source:"manual",c=o.payload,u=c==null?null:typeof c=="string"?c:JSON.stringify(c),d=t.dal.enqueueJob({project_id:i,workflow_id_override:a,source:l,source_ref:typeof o.source_ref=="string"?o.source_ref:null,payload:u,priority:typeof o.priority=="number"?o.priority:0,dedupe_key:typeof o.dedupe_key=="string"?o.dedupe_key:null});return B(s,d,fe)}),e.post("/api/jobs/:id/run",async s=>{let{runJobById:o}=await Promise.resolve().then(()=>(Vs(),OE)),i=Ei(t.dal,te(s,"id"));if(i===null)return s.notFound();let a=await o({dal:t.dal,worker_id:`api-job-run-${process.pid}-${Date.now()}`,job_id:i.id});return a.claimed?s.json({job_id:a.job_id,run_id:a.run_id,status:a.status,terminal_state:a.terminal_state,ms:a.ms}):s.json(a,409)}),e.get("/api/workflows/:name",s=>{let o=t.dal.getWorkflowByName(s.req.param("name"));return o===null?s.notFound():B(s,o,fe)}),e.get("/api/projects/:name/workflows",s=>{let o=t.dal.findProjectByName(s.req.param("name"));return o===null?s.notFound():B(s,t.dal.listProjectWorkflows(o.id),C1)}),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 Un(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{hr(u)}catch{return s.text("invalid condition",400)}let d=A1(i.parameters_override??i.params);if(typeof d=="string"&&d.startsWith("error:"))return s.text(d.slice(6),400);let f=typeof i.priority=="number"&&Number.isInteger(i.priority)?i.priority:100,m=t.dal.insertProjectWorkflow({project_id:o.id,workflow_id:c.id,condition:u,parameters_override:d,priority:f});return B(s,m,fe)}),e.get("/api/projects/workflows/:id",s=>{let o=t.dal.getProjectWorkflow(te(s,"id"));return o===null?s.notFound():B(s,o,fe)}),e.delete("/api/projects/workflows/:id",s=>t.dal.removeProjectWorkflow(te(s,"id"))?B(s,{removed:!0},fe):s.notFound()),e.post("/api/projects/workflows/:id/enable",s=>{let o=t.dal.setProjectWorkflowEnabled(te(s,"id"),!0);return o===null?s.notFound():B(s,o,fe)}),e.post("/api/projects/workflows/:id/disable",s=>{let o=t.dal.setProjectWorkflowEnabled(te(s,"id"),!1);return o===null?s.notFound():B(s,o,fe)}),e.get("/api/projects/:name/issues",s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=BT(s.req.query("status"),R1);if(typeof i=="string")return s.text(i,400);let a=BT(s.req.query("severity"),VT);return typeof a=="string"?s.text(a,400):B(s,t.dal.listIssues(o.id,{...i!==void 0?{status:i}:{},...a!==void 0?{severity:a}:{},...s.req.query("ai_test_path")!==void 0?{ai_test_path:s.req.query("ai_test_path")}:{}}),M1)}),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 Un(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=L1(i.severity);if(typeof c=="object")return s.text(c.error,400);let u=$1(i.labels);if(typeof u=="string"&&u.startsWith("error:"))return s.text(u.slice(6),400);let d=t.dal.createIssue({project_id:o.id,title:a,body:l,...c!==void 0?{severity:c}:{},labels:u,ai_test_path:typeof i.ai_test_path=="string"?i.ai_test_path:null,source_run_id:typeof i.source_run_id=="number"?i.source_run_id:null});return B(s,d,fe)}),e.get("/api/issues/:id",s=>{let o=t.dal.getIssue(te(s,"id"));return o===null?s.notFound():B(s,o,fe)}),e.post("/api/issues/:id/claim",async s=>{let o=te(s,"id"),i=t.dal.getIssue(o);if(i===null)return s.notFound();let a=await Un(s);if(typeof a=="string")return s.json({error:a},400);let l=typeof a.assigned_run_id=="number"?a.assigned_run_id:null;if(l===null)return s.json({error:"missing assigned_run_id"},400);let c=t.dal.claimIssue(o,l);return c===null?s.json({error:`issue ${o} is not in a claimable state (status=${i.status})`},400):B(s,c,fe)}),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 Un(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.assigned_run_id=="number"?i.assigned_run_id:null;if(a===null)return s.json({error:"missing assigned_run_id"},400);let l=t.dal.claimNextIssue(o.id,a);return l===null?s.json({status:"queue_empty"},404):B(s,l,fe)}),e.post("/api/issues/:id/close",async s=>{let o=t.dal.getIssue(te(s,"id"));if(o===null)return s.notFound();let i=await Un(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.closed_run_id=="number"?i.closed_run_id:o.assigned_run_id;if(a===null)return s.json({error:"missing closed_run_id"},400);try{return B(s,t.dal.closeIssue(te(s,"id"),a,typeof i.commit_hash=="string"?i.commit_hash:null),fe)}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(te(s,"id"));if(o===null)return s.notFound();let i=await Un(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.source_run_id=="number"?i.source_run_id:o.closed_run_id??o.source_run_id;if(a===null)return s.json({error:"missing source_run_id"},400);try{return B(s,t.dal.reopenIssue(te(s,"id"),a),fe)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.get("/api/projects/:name",s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=o.name.indexOf("/"),a=i>0?o.name.slice(0,i):null,l=i>0?o.name.slice(i+1):o.name;return B(s,{...o,owner:a,repo:l},fe)}),e.get("/api/runs/:run_id/artifacts",s=>{let o=te(s,"run_id"),i=s.req.query("kind"),a=Dr(t.dal,o,i);return B(s,a,fe)}),e.get("/api/runs/:run_id/artifacts/:kind",async s=>{let o=te(s,"run_id"),i=s.req.param("kind"),a=Dr(t.dal,o,i);if(a.length===0)return s.notFound();let l=a[a.length-1],c=s.req.query("raw")==="true";if(l.content!==null&&l.content!==void 0)return c?s.text(l.content):B(s,l,fe);if(l.path!==null&&l.path!==void 0){if(c)try{let{readFileSync:u}=await import("node:fs"),d=N1(l.path);if(x1(d)){let _=u(l.path,"utf8");return s.body(_,200,{"Content-Type":d})}let f=u(l.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength),p=g1(l.path);return s.body(m,200,{"Content-Type":d,"Content-Disposition":`attachment; filename="${p}"`})}catch(u){return s.text(`failed to read artifact path: ${u.message}`,500)}return B(s,l,fe)}return B(s,l,fe)}),e.get("/api/runs",s=>B(s,mn(t.dal,{limit:af(s,"limit")??100}),U1)),e.get("/api/runs/:id",s=>{let o=Mr(t.dal,te(s,"id"));return o===null?s.notFound():B(s,o,W1)}),e.get("/api/runs/:id/where",s=>{let o=pn(t.dal,te(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(bi(o)):s.json(o)}),e.get("/api/runs/:id/timeline",s=>{let o=Si(t.dal,te(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(vi(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(te(s,"id"),o);return!i.resumed&&i.reason==="run_not_found"?s.notFound():i.resumed?(Xa(t.daemon),B(s,i,qT)):B(s,i,qT,400)}),e.post("/api/interactive/:step_id/respond",async s=>{let o=te(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?(Xa(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=>WT(s,t.dal,o=>B(s,o,q1))),e.get("/api/runs/:id/steps/:step_id/transcript",s=>{let o=Zh(t.dal,te(s,"id"),te(s,"step_id"));return o===null?s.notFound():KT(s)?s.html(`<pre>${v(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=>WT(s,t.dal,o=>{let i=ET(o);return B(s,i,a=>pe(["role","text"],a.map(l=>[v(l.role),v(l.text)])))})),e.get("/api/external-objects",s=>B(s,Qh(t.dal,{type:s.req.query("type")}),H1)),e.get("/api/external-signals",s=>B(s,eg(t.dal,{unhandled:s.req.query("unhandled")==="true"}),J1)),e.get("/api/attentions",s=>B(s,fr(t.dal,{unacked:s.req.query("unacked")==="true"}),X1)),e.post("/api/attentions/:id/ack",s=>{let o=t.dal.acknowledgeAttention(te(s,"id"));return o===null?s.notFound():B(s,o,i=>`<p>acknowledged attention ${v(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=Ti(t.dal,l);return B(s,c,u=>`<h1>Escalations</h1>${pe(["attention_id","project","run","workflow","state","prompt"],u.map(d=>[v(d.attention_id),v(d.project),v(d.run_id),v(d.workflow_name),v(d.state_name),v((d.prompt??"").slice(0,120))]))}`)}),e.get("/api/escalations/:id",s=>{let o=Rt(t.dal,te(s,"id"));return o===null?s.notFound():B(s,o,fe)}),e.post("/api/escalations/:id/respond",async s=>{let o=te(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=Rt(t.dal,o);if(c===null)return s.notFound();let u=fr(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);Xa(t.daemon);let p=fr(t.dal).find(_=>_.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 Xa(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=Vh(t.dal,{status:i,pr_url:o});return B(s,a,G1)}),e.get("/api/submitted-prs/:id",s=>{let o=te(s,"id"),i=Yh(t.dal,o);return i===null?s.notFound():B(s,i,K1)}),e.get("/api/sessions",s=>B(s,t.dal.latestSessionSizes(),HT)),e.get("/api/sessions/:team_name/:alias/history",s=>{let o=vs(s.req.param("team_name"));return B(s,t.dal.sessionSizeHistory(o,s.req.param("alias")),HT)}),e.post("/api/sessions/:team_name/:alias/compact",async s=>{let o=vs(s.req.param("team_name"));try{let i=await Uh(t.dal,o,s.req.param("alias"));return B(s,i,a=>JT("compacted",a.row))}catch(i){if(i instanceof Ss)return s.text(i.message,409);throw i}}),e.post("/api/sessions/:team_name/:alias/refresh",async s=>{let o=vs(s.req.param("team_name")),i=await wu(t.dal,o,s.req.param("alias"));return B(s,i,a=>JT(`refreshed ${a.sessionid}`,a.row))}),e.get("/api/intake/state",s=>B(s,r,XT)),e.post("/api/intake/scan",async s=>(r=await Rn(t.dal),B(s,r,XT))),e.get("/api/stats/run-throughput",s=>B(s,ng(t.dal),V1)),e.get("/api/daemon/state",s=>B(s,t.daemon?.state??null,Y1)),e.post("/api/daemon/cycle",async s=>{if(t.daemon===void 0)return B(s,{disabled:!0},fe);let o=await t.daemon.runCycle();return B(s,{state:t.daemon.state,result:o},fe)}),e.get("/metrics/:project_id",s=>{let o=te(s,"project_id"),i=t.dal.getProject(o);if(i===null)return s.notFound();let a=Iu(t.dal,o),l=Nu(t.dal,{project_id:o});return s.html($e(`Metrics \u2014 ${i.name}`,z1(i.name,a,l)))}),e.get("/api/metrics/reviewer/:project_id",s=>{let o=te(s,"project_id");if(t.dal.getProject(o)===null)return s.notFound();let i=af(s,"since_days");return s.json(Iu(t.dal,o,i))}),e.get("/api/metrics/tools/:project_id",s=>{let o=te(s,"project_id");if(t.dal.getProject(o)===null)return s.notFound();let i=af(s,"since_days");return s.json(Nu(t.dal,{project_id:o,since_days:i}))}),e.post("/api/drift/:id/ack",s=>{let o=t.dal.acknowledgeDriftSignal(te(s,"id"));return o===null?s.notFound():s.json({id:o.id,acknowledged_at:o.acknowledged_at})}),e}function WT(t,e,r){let n=ku(e,te(t,"id"),te(t,"step_id"));return n===null?t.notFound():r(n)}function Xa(t){t!==void 0&&t.runCycle().catch(()=>{})}function B(t,e,r,n=200){return KT(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 KT(t){let e=t.req.header("accept")??"";return e.includes("text/html")&&!e.includes("application/json")}function k1(){let t=process.env.LMCTL_WEBUI_DIST;if(t!==void 0)return Ja(`${t}/index.html`)?lf(t):null;let e="src/serve/webui-dist";if(Ja(`${e}/index.html`))return e;let r="dist/serve/webui-dist";if(Ja(`${r}/index.html`))return r;let n=T1(y1(S1(import.meta.url)),"webui-dist");return Ja(`${n}/index.html`)?lf(n):null}function lf(t){if(!E1(t))return t;let e=b1(process.cwd(),t);return e.length===0?".":e}function I1(){return async(t,e)=>{await e(),t.header("Cache-Control","no-store")}}function te(t,e){return Number(t.req.param(e))}function af(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 N1(t){switch(w1(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 x1(t){return!!(t.startsWith("text/")||t.startsWith("application/json")||t.startsWith("application/xml"))}async function Un(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 A1(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 BT(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 L1(t){if(t!=null)return typeof t=="string"&&VT.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function $1(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 O1(t){return`<h1>Status</h1><div class="grid">
|
|
2079
|
+
`))),e.post("/login",async s=>{let o=await s.req.parseBody(),i=typeof o.token=="string"?o.token:"";return Fy(i)?(_d(s,i),s.redirect("/",302)):s.html($e("Login","<p>Invalid token</p>"),401)}),e.post("/logout",s=>(Uy(s),s.redirect("/login",302))),DE(e,{dal:t.dal}),$T(e,{dal:t.dal}),eT(e,{dal:t.dal}),dT(e,{terminalSessionManager:t.terminalSessionManager}),gT(e,{persistentSessionManager:t.persistentSessionManager}),e.post("/api/teams/:team_name/refresh",async s=>{let o=vs(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 wu(t.dal,o,f.alias),t.dal.setMemberState(f.id,"idle",null),u.push(f.alias)}catch(m){let p=m instanceof Error?m.message:String(m);t.dal.setMemberState(f.id,"attention_needed",`refresh failed: ${p}`),d.push({alias:f.alias,error:p})}return B(s,{team:o,seeded:u,failed:d},f=>`<p>refreshed team ${v(f.team)}: seeded [${f.seeded.map(m=>v(m)).join(", ")}]${f.failed.length>0?` failed [${f.failed.map(m=>`${v(m.alias)}: ${v(m.error)}`).join(", ")}]`:""}</p>`)}),Gy(e,{dal:t.dal}),ew(e,{dal:t.dal}),e.get("/api/status",s=>B(s,gi(t.dal),O1)),e.get("/api/projects",s=>B(s,yi(t.dal),j1)),e.get("/api/teams",s=>B(s,Gh(t.dal),D1)),e.get("/api/workflows",s=>B(s,wi(t.dal),P1)),e.get("/api/workflows/verify",s=>{let o=TE();return s.req.header("accept")?.includes("text/plain")?s.text(SE(o)):s.json(o)}),e.get("/api/jobs",s=>B(s,Kh(t.dal,{status:s.req.query("status")}),F1)),e.post("/api/uploads",s=>FT(s,t.dal)),e.get("/api/jobs/:id",s=>{let o=Ei(t.dal,te(s,"id"));return o===null?s.notFound():B(s,o,fe)}),e.post("/api/jobs",async s=>{let o;try{o=await s.req.json()}catch{return s.text("invalid JSON body",400)}let i=null;if(typeof o.project_id=="number")i=o.project_id;else if(typeof o.project=="string"){let f=t.dal.findProjectByName(o.project);if(f===null)return s.text(`project not found: ${o.project}`,404);i=f.id}else{let f=t.dal.listProjects();f.length===1&&(i=f[0].id)}if(i===null)return s.text("missing project or project_id",400);let a=typeof o.workflow_id_override=="number"?o.workflow_id_override:null;if(a===null&&typeof o.workflow=="string"){let f=t.dal.getWorkflowByName(o.workflow);if(f===null)return s.text(`workflow not found: ${o.workflow}`,404);a=f.id}let l=typeof o.source=="string"?o.source:"manual",c=o.payload,u=c==null?null:typeof c=="string"?c:JSON.stringify(c),d=t.dal.enqueueJob({project_id:i,workflow_id_override:a,source:l,source_ref:typeof o.source_ref=="string"?o.source_ref:null,payload:u,priority:typeof o.priority=="number"?o.priority:0,dedupe_key:typeof o.dedupe_key=="string"?o.dedupe_key:null});return B(s,d,fe)}),e.post("/api/jobs/:id/run",async s=>{let{runJobById:o}=await Promise.resolve().then(()=>(Vs(),OE)),i=Ei(t.dal,te(s,"id"));if(i===null)return s.notFound();let a=await o({dal:t.dal,worker_id:`api-job-run-${process.pid}-${Date.now()}`,job_id:i.id});return a.claimed?s.json({job_id:a.job_id,run_id:a.run_id,status:a.status,terminal_state:a.terminal_state,ms:a.ms}):s.json(a,409)}),e.get("/api/workflows/:name",s=>{let o=t.dal.getWorkflowByName(s.req.param("name"));return o===null?s.notFound():B(s,o,fe)}),e.get("/api/projects/:name/workflows",s=>{let o=t.dal.findProjectByName(s.req.param("name"));return o===null?s.notFound():B(s,t.dal.listProjectWorkflows(o.id),C1)}),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 Un(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{hr(u)}catch{return s.text("invalid condition",400)}let d=x1(i.parameters_override??i.params);if(typeof d=="string"&&d.startsWith("error:"))return s.text(d.slice(6),400);let f=typeof i.priority=="number"&&Number.isInteger(i.priority)?i.priority:100,m=t.dal.insertProjectWorkflow({project_id:o.id,workflow_id:c.id,condition:u,parameters_override:d,priority:f});return B(s,m,fe)}),e.get("/api/projects/workflows/:id",s=>{let o=t.dal.getProjectWorkflow(te(s,"id"));return o===null?s.notFound():B(s,o,fe)}),e.delete("/api/projects/workflows/:id",s=>t.dal.removeProjectWorkflow(te(s,"id"))?B(s,{removed:!0},fe):s.notFound()),e.post("/api/projects/workflows/:id/enable",s=>{let o=t.dal.setProjectWorkflowEnabled(te(s,"id"),!0);return o===null?s.notFound():B(s,o,fe)}),e.post("/api/projects/workflows/:id/disable",s=>{let o=t.dal.setProjectWorkflowEnabled(te(s,"id"),!1);return o===null?s.notFound():B(s,o,fe)}),e.get("/api/projects/:name/issues",s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=BT(s.req.query("status"),R1);if(typeof i=="string")return s.text(i,400);let a=BT(s.req.query("severity"),VT);return typeof a=="string"?s.text(a,400):B(s,t.dal.listIssues(o.id,{...i!==void 0?{status:i}:{},...a!==void 0?{severity:a}:{},...s.req.query("ai_test_path")!==void 0?{ai_test_path:s.req.query("ai_test_path")}:{}}),M1)}),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 Un(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=L1(i.severity);if(typeof c=="object")return s.text(c.error,400);let u=$1(i.labels);if(typeof u=="string"&&u.startsWith("error:"))return s.text(u.slice(6),400);let d=t.dal.createIssue({project_id:o.id,title:a,body:l,...c!==void 0?{severity:c}:{},labels:u,ai_test_path:typeof i.ai_test_path=="string"?i.ai_test_path:null,source_run_id:typeof i.source_run_id=="number"?i.source_run_id:null});return B(s,d,fe)}),e.get("/api/issues/:id",s=>{let o=t.dal.getIssue(te(s,"id"));return o===null?s.notFound():B(s,o,fe)}),e.post("/api/issues/:id/claim",async s=>{let o=te(s,"id"),i=t.dal.getIssue(o);if(i===null)return s.notFound();let a=await Un(s);if(typeof a=="string")return s.json({error:a},400);let l=typeof a.assigned_run_id=="number"?a.assigned_run_id:null;if(l===null)return s.json({error:"missing assigned_run_id"},400);let c=t.dal.claimIssue(o,l);return c===null?s.json({error:`issue ${o} is not in a claimable state (status=${i.status})`},400):B(s,c,fe)}),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 Un(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.assigned_run_id=="number"?i.assigned_run_id:null;if(a===null)return s.json({error:"missing assigned_run_id"},400);let l=t.dal.claimNextIssue(o.id,a);return l===null?s.json({status:"queue_empty"},404):B(s,l,fe)}),e.post("/api/issues/:id/close",async s=>{let o=t.dal.getIssue(te(s,"id"));if(o===null)return s.notFound();let i=await Un(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.closed_run_id=="number"?i.closed_run_id:o.assigned_run_id;if(a===null)return s.json({error:"missing closed_run_id"},400);try{return B(s,t.dal.closeIssue(te(s,"id"),a,typeof i.commit_hash=="string"?i.commit_hash:null),fe)}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(te(s,"id"));if(o===null)return s.notFound();let i=await Un(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.source_run_id=="number"?i.source_run_id:o.closed_run_id??o.source_run_id;if(a===null)return s.json({error:"missing source_run_id"},400);try{return B(s,t.dal.reopenIssue(te(s,"id"),a),fe)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.get("/api/projects/:name",s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=o.name.indexOf("/"),a=i>0?o.name.slice(0,i):null,l=i>0?o.name.slice(i+1):o.name;return B(s,{...o,owner:a,repo:l},fe)}),e.get("/api/runs/:run_id/artifacts",s=>{let o=te(s,"run_id"),i=s.req.query("kind"),a=Dr(t.dal,o,i);return B(s,a,fe)}),e.get("/api/runs/:run_id/artifacts/:kind",async s=>{let o=te(s,"run_id"),i=s.req.param("kind"),a=Dr(t.dal,o,i);if(a.length===0)return s.notFound();let l=a[a.length-1],c=s.req.query("raw")==="true";if(l.content!==null&&l.content!==void 0)return c?s.text(l.content):B(s,l,fe);if(l.path!==null&&l.path!==void 0){if(c)try{let{readFileSync:u}=await import("node:fs"),d=N1(l.path);if(A1(d)){let _=u(l.path,"utf8");return s.body(_,200,{"Content-Type":d})}let f=u(l.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength),p=g1(l.path);return s.body(m,200,{"Content-Type":d,"Content-Disposition":`attachment; filename="${p}"`})}catch(u){return s.text(`failed to read artifact path: ${u.message}`,500)}return B(s,l,fe)}return B(s,l,fe)}),e.get("/api/runs",s=>B(s,mn(t.dal,{limit:af(s,"limit")??100}),U1)),e.get("/api/runs/:id",s=>{let o=Mr(t.dal,te(s,"id"));return o===null?s.notFound():B(s,o,W1)}),e.get("/api/runs/:id/where",s=>{let o=pn(t.dal,te(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(bi(o)):s.json(o)}),e.get("/api/runs/:id/timeline",s=>{let o=Si(t.dal,te(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(vi(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(te(s,"id"),o);return!i.resumed&&i.reason==="run_not_found"?s.notFound():i.resumed?(Xa(t.daemon),B(s,i,qT)):B(s,i,qT,400)}),e.post("/api/interactive/:step_id/respond",async s=>{let o=te(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?(Xa(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=>WT(s,t.dal,o=>B(s,o,q1))),e.get("/api/runs/:id/steps/:step_id/transcript",s=>{let o=Zh(t.dal,te(s,"id"),te(s,"step_id"));return o===null?s.notFound():KT(s)?s.html(`<pre>${v(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=>WT(s,t.dal,o=>{let i=ET(o);return B(s,i,a=>pe(["role","text"],a.map(l=>[v(l.role),v(l.text)])))})),e.get("/api/external-objects",s=>B(s,Qh(t.dal,{type:s.req.query("type")}),H1)),e.get("/api/external-signals",s=>B(s,eg(t.dal,{unhandled:s.req.query("unhandled")==="true"}),J1)),e.get("/api/attentions",s=>B(s,fr(t.dal,{unacked:s.req.query("unacked")==="true"}),X1)),e.post("/api/attentions/:id/ack",s=>{let o=t.dal.acknowledgeAttention(te(s,"id"));return o===null?s.notFound():B(s,o,i=>`<p>acknowledged attention ${v(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=Ti(t.dal,l);return B(s,c,u=>`<h1>Escalations</h1>${pe(["attention_id","project","run","workflow","state","prompt"],u.map(d=>[v(d.attention_id),v(d.project),v(d.run_id),v(d.workflow_name),v(d.state_name),v((d.prompt??"").slice(0,120))]))}`)}),e.get("/api/escalations/:id",s=>{let o=Rt(t.dal,te(s,"id"));return o===null?s.notFound():B(s,o,fe)}),e.post("/api/escalations/:id/respond",async s=>{let o=te(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=Rt(t.dal,o);if(c===null)return s.notFound();let u=fr(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);Xa(t.daemon);let p=fr(t.dal).find(_=>_.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 Xa(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=Vh(t.dal,{status:i,pr_url:o});return B(s,a,G1)}),e.get("/api/submitted-prs/:id",s=>{let o=te(s,"id"),i=Yh(t.dal,o);return i===null?s.notFound():B(s,i,K1)}),e.get("/api/sessions",s=>B(s,t.dal.latestSessionSizes(),HT)),e.get("/api/sessions/:team_name/:alias/history",s=>{let o=vs(s.req.param("team_name"));return B(s,t.dal.sessionSizeHistory(o,s.req.param("alias")),HT)}),e.post("/api/sessions/:team_name/:alias/compact",async s=>{let o=vs(s.req.param("team_name"));try{let i=await Uh(t.dal,o,s.req.param("alias"));return B(s,i,a=>JT("compacted",a.row))}catch(i){if(i instanceof Ss)return s.text(i.message,409);throw i}}),e.post("/api/sessions/:team_name/:alias/refresh",async s=>{let o=vs(s.req.param("team_name")),i=await wu(t.dal,o,s.req.param("alias"));return B(s,i,a=>JT(`refreshed ${a.sessionid}`,a.row))}),e.get("/api/intake/state",s=>B(s,r,XT)),e.post("/api/intake/scan",async s=>(r=await Rn(t.dal),B(s,r,XT))),e.get("/api/stats/run-throughput",s=>B(s,ng(t.dal),V1)),e.get("/api/daemon/state",s=>B(s,t.daemon?.state??null,Y1)),e.post("/api/daemon/cycle",async s=>{if(t.daemon===void 0)return B(s,{disabled:!0},fe);let o=await t.daemon.runCycle();return B(s,{state:t.daemon.state,result:o},fe)}),e.get("/metrics/:project_id",s=>{let o=te(s,"project_id"),i=t.dal.getProject(o);if(i===null)return s.notFound();let a=Iu(t.dal,o),l=Nu(t.dal,{project_id:o});return s.html($e(`Metrics \u2014 ${i.name}`,z1(i.name,a,l)))}),e.get("/api/metrics/reviewer/:project_id",s=>{let o=te(s,"project_id");if(t.dal.getProject(o)===null)return s.notFound();let i=af(s,"since_days");return s.json(Iu(t.dal,o,i))}),e.get("/api/metrics/tools/:project_id",s=>{let o=te(s,"project_id");if(t.dal.getProject(o)===null)return s.notFound();let i=af(s,"since_days");return s.json(Nu(t.dal,{project_id:o,since_days:i}))}),e.post("/api/drift/:id/ack",s=>{let o=t.dal.acknowledgeDriftSignal(te(s,"id"));return o===null?s.notFound():s.json({id:o.id,acknowledged_at:o.acknowledged_at})}),e}function WT(t,e,r){let n=ku(e,te(t,"id"),te(t,"step_id"));return n===null?t.notFound():r(n)}function Xa(t){t!==void 0&&t.runCycle().catch(()=>{})}function B(t,e,r,n=200){return KT(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 KT(t){let e=t.req.header("accept")??"";return e.includes("text/html")&&!e.includes("application/json")}function k1(){let t=process.env.LMCTL_WEBUI_DIST;if(t!==void 0)return Ja(`${t}/index.html`)?lf(t):null;let e="src/serve/webui-dist";if(Ja(`${e}/index.html`))return e;let r="dist/serve/webui-dist";if(Ja(`${r}/index.html`))return r;let n=T1(y1(S1(import.meta.url)),"webui-dist");return Ja(`${n}/index.html`)?lf(n):null}function lf(t){if(!E1(t))return t;let e=b1(process.cwd(),t);return e.length===0?".":e}function I1(){return async(t,e)=>{await e(),t.header("Cache-Control","no-store")}}function te(t,e){return Number(t.req.param(e))}function af(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 N1(t){switch(w1(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 A1(t){return!!(t.startsWith("text/")||t.startsWith("application/json")||t.startsWith("application/xml"))}async function Un(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 x1(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 BT(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 L1(t){if(t!=null)return typeof t=="string"&&VT.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function $1(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 O1(t){return`<h1>Status</h1><div class="grid">
|
|
2080
2080
|
<div class="metric"><strong>${t.jobs.queued}</strong><br>queued jobs</div>
|
|
2081
2081
|
<div class="metric"><strong>${t.jobs.done}</strong><br>done jobs</div>
|
|
2082
2082
|
<div class="metric"><strong>${t.runs.active}</strong><br>active runs</div>
|
|
@@ -2125,14 +2125,14 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
|
|
|
2125
2125
|
WHERE j.project_id = ?
|
|
2126
2126
|
AND r.terminal_state IS NOT NULL
|
|
2127
2127
|
ORDER BY r.id DESC
|
|
2128
|
-
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,tU).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,QT)||t.insertDriftSignal({team_member_id:a.id,project_id:r.id,signal_kind:QT,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 eb(t){for(let e of nU)try{e(t)}catch{}}var tU,QT,nU,tb=b(()=>{"use strict";tU="request_changes",QT="reviewer_rejection_rate_high";nU=[rU]});function zs(){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 rb(t){let e=t.intervalMs??zs(),r=t.runOnceFn??qr,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??zT)(t.dal));let c=f=>{n.running&&(s=setTimeout(()=>{d.runCycle().finally(()=>c(e))},f))},u=f=>{n.running&&(o=setTimeout(()=>{a===null&&(a=nb(t.dal,t.monitorSessionActivityFn??Eu,e,n).finally(()=>{a=null})),a.finally(()=>u(Tu(t.dal,e)))},f))},d={state:n,runCycle:async()=>(i!==null||(i=sU(t.dal,r,t.collectSessionSizesFn??Fh,t.scanIntakeFn??Rn,t.monitorSessionActivityFn??Eu,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 sU(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(NE({dal:t}),eb({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 nb(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 nb(t,e,r,n){let s=Tu(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 cf=b(()=>{"use strict";aa();Vs();Pd();mi();ZT();tb();bu()});function sb(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 ob=b(()=>{"use strict"});import{mkdirSync as oU,readFileSync as iU,readdirSync as aU,statSync as lU,writeFileSync as cU}from"node:fs";import{dirname as uU,join as ab,sep as ib}from"node:path";function Ga(t){return{s3:{async send(n){let s=n;switch(s._localfsTag){case lb:return dU(t,s.input);case cb:return fU(t,s.input);case ub:return mU(t,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:ff,GetObjectCommand:df,PutObjectCommand:uf}}}function dU(t,e){let r=db(t,e.Key);return oU(uU(r),{recursive:!0}),cU(r,e.Body),{}}function fU(t,e){let r=db(t,e.Key),n;try{n=iU(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 mU(t,e){let r=e.Prefix??"";fb(r);let s=pU(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 db(t,e){return fb(e),ab(t,e)}function fb(t){if(t.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${t}`)}function pU(t){let e=[],r=(n,s)=>{let o;try{o=aU(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=ab(n,i.name);if(i.isDirectory())r(l,a);else if(i.isFile()){let c=ib==="/"?a:a.split(ib).join("/");e.push({key:c,lastModified:lU(l).mtime})}}};return r(t,""),e}var lb,cb,ub,uf,df,ff,mf=b(()=>{"use strict";lb="localfs-put",cb="localfs-get",ub="localfs-list",uf=class{input;_localfsTag=lb;constructor(e){this.input=e}},df=class{input;_localfsTag=cb;constructor(e){this.input=e}},ff=class{input;_localfsTag=ub;constructor(e){this.input=e}}});function mb(){return{put:0,get:0,list:0}}function pf(t,e=_U){return t.put*e.putUsd+t.get*e.getUsd+t.list*e.listUsd}function _f(t){let e=new Date(t),r=e.getUTCFullYear(),n=String(e.getUTCMonth()+1).padStart(2,"0");return`${r}-${n}`}var _U,Ka,hf=b(()=>{"use strict";_U={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};Ka=class{counts=mb();record(e,r=1){this.counts[e]+=r}peek(){return{...this.counts}}drain(){let e={...this.counts};return this.counts=mb(),e}estimateCostUsd(e){return pf(this.counts,e)}}});function pb(t){let e=t.now??Date.now,r=t.timers??hU,n=null,s=null;async function o(){let l=e(),c=_f(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(_){t.log?.(`[usage] publish rollup failed: ${_ instanceof Error?_.message:String(_)}`)}let m=f;if(t.readUserTotal!==void 0)try{m=await t.readUserTotal(c)}catch(_){t.log?.(`[usage] read user total failed: ${_ instanceof Error?_.message:String(_)}`),m=f}let p=pf(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(_){t.log?.(`[usage] onQuotaExceeded threw: ${_ instanceof Error?_.message:String(_)}`)}}}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===_f(e())}}}var hU,_b=b(()=>{"use strict";hf();hU={setInterval:(t,e)=>setInterval(t,e),clearInterval:t=>clearInterval(t)}});var gf=b(()=>{"use strict";La();Oa();Oa()});function gU(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 yU(t){return t.reply_to!==void 0&&t.response!==void 0}function wU(t){if(typeof t!="object"||t===null)return;let e=t.conversation_id;return typeof e=="string"?e:void 0}function hb(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 Va,Zs,gb=b(()=>{"use strict";gf();Va=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(e="MailboxFetchClient stopped before a response arrived"){super(e)}},Zs=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 Va("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=Zt(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(hb(c));return}u=()=>{this.pending.has(s)&&(this.pending.delete(s),l(hb(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 Va;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=gU(e);if(n===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(yU(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??wU(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:Zt(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 yf(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 yb=b(()=>{"use strict"});function wf(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 wb=b(()=>{"use strict"});function Tf(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===""||r.sender_teamfile!==null&&(typeof r.sender_teamfile!="string"||r.sender_teamfile==="")||r.sender_alias!==null&&(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 Ef,Eb=b(()=>{"use strict";Ef="daemon:events"});function bb(t){return{kind:"prompt",prompt_id:t.prompt_id??Zt(t.now?.()??Date.now(),t.random??Math.random),root_teamfile:t.root_teamfile,text:t.text}}function bf(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 Tb,Sf=b(()=>{"use strict";gf();Tb="prompt:root"});function Qs(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(vb(e[1]));return typeof r.sub=="string"&&r.sub!==""?r.sub:null}catch{return null}}function EU(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(vb(e[1]));return typeof r.exp=="number"&&Number.isFinite(r.exp)?r.exp:null}catch{return null}}function Sb(t,e=60){if(typeof t!="string"||t==="")return!0;let r=EU(t);return r===null?!0:Date.now()/1e3>=r-e}function vb(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 vf=b(()=>{"use strict"});async function Ya(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":TU},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 TU,kf=b(()=>{"use strict";TU="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as kb,mkdirSync as Ib,readFileSync as Nb,writeFileSync as xb}from"node:fs";import{homedir as Ab}from"node:os";import{dirname as Rb,join as Lb}from"node:path";function eo(){return process.env.LMCTL_DEVICE_AUTH_PATH??Lb(Ab(),".lmctl","device-auth.json")}function $b(){return process.env.LMCTL_TOKEN_PATH??Lb(Ab(),".lmctl","cli-tokens.json")}function If(t=eo()){try{let e=JSON.parse(Nb(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 Ob(t,e=eo()){Ib(Rb(e),{recursive:!0,mode:448}),xb(e,JSON.stringify(t,null,2));try{kb(e,384)}catch{}}function Nf(t,e=$b()){let r={};try{r=JSON.parse(Nb(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};Ib(Rb(e),{recursive:!0,mode:448}),xb(e,JSON.stringify(s,null,2));try{kb(e,384)}catch{}}async function jb(t){let e=t.deviceAuthPath??eo(),r=If(e);if(r===null)throw new Error("device_auth_not_found: no ~/.lmctl/device-auth.json; run `lmctl device login` first");let n=await Ya({region:t.region,clientId:t.clientId,refreshToken:r.refreshToken,...t.fetchImpl!==void 0?{fetchImpl:t.fetchImpl}:{}});return Nf({idToken:n.idToken,...n.accessToken!==void 0?{accessToken:n.accessToken}:{},refreshToken:r.refreshToken,...n.expiresAt!==void 0?{expiresAt:n.expiresAt}:{}},t.cliTokensPath??$b()),{idToken:n.idToken,userId:r.userId}}var xf=b(()=>{"use strict";kf()});import{existsSync as bU,realpathSync as SU}from"node:fs";import{dirname as vU}from"node:path";function Af(t){kU(t).catch(e=>{t.log?.(`[mailbox] prompt trigger failed: ${e instanceof Error?e.message:String(e)}`)})}async function kU(t){let e=t.payload.root_teamfile;try{e=SU(t.payload.root_teamfile)}catch(s){let o=`prompt root missing/unreadable: ${t.payload.root_teamfile}: ${s instanceof Error?s.message:String(s)}`;return await Wn(t.store,{rootTeamfile:t.payload.root_teamfile,receiverTeamfile:t.payload.root_teamfile,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}}if(t.store.getRootTeam(e)===null){let s=`prompt root is not registered: ${e}`;return await Wn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:s,log:t.log}),t.log?.(`[mailbox] ${s}`),{status:"error",response:null,error_detail:s}}let r=IU(e);if("error"in r)return await Wn(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=nr(t.store,{receiver_teamfile:e,receiver_alias:r.alias,sender_teamfile:`prompt:${t.payload.prompt_id}`,sender_alias:"operator",ttlMs:AU(t.env??process.env)});if(!n.acquired){let s=xU(r.alias,n.current);return await Wn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:null,status:"error",error_detail:s,log:t.log}),t.log?.(`[mailbox] prompt rejected: ${s}`),{status:"error",response:null,error_detail:s}}try{let o=await(t.chat??Ht)({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}:{}}),i=o.status==="stalled",a=!i&&o.text.trim()==="",l=i?`provider stalled${o.stalledAfterMs!==void 0?` after ${o.stalledAfterMs}ms`:""}`:a?"provider returned empty response":null,c=i||a?"error":"ok";return await Wn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:c==="error"?null:o.text,status:c,error_detail:l,log:t.log}),{status:c,response:c==="error"?null:o.text,error_detail:l}}catch(s){let o=s instanceof Error?s.message:String(s);return await Wn(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 provider error: ${o}`),{status:"error",response:null,error_detail:o}}finally{try{t.store.releaseAgentInflight(n.lease)}catch(s){t.log?.(`[mailbox] failed to release prompt in-flight slot: ${s instanceof Error?s.message:String(s)}`)}}}function IU(t){if(!bU(t))return{error:`prompt root missing/unreadable: ${t}`};let e=De(t);if(e.parseErrors.length>0)return{error:`prompt root parse error: ${e.parseErrors.join("; ")}`};let r=et(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??vU(t)}}async function Wn(t,e){let r=Db(e.message),n=e.response===null?null:Db(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,origin:"unknown",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 Db(t){return t.length<=Cb?{text:t,truncated:!1}:{text:t.slice(0,Cb),truncated:!0}}function NU(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function xU(t,e){return e.sender_teamfile.startsWith("prompt:")?`${t} is busy servicing another prompt since ${e.started_at}`:NU(t,e)}function AU(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return Mb;let r=Number(e);return!Number.isFinite(r)||r<=0?Mb:r}var Cb,Mb,Pb=b(()=>{"use strict";xt();vt();es();Cb=256*1024,Mb=30*60*1e3});import{chmodSync as Hb,existsSync as RU,mkdirSync as Jb,readFileSync as el,writeFileSync as Xb}from"node:fs";import{dirname as Rf,resolve as za,join as Gb}from"node:path";import{fileURLToPath as LU}from"node:url";import{homedir as Kb}from"node:os";import{CognitoIdentityClient as $U,GetIdCommand as OU}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as Fb}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as jU,ListObjectsV2Command as CU,PutObjectCommand as MU,S3Client as Ub}from"@aws-sdk/client-s3";function ro(t={}){let e=t.env??process.env,r=t.tfstatePath!==void 0?[t.tfstatePath]:WU(t.selfUrl),n={},s;for(let k of r)if(RU(k)){n=UU(k),s=k;break}let o=(...k)=>{for(let N of k)if(typeof N=="string"&&N!=="")return N},i=o(e.LMCTL_NEXT_IDENTITY_POOL_ID,n.LMCTL_NEXT_IDENTITY_POOL_ID)??DU,a=o(e.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??PU,l=o(e.LMCTL_NEXT_MAILBOX_BUCKET,e.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??FU,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)??tl,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,_=Qa(e.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),g=Qa(e.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),h=Qa(e.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),T=Qa(e.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),w=o(e.LMCTL_MAILBOX_KEY),E=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}:{},..._!==void 0?{readIntervalMs:_}:{},...g!==void 0?{heartbeatIdleMs:g}:{},...h!==void 0?{backoffReadIntervalMs:h}:{},...T!==void 0?{chatLogPollIntervalMs:T}:{},...w!==void 0?{mailboxKey:w}:{},...E!==void 0?{tokenPath:E}:{}},f}function UU(t){try{let e=el(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 WU(t){let e=Rf(LU(t??import.meta.url));return[za(e,"..","..","..","..","infra","terraform","terraform.tfstate"),za(e,"..","..","..","..","..","infra","terraform","terraform.tfstate"),za(e,"..","..","..","infra","terraform","terraform.tfstate"),za(e,"..","..","infra","terraform","terraform.tfstate")]}function Qa(t){if(t===void 0||t==="")return;let e=Number(t);if(!(!Number.isFinite(e)||e<=0))return e*1e3}function BU(t){let e=qU(t.intervalMs)??Vb,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 qU(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}async function Yb(t){let e=t.tokenPath??Gb(Kb(),".lmctl","cli-tokens.json"),r=Bb(t.tokenPath);if(Sb(r.cognito?.idToken)&&If()!==null)try{await jb({region:t.region,clientId:t.cognitoClientId??tl,cliTokensPath:e}),r=Bb(t.tokenPath),t.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(A){let X=A instanceof Error?A.message:String(A);t.log?.(`[mx-mailbox] device-auth refresh failed: ${X}`)}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 qb({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=Fb({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new Ub({region:t.region,credentials:a}),c={ListObjectsV2Command:CU,GetObjectCommand:jU,PutObjectCommand:MU},u=Qs(n),d=u??o,f=t.deviceId,m=Mn({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey}),p=t.cursorStore,_;if(p!==void 0){let A=p.loadMailboxCursor(d,m);if(A!==null)_=A.last_processed_seq??void 0,t.log?.(`[mx-mailbox] resumed seq cursor=${_??"(sentinel)"} for user_id=${d}`);else{let X=!1,U=0;for(;!X&&U<2;){U+=1;try{let I=Aa(m,"web"),x=0,j;do{let J=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:I,MaxKeys:1e3,...j!==void 0?{ContinuationToken:j}:{}}));for(let W of J.Contents??[]){let D=Ra(W.Key??"",m,"web");D!==void 0&&D>x&&(x=D)}j=J.IsTruncated===!0?J.NextContinuationToken:void 0}while(j!==void 0);_=x,t.log?.(`[mx-mailbox] cold start: seeded seq cursor=${x} for user_id=${d}`),X=!0}catch(I){let x=I instanceof Error?I.message:String(I);if(i&&U===1&&XU(I)){t.log?.(`[mx-mailbox] cached identityId rejected by cognito (${x}); clearing + refreshing`),JU(e),i=!1,o=await qb({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}),a=Fb({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new Ub({region:t.region,credentials:a}),m=Mn({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey});continue}t.log?.(`[mx-mailbox] cold start seq probe failed: ${x}`);break}}p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:_??null,last_processed_at:new Date().toISOString()})}}let g=null,h=t.terminalSessionManager,T=t.persistentSessionManager,w=t.promptTriggerStore,E=new Ka,k=new Hr({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:A=>E.record(A),onMessage:async A=>{if(h!==void 0&&yf(A.payload)){h.onInbound(A.payload);return}if(T!==void 0&&wf(A.payload)){await T.onInbound(A.payload);return}if(!Tf(A.payload)){if(w!==void 0&&bf(A.payload)){Af({store:w,payload:A.payload,log:t.log});return}g!==null&&await g.handleIncoming(A.payload,A)}},...p!==void 0?{onCursorAdvance:A=>{p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:A,last_processed_at:new Date().toISOString()})}}:{},..._!==void 0?{cursor:_}:{},...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 Zs({client:k,...t.log!==void 0?{log:t.log}:{}}),h!==void 0&&h.setPublish(async A=>k.putMessage({conversation_id:`terminal:${A.session_id}`,payload:A})),T!==void 0&&T.setPublish(async A=>k.putMessage({conversation_id:`provider:${A.session_id}`,payload:A}));let N=A=>k.putMessage({conversation_id:Ef,payload:A});k.start();let H=t.chatLogTailStore===void 0?void 0:BU({store:t.chatLogTailStore,publishDaemonEvent:N,cursorKey:m,intervalMs:t.chatLogPollIntervalMs??t.readIntervalMs??t.pollIntervalMs??Vb,log:t.log});t.log?.(`[mx-mailbox] agent polling ${m} (bucket=${t.mailboxBucket})`);let ne=t.deviceId??o,q=`${d}/usage/`,O;return O=t.usageStore===void 0?void 0:pb({meter:E,store:t.usageStore,userId:d,deviceId:ne,ceilingUsd:t.usageQuotaUsd??1/0,onQuotaExceeded:({period:A,costUsd:X,ceilingUsd:U})=>{t.log?.(`[usage] month ${A} cost $${X.toFixed(4)} >= ceiling $${U} \u2014 blocking mailbox`),k.stop().catch(()=>{}),O?.stop()},publishOwnRollup:async(A,X)=>{await l.send(new c.PutObjectCommand({Bucket:t.mailboxBucket,Key:`${q}${ne}-${A}.json`,Body:JSON.stringify({...X,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async A=>{let X={put:0,get:0,list:0},U;do{let I=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:q,MaxKeys:1e3,...U!==void 0?{ContinuationToken:U}:{}}));for(let x of I.Contents??[]){let j=x.Key??"";if(j.endsWith(`-${A}.json`))try{let J=await l.send(new c.GetObjectCommand({Bucket:t.mailboxBucket,Key:j}));if(J.Body===void 0)continue;let W=JSON.parse(await J.Body.transformToString("utf-8"));X.put+=W.put??0,X.get+=W.get??0,X.list+=W.list??0}catch{}}U=I.IsTruncated===!0?I.NextContinuationToken:void 0}while(U!==void 0);return X},intervalMs:t.usageFlushIntervalMs??36e5,...t.log!==void 0?{log:t.log}:{}}),{identityId:o,mailbox:k,fetchClient:g,publishDaemonEvent:N,async stop(){H?.stop(),O!==void 0&&(await O.flushNow().catch(()=>{}),O.stop()),await g.stop().catch(()=>{}),await k.stop().catch(()=>{})}}}async function zb(t){let e=t.s3!==void 0&&t.commands!==void 0?{s3:t.s3,commands:t.commands}:Ga(t.rootDir),r=Mn({identityId:to,userId:to,deviceId:Wb}),n=null,s=t.terminalSessionManager,o=t.persistentSessionManager,i=t.promptTriggerStore,a=new Hr({bucket:"local",identityId:to,userId:to,deviceId:Wb,s3:e.s3,commands:e.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&yf(c.payload)){s.onInbound(c.payload);return}if(o!==void 0&&wf(c.payload)){await o.onInbound(c.payload);return}if(!Tf(c.payload)){if(i!==void 0&&bf(c.payload)){Af({store:i,payload:c.payload,log:t.log});return}n!==null&&await n.handleIncoming(c.payload,c)}},pollIntervalMs:t.pollIntervalMs??Za,readIntervalMs:t.readIntervalMs??Za,heartbeatIdleMs:t.heartbeatIdleMs??Za,backoffReadIntervalMs:t.backoffReadIntervalMs??Za});n=new Zs({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:Ef,payload:c});return a.start(),t.log?.(`[local-webui] agent polling ${r} (local-fs ${t.rootDir})`),{identityId:to,mailbox:a,fetchClient:n,publishDaemonEvent:l,async stop(){await n.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function Bb(t){let e=t??Gb(Kb(),".lmctl","cli-tokens.json");try{let r=el(e,"utf8");return JSON.parse(r)}catch{return{}}}function HU(t,e){if(e===void 0||e==="")return;let r={};try{let s=el(t,"utf8");r=JSON.parse(s)}catch{}if(r.cognito===void 0)return;let n={...r,cognito:{...r.cognito,identityId:e}};Jb(Rf(t),{recursive:!0,mode:448}),Xb(t,JSON.stringify(n,null,2));try{Hb(t,384)}catch{}}function JU(t){let e={};try{let n=el(t,"utf8");e=JSON.parse(n)}catch{return}if(e.cognito===void 0)return;let r={...e,cognito:{...e.cognito}};delete r.cognito.identityId,Jb(Rf(t),{recursive:!0,mode:448}),Xb(t,JSON.stringify(r,null,2));try{Hb(t,384)}catch{}}async function qb(t){t.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new $U({region:t.region}).send(new OU({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{HU(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 XU(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 Vb,Za,tl,DU,PU,FU,to,Wb,Lf=b(()=>{"use strict";ja();mf();hf();_b();gb();yb();wb();Eb();Sf();La();vf();xf();Pb();Vb=3e3,Za=1e3,tl="79u5jhkk46qofog661c9i0bdcs",DU="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",PU="us-east-1_4iUdFggDn",FU="lmctl-next-preview-mailbox-254332045686";to="local",Wb="local"});import{spawn as Cf}from"node:child_process";import{createInterface as Zb}from"node:readline";var $f,Of,jf,Qb,eS=b(()=>{"use strict";Ho();ve();$f=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=Cf(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=Zb({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+`
|
|
2128
|
+
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,tU).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,QT)||t.insertDriftSignal({team_member_id:a.id,project_id:r.id,signal_kind:QT,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 eb(t){for(let e of nU)try{e(t)}catch{}}var tU,QT,nU,tb=b(()=>{"use strict";tU="request_changes",QT="reviewer_rejection_rate_high";nU=[rU]});function zs(){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 rb(t){let e=t.intervalMs??zs(),r=t.runOnceFn??qr,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??zT)(t.dal));let c=f=>{n.running&&(s=setTimeout(()=>{d.runCycle().finally(()=>c(e))},f))},u=f=>{n.running&&(o=setTimeout(()=>{a===null&&(a=nb(t.dal,t.monitorSessionActivityFn??Eu,e,n).finally(()=>{a=null})),a.finally(()=>u(Tu(t.dal,e)))},f))},d={state:n,runCycle:async()=>(i!==null||(i=sU(t.dal,r,t.collectSessionSizesFn??Fh,t.scanIntakeFn??Rn,t.monitorSessionActivityFn??Eu,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 sU(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(NE({dal:t}),eb({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 nb(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 nb(t,e,r,n){let s=Tu(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 cf=b(()=>{"use strict";aa();Vs();Pd();mi();ZT();tb();bu()});function sb(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 ob=b(()=>{"use strict"});import{mkdirSync as oU,readFileSync as iU,readdirSync as aU,statSync as lU,writeFileSync as cU}from"node:fs";import{dirname as uU,join as ab,sep as ib}from"node:path";function Ga(t){return{s3:{async send(n){let s=n;switch(s._localfsTag){case lb:return dU(t,s.input);case cb:return fU(t,s.input);case ub:return mU(t,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:ff,GetObjectCommand:df,PutObjectCommand:uf}}}function dU(t,e){let r=db(t,e.Key);return oU(uU(r),{recursive:!0}),cU(r,e.Body),{}}function fU(t,e){let r=db(t,e.Key),n;try{n=iU(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 mU(t,e){let r=e.Prefix??"";fb(r);let s=pU(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 db(t,e){return fb(e),ab(t,e)}function fb(t){if(t.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${t}`)}function pU(t){let e=[],r=(n,s)=>{let o;try{o=aU(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=ab(n,i.name);if(i.isDirectory())r(l,a);else if(i.isFile()){let c=ib==="/"?a:a.split(ib).join("/");e.push({key:c,lastModified:lU(l).mtime})}}};return r(t,""),e}var lb,cb,ub,uf,df,ff,mf=b(()=>{"use strict";lb="localfs-put",cb="localfs-get",ub="localfs-list",uf=class{input;_localfsTag=lb;constructor(e){this.input=e}},df=class{input;_localfsTag=cb;constructor(e){this.input=e}},ff=class{input;_localfsTag=ub;constructor(e){this.input=e}}});function mb(){return{put:0,get:0,list:0}}function pf(t,e=_U){return t.put*e.putUsd+t.get*e.getUsd+t.list*e.listUsd}function _f(t){let e=new Date(t),r=e.getUTCFullYear(),n=String(e.getUTCMonth()+1).padStart(2,"0");return`${r}-${n}`}var _U,Ka,hf=b(()=>{"use strict";_U={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};Ka=class{counts=mb();record(e,r=1){this.counts[e]+=r}peek(){return{...this.counts}}drain(){let e={...this.counts};return this.counts=mb(),e}estimateCostUsd(e){return pf(this.counts,e)}}});function pb(t){let e=t.now??Date.now,r=t.timers??hU,n=null,s=null;async function o(){let l=e(),c=_f(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(_){t.log?.(`[usage] publish rollup failed: ${_ instanceof Error?_.message:String(_)}`)}let m=f;if(t.readUserTotal!==void 0)try{m=await t.readUserTotal(c)}catch(_){t.log?.(`[usage] read user total failed: ${_ instanceof Error?_.message:String(_)}`),m=f}let p=pf(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(_){t.log?.(`[usage] onQuotaExceeded threw: ${_ instanceof Error?_.message:String(_)}`)}}}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===_f(e())}}}var hU,_b=b(()=>{"use strict";hf();hU={setInterval:(t,e)=>setInterval(t,e),clearInterval:t=>clearInterval(t)}});var gf=b(()=>{"use strict";La();Oa();Oa()});function gU(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 yU(t){return t.reply_to!==void 0&&t.response!==void 0}function wU(t){if(typeof t!="object"||t===null)return;let e=t.conversation_id;return typeof e=="string"?e:void 0}function hb(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 Va,Zs,gb=b(()=>{"use strict";gf();Va=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(e="MailboxFetchClient stopped before a response arrived"){super(e)}},Zs=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 Va("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=Zt(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(hb(c));return}u=()=>{this.pending.has(s)&&(this.pending.delete(s),l(hb(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 Va;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=gU(e);if(n===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(yU(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??wU(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:Zt(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 yf(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 yb=b(()=>{"use strict"});function wf(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 wb=b(()=>{"use strict"});function Tf(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===""||r.sender_teamfile!==null&&(typeof r.sender_teamfile!="string"||r.sender_teamfile==="")||r.sender_alias!==null&&(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 Ef,Eb=b(()=>{"use strict";Ef="daemon:events"});function bb(t){return{kind:"prompt",prompt_id:t.prompt_id??Zt(t.now?.()??Date.now(),t.random??Math.random),root_teamfile:t.root_teamfile,text:t.text}}function bf(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 Tb,Sf=b(()=>{"use strict";gf();Tb="prompt:root"});function Qs(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(vb(e[1]));return typeof r.sub=="string"&&r.sub!==""?r.sub:null}catch{return null}}function EU(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(vb(e[1]));return typeof r.exp=="number"&&Number.isFinite(r.exp)?r.exp:null}catch{return null}}function Sb(t,e=60){if(typeof t!="string"||t==="")return!0;let r=EU(t);return r===null?!0:Date.now()/1e3>=r-e}function vb(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 vf=b(()=>{"use strict"});async function Ya(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":TU},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 TU,kf=b(()=>{"use strict";TU="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as kb,mkdirSync as Ib,readFileSync as Nb,writeFileSync as Ab}from"node:fs";import{homedir as xb}from"node:os";import{dirname as Rb,join as Lb}from"node:path";function eo(){return process.env.LMCTL_DEVICE_AUTH_PATH??Lb(xb(),".lmctl","device-auth.json")}function $b(){return process.env.LMCTL_TOKEN_PATH??Lb(xb(),".lmctl","cli-tokens.json")}function If(t=eo()){try{let e=JSON.parse(Nb(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 Ob(t,e=eo()){Ib(Rb(e),{recursive:!0,mode:448}),Ab(e,JSON.stringify(t,null,2));try{kb(e,384)}catch{}}function Nf(t,e=$b()){let r={};try{r=JSON.parse(Nb(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};Ib(Rb(e),{recursive:!0,mode:448}),Ab(e,JSON.stringify(s,null,2));try{kb(e,384)}catch{}}async function jb(t){let e=t.deviceAuthPath??eo(),r=If(e);if(r===null)throw new Error("device_auth_not_found: no ~/.lmctl/device-auth.json; run `lmctl device login` first");let n=await Ya({region:t.region,clientId:t.clientId,refreshToken:r.refreshToken,...t.fetchImpl!==void 0?{fetchImpl:t.fetchImpl}:{}});return Nf({idToken:n.idToken,...n.accessToken!==void 0?{accessToken:n.accessToken}:{},refreshToken:r.refreshToken,...n.expiresAt!==void 0?{expiresAt:n.expiresAt}:{}},t.cliTokensPath??$b()),{idToken:n.idToken,userId:r.userId}}var Af=b(()=>{"use strict";kf()});import{existsSync as bU,realpathSync as SU}from"node:fs";import{dirname as vU}from"node:path";function xf(t){kU(t).catch(e=>{t.log?.(`[mailbox] prompt trigger failed: ${e instanceof Error?e.message:String(e)}`)})}async function kU(t){let e=t.payload.root_teamfile;try{e=SU(t.payload.root_teamfile)}catch(s){let o=`prompt root missing/unreadable: ${t.payload.root_teamfile}: ${s instanceof Error?s.message:String(s)}`;return await Wn(t.store,{rootTeamfile:t.payload.root_teamfile,receiverTeamfile:t.payload.root_teamfile,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}}if(t.store.getRootTeam(e)===null){let s=`prompt root is not registered: ${e}`;return await Wn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:s,log:t.log}),t.log?.(`[mailbox] ${s}`),{status:"error",response:null,error_detail:s}}let r=IU(e);if("error"in r)return await Wn(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=nr(t.store,{receiver_teamfile:e,receiver_alias:r.alias,sender_teamfile:`prompt:${t.payload.prompt_id}`,sender_alias:"operator",ttlMs:xU(t.env??process.env)});if(!n.acquired){let s=AU(r.alias,n.current);return await Wn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:null,status:"error",error_detail:s,log:t.log}),t.log?.(`[mailbox] prompt rejected: ${s}`),{status:"error",response:null,error_detail:s}}try{let o=await(t.chat??Ht)({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}:{}}),i=o.status==="stalled",a=!i&&o.text.trim()==="",l=i?`provider stalled${o.stalledAfterMs!==void 0?` after ${o.stalledAfterMs}ms`:""}`:a?"provider returned empty response":null,c=i||a?"error":"ok";return await Wn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:c==="error"?null:o.text,status:c,error_detail:l,log:t.log}),{status:c,response:c==="error"?null:o.text,error_detail:l}}catch(s){let o=s instanceof Error?s.message:String(s);return await Wn(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 provider error: ${o}`),{status:"error",response:null,error_detail:o}}finally{try{t.store.releaseAgentInflight(n.lease)}catch(s){t.log?.(`[mailbox] failed to release prompt in-flight slot: ${s instanceof Error?s.message:String(s)}`)}}}function IU(t){if(!bU(t))return{error:`prompt root missing/unreadable: ${t}`};let e=Me(t);if(e.parseErrors.length>0)return{error:`prompt root parse error: ${e.parseErrors.join("; ")}`};let r=et(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??vU(t)}}async function Wn(t,e){let r=Db(e.message),n=e.response===null?null:Db(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,origin:"unknown",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 Db(t){return t.length<=Cb?{text:t,truncated:!1}:{text:t.slice(0,Cb),truncated:!0}}function NU(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function AU(t,e){return e.sender_teamfile.startsWith("prompt:")?`${t} is busy servicing another prompt since ${e.started_at}`:NU(t,e)}function xU(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return Mb;let r=Number(e);return!Number.isFinite(r)||r<=0?Mb:r}var Cb,Mb,Pb=b(()=>{"use strict";At();vt();es();Cb=256*1024,Mb=30*60*1e3});import{chmodSync as Hb,existsSync as RU,mkdirSync as Jb,readFileSync as el,writeFileSync as Xb}from"node:fs";import{dirname as Rf,resolve as za,join as Gb}from"node:path";import{fileURLToPath as LU}from"node:url";import{homedir as Kb}from"node:os";import{CognitoIdentityClient as $U,GetIdCommand as OU}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as Fb}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as jU,ListObjectsV2Command as CU,PutObjectCommand as MU,S3Client as Ub}from"@aws-sdk/client-s3";function ro(t={}){let e=t.env??process.env,r=t.tfstatePath!==void 0?[t.tfstatePath]:WU(t.selfUrl),n={},s;for(let k of r)if(RU(k)){n=UU(k),s=k;break}let o=(...k)=>{for(let N of k)if(typeof N=="string"&&N!=="")return N},i=o(e.LMCTL_NEXT_IDENTITY_POOL_ID,n.LMCTL_NEXT_IDENTITY_POOL_ID)??DU,a=o(e.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??PU,l=o(e.LMCTL_NEXT_MAILBOX_BUCKET,e.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??FU,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)??tl,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,_=Qa(e.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),g=Qa(e.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),h=Qa(e.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),T=Qa(e.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),w=o(e.LMCTL_MAILBOX_KEY),E=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}:{},..._!==void 0?{readIntervalMs:_}:{},...g!==void 0?{heartbeatIdleMs:g}:{},...h!==void 0?{backoffReadIntervalMs:h}:{},...T!==void 0?{chatLogPollIntervalMs:T}:{},...w!==void 0?{mailboxKey:w}:{},...E!==void 0?{tokenPath:E}:{}},f}function UU(t){try{let e=el(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 WU(t){let e=Rf(LU(t??import.meta.url));return[za(e,"..","..","..","..","infra","terraform","terraform.tfstate"),za(e,"..","..","..","..","..","infra","terraform","terraform.tfstate"),za(e,"..","..","..","infra","terraform","terraform.tfstate"),za(e,"..","..","infra","terraform","terraform.tfstate")]}function Qa(t){if(t===void 0||t==="")return;let e=Number(t);if(!(!Number.isFinite(e)||e<=0))return e*1e3}function BU(t){let e=qU(t.intervalMs)??Vb,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 qU(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}async function Yb(t){let e=t.tokenPath??Gb(Kb(),".lmctl","cli-tokens.json"),r=Bb(t.tokenPath);if(Sb(r.cognito?.idToken)&&If()!==null)try{await jb({region:t.region,clientId:t.cognitoClientId??tl,cliTokensPath:e}),r=Bb(t.tokenPath),t.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(x){let X=x instanceof Error?x.message:String(x);t.log?.(`[mx-mailbox] device-auth refresh failed: ${X}`)}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 qb({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=Fb({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new Ub({region:t.region,credentials:a}),c={ListObjectsV2Command:CU,GetObjectCommand:jU,PutObjectCommand:MU},u=Qs(n),d=u??o,f=t.deviceId,m=Mn({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey}),p=t.cursorStore,_;if(p!==void 0){let x=p.loadMailboxCursor(d,m);if(x!==null)_=x.last_processed_seq??void 0,t.log?.(`[mx-mailbox] resumed seq cursor=${_??"(sentinel)"} for user_id=${d}`);else{let X=!1,U=0;for(;!X&&U<2;){U+=1;try{let I=xa(m,"web"),A=0,j;do{let J=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:I,MaxKeys:1e3,...j!==void 0?{ContinuationToken:j}:{}}));for(let W of J.Contents??[]){let D=Ra(W.Key??"",m,"web");D!==void 0&&D>A&&(A=D)}j=J.IsTruncated===!0?J.NextContinuationToken:void 0}while(j!==void 0);_=A,t.log?.(`[mx-mailbox] cold start: seeded seq cursor=${A} for user_id=${d}`),X=!0}catch(I){let A=I instanceof Error?I.message:String(I);if(i&&U===1&&XU(I)){t.log?.(`[mx-mailbox] cached identityId rejected by cognito (${A}); clearing + refreshing`),JU(e),i=!1,o=await qb({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}),a=Fb({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new Ub({region:t.region,credentials:a}),m=Mn({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey});continue}t.log?.(`[mx-mailbox] cold start seq probe failed: ${A}`);break}}p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:_??null,last_processed_at:new Date().toISOString()})}}let g=null,h=t.terminalSessionManager,T=t.persistentSessionManager,w=t.promptTriggerStore,E=new Ka,k=new Hr({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=>E.record(x),onMessage:async x=>{if(h!==void 0&&yf(x.payload)){h.onInbound(x.payload);return}if(T!==void 0&&wf(x.payload)){await T.onInbound(x.payload);return}if(!Tf(x.payload)){if(w!==void 0&&bf(x.payload)){xf({store:w,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()})}}:{},..._!==void 0?{cursor:_}:{},...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 Zs({client:k,...t.log!==void 0?{log:t.log}:{}}),h!==void 0&&h.setPublish(async x=>k.putMessage({conversation_id:`terminal:${x.session_id}`,payload:x})),T!==void 0&&T.setPublish(async x=>k.putMessage({conversation_id:`provider:${x.session_id}`,payload:x}));let N=x=>k.putMessage({conversation_id:Ef,payload:x});k.start();let H=t.chatLogTailStore===void 0?void 0:BU({store:t.chatLogTailStore,publishDaemonEvent:N,cursorKey:m,intervalMs:t.chatLogPollIntervalMs??t.readIntervalMs??t.pollIntervalMs??Vb,log:t.log});t.log?.(`[mx-mailbox] agent polling ${m} (bucket=${t.mailboxBucket})`);let ne=t.deviceId??o,q=`${d}/usage/`,O;return O=t.usageStore===void 0?void 0:pb({meter:E,store:t.usageStore,userId:d,deviceId:ne,ceilingUsd:t.usageQuotaUsd??1/0,onQuotaExceeded:({period:x,costUsd:X,ceilingUsd:U})=>{t.log?.(`[usage] month ${x} cost $${X.toFixed(4)} >= ceiling $${U} \u2014 blocking mailbox`),k.stop().catch(()=>{}),O?.stop()},publishOwnRollup:async(x,X)=>{await l.send(new c.PutObjectCommand({Bucket:t.mailboxBucket,Key:`${q}${ne}-${x}.json`,Body:JSON.stringify({...X,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async x=>{let X={put:0,get:0,list:0},U;do{let I=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:q,MaxKeys:1e3,...U!==void 0?{ContinuationToken:U}:{}}));for(let A of I.Contents??[]){let j=A.Key??"";if(j.endsWith(`-${x}.json`))try{let J=await l.send(new c.GetObjectCommand({Bucket:t.mailboxBucket,Key:j}));if(J.Body===void 0)continue;let W=JSON.parse(await J.Body.transformToString("utf-8"));X.put+=W.put??0,X.get+=W.get??0,X.list+=W.list??0}catch{}}U=I.IsTruncated===!0?I.NextContinuationToken:void 0}while(U!==void 0);return X},intervalMs:t.usageFlushIntervalMs??36e5,...t.log!==void 0?{log:t.log}:{}}),{identityId:o,mailbox:k,fetchClient:g,publishDaemonEvent:N,async stop(){H?.stop(),O!==void 0&&(await O.flushNow().catch(()=>{}),O.stop()),await g.stop().catch(()=>{}),await k.stop().catch(()=>{})}}}async function zb(t){let e=t.s3!==void 0&&t.commands!==void 0?{s3:t.s3,commands:t.commands}:Ga(t.rootDir),r=Mn({identityId:to,userId:to,deviceId:Wb}),n=null,s=t.terminalSessionManager,o=t.persistentSessionManager,i=t.promptTriggerStore,a=new Hr({bucket:"local",identityId:to,userId:to,deviceId:Wb,s3:e.s3,commands:e.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&yf(c.payload)){s.onInbound(c.payload);return}if(o!==void 0&&wf(c.payload)){await o.onInbound(c.payload);return}if(!Tf(c.payload)){if(i!==void 0&&bf(c.payload)){xf({store:i,payload:c.payload,log:t.log});return}n!==null&&await n.handleIncoming(c.payload,c)}},pollIntervalMs:t.pollIntervalMs??Za,readIntervalMs:t.readIntervalMs??Za,heartbeatIdleMs:t.heartbeatIdleMs??Za,backoffReadIntervalMs:t.backoffReadIntervalMs??Za});n=new Zs({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:Ef,payload:c});return a.start(),t.log?.(`[local-webui] agent polling ${r} (local-fs ${t.rootDir})`),{identityId:to,mailbox:a,fetchClient:n,publishDaemonEvent:l,async stop(){await n.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function Bb(t){let e=t??Gb(Kb(),".lmctl","cli-tokens.json");try{let r=el(e,"utf8");return JSON.parse(r)}catch{return{}}}function HU(t,e){if(e===void 0||e==="")return;let r={};try{let s=el(t,"utf8");r=JSON.parse(s)}catch{}if(r.cognito===void 0)return;let n={...r,cognito:{...r.cognito,identityId:e}};Jb(Rf(t),{recursive:!0,mode:448}),Xb(t,JSON.stringify(n,null,2));try{Hb(t,384)}catch{}}function JU(t){let e={};try{let n=el(t,"utf8");e=JSON.parse(n)}catch{return}if(e.cognito===void 0)return;let r={...e,cognito:{...e.cognito}};delete r.cognito.identityId,Jb(Rf(t),{recursive:!0,mode:448}),Xb(t,JSON.stringify(r,null,2));try{Hb(t,384)}catch{}}async function qb(t){t.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new $U({region:t.region}).send(new OU({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{HU(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 XU(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 Vb,Za,tl,DU,PU,FU,to,Wb,Lf=b(()=>{"use strict";ja();mf();hf();_b();gb();yb();wb();Eb();Sf();La();vf();Af();Pb();Vb=3e3,Za=1e3,tl="79u5jhkk46qofog661c9i0bdcs",DU="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",PU="us-east-1_4iUdFggDn",FU="lmctl-next-preview-mailbox-254332045686";to="local",Wb="local"});import{spawn as Cf}from"node:child_process";import{createInterface as Zb}from"node:readline";var $f,Of,jf,Qb,eS=b(()=>{"use strict";Ho();ve();$f=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=Cf(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=Zb({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+`
|
|
2129
2129
|
`)}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+`
|
|
2130
2130
|
`)}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}}}},Of=class{child;ctx;buffer="";sessionIdSeen;closed=!1;async start(e,r){this.ctx=r;let n=Cf(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(`
|
|
2131
2131
|
`);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+`
|
|
2132
2132
|
`)}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}})}},jf=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{qo(n)}catch(a){z({event:"opencode_config_install_failed",cwd:n,error_message:a instanceof Error?a.message:String(a)})}let s=Cf(e.command,e.args,{cwd:n,env:e.env??process.env,stdio:["pipe","pipe","pipe"]});this.child=s,this.rl=Zb({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+`
|
|
2133
2133
|
`)}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+`
|
|
2134
2134
|
`)}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+`
|
|
2135
|
-
`)}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}})}}},Qb=t=>{switch(t){case"codex":return new $f;case"claude":case"qwen":return new Of;case"gemini":case"copilot":case"opencode":return new jf;default:throw new Error(`no_persistent_adapter_for_provider: ${t}`)}}});import{randomUUID as GU}from"node:crypto";import{existsSync as
|
|
2135
|
+
`)}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}})}}},Qb=t=>{switch(t){case"codex":return new $f;case"claude":case"qwen":return new Of;case"gemini":case"copilot":case"opencode":return new jf;default:throw new Error(`no_persistent_adapter_for_provider: ${t}`)}}});import{randomUUID as GU}from"node:crypto";import{existsSync as I7,mkdirSync as KU,readFileSync as VU,writeFileSync as YU}from"node:fs";import{homedir as zU}from"node:os";import{dirname as ZU,join as QU}from"node:path";function rl(){return process.env.LMCTL_DEVICE_FILE??QU(zU(),".lmctl","device.json")}function Jr(t=rl()){let e=process.env.LMCTL_DEVICE_ID;if(e!==void 0&&e!=="")return{device_id:e,created_at:"env"};try{let r=JSON.parse(VU(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 Mf(t=rl()){let e=Jr(t);if(e!==null&&e.created_at!=="env")return e;let r={device_id:GU(),created_at:new Date().toISOString()};return KU(ZU(t),{recursive:!0}),YU(t,`${JSON.stringify(r,null,2)}
|
|
2136
2136
|
`,{encoding:"utf8",mode:384}),r}var Df=b(()=>{"use strict"});import*as tS from"node:child_process";function tW(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 Pf(t,e={}){let r=e.spawnSync===void 0&&process.env[rW]==="1",n=e.spawnSync??tS.spawnSync,s=new Set,o=[];for(let i of t){if(s.has(i))continue;s.add(i);let a=nl[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=tW(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 rS(t){if(t.binary==="<unknown>")return`unknown provider "${t.provider}" \u2014 no binary mapping (allowed: ${Object.keys(nl).join(", ")})`;let e=eW[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 nl,eW,rW,nS=b(()=>{"use strict";nl={claude:"claude",codex:"codex",copilot:"copilot",gemini:"gemini",opencode:"opencode",lmplayer:"lmplayer",qwen:"qwen",agy:"agy"},eW={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",lmplayer:"Install lmplayer and ensure the lmplayer binary is on PATH.",qwen:"https://github.com/QwenLM/qwen-code",agy:"https://antigravity.google"};rW="LMCTL_SKIP_BINARY_CHECK"});var mS={};se(mS,{ProviderBinaryPreflightError:()=>sl,__setProviderBinaryCheckForTest:()=>dW,bootstrapAgentRestMailbox:()=>iS,publishRegisteredWorkflowsOnStart:()=>oS,resolveLocalMailboxDir:()=>dS,resolveLocalWebuiDir:()=>uS,resolveServeConfig:()=>aS,runProviderBinaryPreflight:()=>cS,runServe:()=>aW,validateServeArgs:()=>fS});import{randomBytes as nW}from"node:crypto";import{existsSync as sW}from"node:fs";import{homedir as oW}from"node:os";import{isAbsolute as sS,resolve as Ff}from"node:path";async function aW(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(iW),0;let r=fS(t,process.env);if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
2137
2137
|
`),2;try{cS(e)}catch(w){return 1}let n=he({path:le()}),s={portCli:fW(t)},o;try{o=aS({dal:n,cli:s,env:process.env,parsed:r,io:e})}catch(w){return n.close(),e.stderr.write(`error: ${w instanceof Error?w.message:String(w)}
|
|
2138
2138
|
`),2}process.env.LMCTL_API_URL=o.apiUrl,process.env.LMCTL_API_TOKEN=o.apiToken,process.env.LMCTL_API_PORT=String(o.port),sb(n);let i;if(r.localWebui!==void 0){let w=uS(r.localWebui.dir,process.env);if(w===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 E=dS(process.env),{s3:k,commands:N}=Ga(E);i={webuiDir:w,rootDir:E,s3:k,commands:N},e.stdout.write(`local webui: serving SPA from ${w}; mailbox store ${E}
|
|
@@ -2150,7 +2150,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
|
|
|
2150
2150
|
`);return{port:a,apiUrl:d,apiToken:c}}function cW(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 uW(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 Pa({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 dW(t){lS=t??Pf}function cS(t){let e=Object.keys(nl),r=lS(e),n=r.filter(o=>!o.found);if(n.length>0){for(let o of n)t.stderr.write(`error: ${rS(o)}
|
|
2151
2151
|
`);throw t.stderr.write(`error: agent refusing to start; ensure missing provider CLIs are on PATH
|
|
2152
2152
|
`),new sl(n)}let s=r.map(o=>o.provider).join(", ");t.stdout.write(`providers ready: ${s}
|
|
2153
|
-
`)}function uS(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=sS(r)?r:Ff(process.cwd(),r);return sW(`${n}/index.html`)?n:null}function dS(t){let e=t.LMCTL_LOCAL_MAILBOX_DIR;return e!==void 0&&e!==""?sS(e)?e:Ff(process.cwd(),e):Ff(oW(),".lmctl","local-mailbox")}function fW(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 fS(t,e=process.env){let r=mW(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 mW(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 iW,sl,lS,pS=b(()=>{"use strict";
|
|
2153
|
+
`)}function uS(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=sS(r)?r:Ff(process.cwd(),r);return sW(`${n}/index.html`)?n:null}function dS(t){let e=t.LMCTL_LOCAL_MAILBOX_DIR;return e!==void 0&&e!==""?sS(e)?e:Ff(process.cwd(),e):Ff(oW(),".lmctl","local-mailbox")}function fW(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 fS(t,e=process.env){let r=mW(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 mW(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 iW,sl,lS,pS=b(()=>{"use strict";Be();YT();cf();ob();md();Lf();mf();Zd();Qd();eS();Df();nS();Ve();iW=`usage: lmctl serve [--port N] [--bind HOST] [--no-daemon] [--insecure-no-auth] [--webui [DIR]]
|
|
2154
2154
|
|
|
2155
2155
|
Start the local HTTP API, web UI, queue daemon, terminal manager, and agent
|
|
2156
2156
|
services. Help exits before any port binding or daemon startup.
|
|
@@ -2167,8 +2167,8 @@ services. Help exits before any port binding or daemon startup.
|
|
|
2167
2167
|
Scan configured project GitHub issues into lmctl, or update per-project
|
|
2168
2168
|
intake settings such as enabled state, labels, and issue state filters.
|
|
2169
2169
|
scan writes JSON output; --project limits the scan to one project.
|
|
2170
|
-
`});function wS(t){let e=gS(t.registry,t.fromTeamfile);if(e===void 0)return Bn(`sender team is not registered in policy graph: ${t.fromTeamfile}`);if(!yS(e,t.fromAlias))return Bn(`sender alias "${t.fromAlias}" not found in ${t.fromTeamfile}`);let r=gS(t.registry,t.toTeamfile);return r===void 0?Bn(`target team is not registered in policy graph: ${t.toTeamfile}`):yS(r,t.toAlias)?t.toTeamfile===t.fromTeamfile?{allowed:!0,outOfPolicy:!1,reason:"same team"}:e.leadAlias===null?Bn(`sender team has no Lead: ${t.fromTeamfile}`):t.fromAlias!==e.leadAlias?Bn(`cross-team sends may only originate from Lead; got "${t.fromAlias}" in ${t.fromTeamfile}`):{allowed:!0,outOfPolicy:!1,reason:"cross-team send from Lead"}:Bn(`target alias "${t.toAlias}" not found in ${t.toTeamfile}`)}function gS(t,e){return t.teams.find(r=>r.teamfile===e)}function yS(t,e){return t.aliases.some(r=>r===e)}function Bn(t){return{allowed:!1,outOfPolicy:!0,reason:t}}var ES=b(()=>{"use strict"});import{randomUUID as yW}from"node:crypto";import{hostname as TS,networkInterfaces as wW}from"node:os";function bS(t){let e=(t.now??new Date).toISOString();return{lock_id:yW(),teamfile:t.teamfile,alias:t.alias,holder_pid:t.pid??process.pid,holder_host:t.host??TS(),holder_ips:t.ips??vW(),started_at:e,last_heartbeat:e}}function SS(t=process.env){return vS(t.LMCTL_TERMINAL_LOCK_HEARTBEAT_MS,EW)}function bW(t=process.env){return vS(t.LMCTL_TERMINAL_LOCK_STALE_MS,TW)}function Uf(t,e={}){let r=e.now??new Date,n=e.localHost??TS(),s=e.staleMs??bW();if(t.holder_host===n)return(e.isProcessAlive??SW)(t.holder_pid)?{live:!0,reason:"local-pid-alive"}:{live:!1,reason:"dead-pid"};let o=Date.parse(t.last_heartbeat);return Number.isFinite(o)?r.getTime()-o<=s?{live:!0,reason:"remote-heartbeat-fresh"}:{live:!1,reason:"stale-heartbeat"}:{live:!1,reason:"stale-heartbeat"}}function Wf(t){return`${t.alias} is held by a terminal on ${t.holder_host} since ${t.started_at}; retry later`}function vS(t,e){if(t===void 0||t.trim()==="")return e;let r=t.trim(),n=Number.parseInt(r,10);return!Number.isFinite(n)||n<=0||String(n)!==r?e:n}function SW(t){if(!Number.isInteger(t)||t<=0)return!1;try{return process.kill(t,0),!0}catch(e){return(e!==null&&typeof e=="object"&&"code"in e?e.code:void 0)!=="ESRCH"}}function vW(){let t=new Set;for(let e of Object.values(wW()))for(let r of e??[])r.internal||t.add(r.address);return[...t].sort()}var EW,TW,Bf=b(()=>{"use strict";EW=15e3,TW=12e4});function IS(t,e){if(!kS(t,e.sender))return;let r=`${e.sender.teamfile}:${e.sender.alias}`,
|
|
2171
|
-
`}),
|
|
2170
|
+
`});function wS(t){let e=gS(t.registry,t.fromTeamfile);if(e===void 0)return Bn(`sender team is not registered in policy graph: ${t.fromTeamfile}`);if(!yS(e,t.fromAlias))return Bn(`sender alias "${t.fromAlias}" not found in ${t.fromTeamfile}`);let r=gS(t.registry,t.toTeamfile);return r===void 0?Bn(`target team is not registered in policy graph: ${t.toTeamfile}`):yS(r,t.toAlias)?t.toTeamfile===t.fromTeamfile?{allowed:!0,outOfPolicy:!1,reason:"same team"}:e.leadAlias===null?Bn(`sender team has no Lead: ${t.fromTeamfile}`):t.fromAlias!==e.leadAlias?Bn(`cross-team sends may only originate from Lead; got "${t.fromAlias}" in ${t.fromTeamfile}`):{allowed:!0,outOfPolicy:!1,reason:"cross-team send from Lead"}:Bn(`target alias "${t.toAlias}" not found in ${t.toTeamfile}`)}function gS(t,e){return t.teams.find(r=>r.teamfile===e)}function yS(t,e){return t.aliases.some(r=>r===e)}function Bn(t){return{allowed:!1,outOfPolicy:!0,reason:t}}var ES=b(()=>{"use strict"});import{randomUUID as yW}from"node:crypto";import{hostname as TS,networkInterfaces as wW}from"node:os";function bS(t){let e=(t.now??new Date).toISOString();return{lock_id:yW(),teamfile:t.teamfile,alias:t.alias,holder_pid:t.pid??process.pid,holder_host:t.host??TS(),holder_ips:t.ips??vW(),started_at:e,last_heartbeat:e}}function SS(t=process.env){return vS(t.LMCTL_TERMINAL_LOCK_HEARTBEAT_MS,EW)}function bW(t=process.env){return vS(t.LMCTL_TERMINAL_LOCK_STALE_MS,TW)}function Uf(t,e={}){let r=e.now??new Date,n=e.localHost??TS(),s=e.staleMs??bW();if(t.holder_host===n)return(e.isProcessAlive??SW)(t.holder_pid)?{live:!0,reason:"local-pid-alive"}:{live:!1,reason:"dead-pid"};let o=Date.parse(t.last_heartbeat);return Number.isFinite(o)?r.getTime()-o<=s?{live:!0,reason:"remote-heartbeat-fresh"}:{live:!1,reason:"stale-heartbeat"}:{live:!1,reason:"stale-heartbeat"}}function Wf(t){return`${t.alias} is held by a terminal on ${t.holder_host} since ${t.started_at}; retry later`}function vS(t,e){if(t===void 0||t.trim()==="")return e;let r=t.trim(),n=Number.parseInt(r,10);return!Number.isFinite(n)||n<=0||String(n)!==r?e:n}function SW(t){if(!Number.isInteger(t)||t<=0)return!1;try{return process.kill(t,0),!0}catch(e){return(e!==null&&typeof e=="object"&&"code"in e?e.code:void 0)!=="ESRCH"}}function vW(){let t=new Set;for(let e of Object.values(wW()))for(let r of e??[])r.internal||t.add(r.address);return[...t].sort()}var EW,TW,Bf=b(()=>{"use strict";EW=15e3,TW=12e4});function IS(t,e){if(!kS(t,e.sender))return;let r=e.now??new Date,n=`${e.sender.teamfile}:${e.sender.alias}`,s=kW(t,e.sender,n);for(let o of s){if(o.teamfile===e.currentTarget.teamfile&&o.alias===e.currentTarget.alias||!kS(t,o))continue;let i=xW(n,o);if(IW(t,o)){$W(t,i);continue}let a=`activity:${NW(t,o)}`;if(RW(t,i)?.occurrence_marker===a)continue;let c=AW(t,o,r);e.emit({kind:"warning",message:`ALERT: your lead ${o.teamfile}:${o.alias} has been idle for ${c} min \u2014 it likely forgot to run \`notify_me\`. Remind it to foreground \`notify_me\`.
|
|
2171
|
+
`}),LW(t,i,{occurrence_marker:a,warned_at:r.toISOString()})}}function kW(t,e,r){return t.db.prepare(`
|
|
2172
2172
|
SELECT DISTINCT teamfile, alias
|
|
2173
2173
|
FROM (
|
|
2174
2174
|
SELECT target_teamfile AS teamfile, target_alias AS alias
|
|
@@ -2195,17 +2195,33 @@ scan writes JSON output; --project limits the scan to one project.
|
|
|
2195
2195
|
FROM tracked_invocation
|
|
2196
2196
|
WHERE target_teamfile = ?
|
|
2197
2197
|
AND target_alias = ?
|
|
2198
|
-
`).get(e.teamfile,e.alias);return Number(r?.max_id??0)}function
|
|
2198
|
+
`).get(e.teamfile,e.alias);return Number(r?.max_id??0)}function AW(t,e,r){let s=t.db.prepare(`
|
|
2199
|
+
SELECT COALESCE(
|
|
2200
|
+
(
|
|
2201
|
+
SELECT MAX(ended_at)
|
|
2202
|
+
FROM tracked_invocation
|
|
2203
|
+
WHERE target_teamfile = ?
|
|
2204
|
+
AND target_alias = ?
|
|
2205
|
+
AND ended_at IS NOT NULL
|
|
2206
|
+
),
|
|
2207
|
+
(
|
|
2208
|
+
SELECT MAX(created_at)
|
|
2209
|
+
FROM team_chat_log
|
|
2210
|
+
WHERE receiver_teamfile = ?
|
|
2211
|
+
AND receiver_alias = ?
|
|
2212
|
+
)
|
|
2213
|
+
) AS activity_at
|
|
2214
|
+
`).get(e.teamfile,e.alias,e.teamfile,e.alias)?.activity_at;if(typeof s!="string"||s.length===0)return 0;let o=Date.parse(s);return Number.isFinite(o)?Math.max(0,Math.floor((r.getTime()-o)/6e4)):0}function kS(t,e){try{let r=qe(e.teamfile,t);return et(r)?.alias===e.alias}catch{return!1}}function xW(t,e){return`${t} -> ${e.teamfile}:${e.alias}`}function RW(t,e){let r=t.db.prepare("SELECT data FROM runtime_state WHERE scope = ? AND key = ? AND kind = ?").get(qf,e,Hf);if(r===void 0)return null;try{let n=JSON.parse(r.data);return typeof n.occurrence_marker!="string"?null:{occurrence_marker:n.occurrence_marker,warned_at:typeof n.warned_at=="string"?n.warned_at:""}}catch{return null}}function LW(t,e,r){t.db.prepare(`
|
|
2199
2215
|
INSERT INTO runtime_state (scope, key, kind, data, updated_at)
|
|
2200
2216
|
VALUES (?, ?, ?, ?, ?)
|
|
2201
2217
|
ON CONFLICT(scope, key, kind) DO UPDATE SET
|
|
2202
2218
|
data = excluded.data,
|
|
2203
2219
|
updated_at = excluded.updated_at
|
|
2204
|
-
`).run(qf,e,Hf,JSON.stringify(r),r.warned_at)}function
|
|
2205
|
-
`});try{bn(r,
|
|
2220
|
+
`).run(qf,e,Hf,JSON.stringify(r),r.warned_at)}function $W(t,e){t.db.prepare("DELETE FROM runtime_state WHERE scope = ? AND key = ? AND kind = ?").run(qf,e,Hf)}var qf,Hf,NS=b(()=>{"use strict";vt();tt();qf="cli:chat-idle-alert",Hf="sender-target"});async function ll(t){let e=t.onEvent??(()=>{}),r=CW(t.io,e),n=null,s=null,o=null,i,a=null,l=t.prompt;try{let c=await R(r,E=>Pe(t.teamfile,t.alias,E)),u=c.teamfile,d=await R(r,E=>BW(E,t.env??process.env)),f=d.sender,m=await qW(r,{explicitRoot:t.rootFlag,sender:f,receiverTeamfile:u,operatorOrigin:d.origin==="operator"});f!==null&&await jW(r,{sender:f,currentTarget:{teamfile:u,alias:c.alias},emit:e}),o=await PW(r,{receiverTeamfile:u,receiverAlias:c.alias,sender:f,rootTeamfile:m,provider:c.provider,model:c.model,sessionId:c.sessionid,cwd:c.sessiondir,prompt:t.prompt,origin:d.origin}),i=UW(r,o);let p=f===null?null:await HW(r,{rootTeamfile:m,sender:f,receiverTeamfile:u,receiverAlias:c.alias});p!==null&&!p.allowed&&e({kind:"warning",message:`warning: out-of-policy chat send: ${p.reason}
|
|
2221
|
+
`});try{bn(r,Me(u),u)}catch{}n={root_teamfile:m,sender_teamfile:f?.teamfile??null,sender_alias:f?.alias??null,receiver_teamfile:u,receiver_alias:c.alias,origin:d.origin,policy:p};let _=await LS(r,u,c.alias);if(_!==null){let E=Wf(_);if(f!==null){let N=await Jf(r,{sender:f,receiverTeamfile:u,receiverAlias:c.alias,rootTeamfile:m,payload:t.prompt});return a=ol(`enqueued mailbox message ${N.id}`,null),Xf(N.id,f,u,c.alias)}let k=await qn(r,{...n,message:t.prompt,response:null,status:"error",error_detail:E});return a=Gf(E,k),{status:"busy",message:E,teamChatLogId:k}}if(await MW(r,u,c.alias)){if(f!==null){let N=await Jf(r,{sender:f,receiverTeamfile:u,receiverAlias:c.alias,rootTeamfile:m,payload:t.prompt});return a=ol(`enqueued mailbox message ${N.id}`,null),Xf(N.id,f,u,c.alias)}let E=await DW(r,u,c.alias),k=await qn(r,{...n,message:t.prompt,response:null,status:"error",error_detail:E});return a=Gf(E,k),{status:"busy",message:E,teamChatLogId:k}}if(f!==null&&f.teamfile!==u){let E=await R(r,k=>Gp(k,{root:m,sender:f,receiverTeamfile:u,receiverAlias:c.alias,now:new Date}));if(E.stop){let k=Vp(E.chain),N=await qn(r,{...n,message:t.prompt,response:null,status:"error",error_detail:k});return a=il(k,N),{status:"error",errorKind:"cycle",message:k,teamChatLogId:N}}}let g=await GW(r,{receiver_teamfile:u,receiver_alias:c.alias,sender_teamfile:f?.teamfile??u,sender_alias:f?.alias??"operator"});if(!g.acquired){let E=$S(u,c.alias,g.current);if(f!==null){let N=await Jf(r,{sender:f,receiverTeamfile:u,receiverAlias:c.alias,rootTeamfile:m,payload:t.prompt});return a=ol(`enqueued mailbox message ${N.id}`,null),Xf(N.id,f,u,c.alias)}let k=await qn(r,{...n,message:t.prompt,response:null,status:"error",error_detail:E});return a=Gf(E,k),{status:"busy",message:E,teamChatLogId:k}}s=g.lease;let h=await ai({sender:f??{teamfile:u,alias:"operator"},receiver:{teamfile:u,alias:c.alias,provider:c.provider,sessionId:c.sessionid,cwd:c.sessiondir,...c.model!==void 0?{model:c.model}:{},...c.effort!==void 0?{effort:c.effort}:{},...c.isLead!==void 0?{isLead:c.isLead}:{}},newMessage:t.prompt,io:r,permissionMode:t.permissionMode,env:t.env??process.env,...t.idleTimeoutMs!==void 0?{idleTimeoutMs:t.idleTimeoutMs}:{},onDelta:E=>e({kind:"delta",chunk:E}),onProgress:E=>e({kind:"progress",alias:c.alias,event:E})});l=h.prompt;let T=h.status==="stalled",w=await qn(r,{...n,message:l,response:T?null:h.receipt,status:n.policy?.outOfPolicy===!0?"out_of_policy":T?"error":"ok",error_detail:n.policy?.outOfPolicy===!0?n.policy.reason:T?`provider stalled${h.stalledAfterMs!==void 0?` after ${h.stalledAfterMs}ms`:""}`:null});return a=T?il(`provider stalled${h.stalledAfterMs!==void 0?` after ${h.stalledAfterMs}ms`:""}`,w,h.receipt):ol(h.receipt,w),{status:T?"stalled":"ok",replyText:h.receipt,wroteDelta:h.wroteDelta,teamChatLogId:w,durationMs:h.durationMs}}catch(c){let u=c instanceof Error?c.message:String(c),d=n===null?null:await qn(r,{...n,message:l,response:null,status:n.policy?.outOfPolicy===!0?"out_of_policy":"error",error_detail:n.policy?.outOfPolicy===!0?`${n.policy.reason}; provider error: ${u}`:u});return a=il(u,d),{status:"error",errorKind:c instanceof be?"target":"provider",message:u,teamChatLogId:d}}finally{i!==void 0&&clearInterval(i),s!==null&&await KW(r,s),o!==null&&await FW(r,o,a??il("chat turn exited without a terminal outcome",null))}}async function jW(t,e){try{await R(t,r=>IS(r,e))}catch(r){ue()&&je(JSON.stringify({event:"chat_idle_alert_error",error:r instanceof Error?r.message:String(r)}))}}function CW(t,e){return{...t,stdout:{write:()=>{}},stderr:{write:r=>{e({kind:"warning",message:r})}}}}async function MW(t,e,r){return await R(t,n=>zr(n,e,r))}async function DW(t,e,r){let n=await LS(t,e,r);if(n!==null)return Wf(n);let s=await R(t,o=>o.getAgentInflight(e,r));return s!==null?$S(e,r,s):`${r} is busy; wait and retry`}async function Jf(t,e){return await R(t,r=>r.enqueueMail({sender_teamfile:e.sender.teamfile,sender_alias:e.sender.alias,receiver_teamfile:e.receiverTeamfile,receiver_alias:e.receiverAlias,root_teamfile:e.rootTeamfile,payload:e.payload}))}function Xf(t,e,r,n){let s=`${r}:${n}`;return{status:"enqueued",id:t,message:`mailbox message ${t} enqueued to ${s}`,teamChatLogId:null,sender:`${e.teamfile}:${e.alias}`,receiver:s}}async function PW(t,e){try{return(await R(t,n=>n.startTrackedInvocation({kind:"chat",origin:e.origin,scope_teamfile:e.receiverTeamfile,from_identity:e.sender===null?"operator":`${e.sender.teamfile}:${e.sender.alias}`,target_teamfile:e.receiverTeamfile,target_alias:e.receiverAlias,root_teamfile:e.rootTeamfile,cwd:e.cwd??null,command:WW(e.receiverTeamfile,e.receiverAlias,e.prompt),holder_pid:process.pid,meta:JSON.stringify({provider:e.provider,model:e.model??null,sessionid:e.sessionId??null})}))).id}catch(r){return ue()&&je(JSON.stringify({event:"tracked_invocation_start_error",error:r instanceof Error?r.message:String(r)})),null}}async function FW(t,e,r){try{await R(t,n=>{n.finishTrackedInvocation(e,r)})}catch(n){ue()&&je(JSON.stringify({event:"tracked_invocation_finish_error",id:e,error:n instanceof Error?n.message:String(n)}))}}function UW(t,e){if(e===null)return;let r=setInterval(()=>{R(t,n=>n.heartbeatTrackedInvocation(e)).catch(n=>{ue()&&je(JSON.stringify({event:"tracked_invocation_heartbeat_error",id:e,error:n instanceof Error?n.message:String(n)}))})},OW);return r.unref?.(),r}function ol(t,e){return{status:"done",result_summary:al(t),error:null,team_chat_log_id:e}}function Gf(t,e){return{status:"busy",result_summary:al(t),error:t,team_chat_log_id:e}}function il(t,e,r){return{status:"error",result_summary:al(r===void 0?t:r),error:t,team_chat_log_id:e}}function al(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=500?e:`${e.slice(0,497)}...`}function WW(t,e,r){return`lmctl chat ${JSON.stringify(t)} ${e} ${JSON.stringify(r)}`}function BW(t,e){let r=ln(e,t);if(r.ok)return{sender:ws(r.identity),origin:"agent"};if(r.reason==="unset")return{sender:null,origin:"operator"};throw new Error(an("chat"))}async function qW(t,e){if(e.explicitRoot!==void 0)return await R(t,n=>ye(e.explicitRoot,n));if(e.operatorOrigin||e.sender===null)return e.receiverTeamfile;let r=e.sender;return await R(t,n=>Kp(n,{sender:r,now:new Date})??e.receiverTeamfile)}async function HW(t,e){return await R(t,r=>wS({rootTeamfile:e.rootTeamfile,fromTeamfile:e.sender.teamfile,fromAlias:e.sender.alias,toTeamfile:e.receiverTeamfile,toAlias:e.receiverAlias,registry:JW(r,e.sender.teamfile,e.receiverTeamfile)}))}function JW(t,e,r){return{teams:[e,r].map(s=>XW(s,t))}}function XW(t,e){let r=qe(t,e),n=et(r);return{teamfile:t,aliases:r.members.map(s=>s.alias),leadAlias:n?.alias??null}}async function GW(t,e){return await R(t,r=>{let n=ue(),s=nr(r,{receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,ttlMs:sr()});return s.acquired?(n&&je(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:s.reclaimReason===null?"acquired":"reclaimed",...s.reclaimReason===null?{}:{reclaim_reason:s.reclaimReason,holder:xS(s.previous)}})),{acquired:!0,lease:s.lease}):(n&&je(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:"rejected",holder:xS(s.current)})),{acquired:!1,current:s.current})})}async function LS(t,e,r){return await R(t,n=>{for(let o=0;o<2;o+=1){let i=n.getTerminalLock(e,r);if(i===null)return null;if(Uf(i).live)return i;let l=n.getAgentInflight(e,r);if(n.clearTerminalLock(e,r,i.lock_id))return l!==null&&l.sender_teamfile===e&&l.sender_alias==="terminal"&&n.clearObservedTerminalAgentInflight(e,r,{sender_teamfile:l.sender_teamfile,sender_alias:l.sender_alias,started_at:l.started_at,holder_pid:l.holder_pid}),null}let s=n.getTerminalLock(e,r);return s===null?null:Uf(s).live?s:null})}function xS(t){return t===null?null:{sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,holder_pid:t.holder_pid,started_at:t.started_at}}async function KW(t,e){try{await R(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)}
|
|
2206
2222
|
`)}}function $S(t,e,r){return`${e} is servicing ${r.sender_alias} (${r.sender_teamfile}) since ${r.started_at} \u2014 wait and retry, or inspect without waking it: lmctl tail "${t}" ${e}`}async function qn(t,e){let r=RS(e.message),n=e.response===null?null:RS(e.response);try{return await R(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,origin:e.origin,status:e.status,error_detail:e.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()}))}catch(s){return t.stderr.write(`warning: failed to record chat log: ${s instanceof Error?s.message:String(s)}
|
|
2207
|
-
`),null}}function RS(t){return t.length<=
|
|
2208
|
-
`),t.length===0?2:0;let n=
|
|
2223
|
+
`),null}}function RS(t){return t.length<=AS?{text:t,truncated:!1}:{text:t.slice(0,AS),truncated:!0}}var AS,OW,Kf=b(()=>{"use strict";xt();vt();Os();ES();tt();Oo();ve();ge();es();Bf();ys();ou();ru();NS();AS=256*1024,OW=3e4});var MS={};se(MS,{parseIdleTimeoutMs:()=>jS,runChat:()=>YW});async function YW(t,e={stdout:process.stdout,stderr:process.stderr}){let r=e.env??process.env;if(t.length===0||t[0]==="--help"||t[0]==="-h")return e.stdout.write(`${OS}
|
|
2224
|
+
`),t.length===0?2:0;let n=zW(t);if(typeof n=="string")return e.stderr.write(`error: ${n}
|
|
2209
2225
|
${OS}
|
|
2210
2226
|
`),2;if(n.runFlag!==void 0){let d=Number.parseInt(n.runFlag,10);return!Number.isFinite(d)||d<=0||String(d)!==n.runFlag?(e.stderr.write(`error: invalid --run "${n.runFlag}" (expected a positive integer run id)
|
|
2211
2227
|
`),2):await R(e,async f=>{let m=f.getRun(d);if(m===null)return e.stderr.write(`error: run ${d}: not found
|
|
@@ -2217,10 +2233,10 @@ ${OS}
|
|
|
2217
2233
|
`),1;let g=f.resumeInteractive(_.step_id,n.prompt,n.done===!0);return g.resumed===!0?(e.stdout.write(`run ${d}: interactive resumed (step ${_.step_id}${n.done===!0?", done":""})
|
|
2218
2234
|
`),0):(e.stderr.write(`error: run ${d}: resumeInteractive failed (${g.reason})
|
|
2219
2235
|
`),1)}return e.stderr.write(`error: run ${d}: pending attention kind "${p.kind}" is not operator-answerable
|
|
2220
|
-
`),1})}let s=ur(
|
|
2236
|
+
`),1})}let s=ur(VW,{target:n.target,alias:n.alias,flags:{session:n.sessionFlag,provider:n.providerFlag}});if(s.mode==="error")return e.stderr.write(`error: ${s.message}
|
|
2221
2237
|
`),2;if(s.mode==="managed")return e.stderr.write(`error: chat managed mode requires --run <id>
|
|
2222
2238
|
`),2;let o;if(s.mode==="ai-team"){if(s.alias===void 0)return e.stderr.write(`error: chat: alias required (internal)
|
|
2223
|
-
`),2;let d=await ll({teamfile:s.teamfile,alias:s.alias,prompt:n.prompt,permissionMode:n.permissionMode,...n.idleTimeoutMs!==void 0?{idleTimeoutMs:n.idleTimeoutMs}:{},...n.rootFlag!==void 0?{rootFlag:n.rootFlag}:{},env:r,io:e,onEvent:f=>
|
|
2239
|
+
`),2;let d=await ll({teamfile:s.teamfile,alias:s.alias,prompt:n.prompt,permissionMode:n.permissionMode,...n.idleTimeoutMs!==void 0?{idleTimeoutMs:n.idleTimeoutMs}:{},...n.rootFlag!==void 0?{rootFlag:n.rootFlag}:{},env:r,io:e,onEvent:f=>QW(e,f)});return n.json===!0?d.status==="enqueued"?(e.stdout.write(`${JSON.stringify({status:"enqueued",path:"enqueued",id:d.id,sender:d.sender,receiver:d.receiver})}
|
|
2224
2240
|
`),0):d.status==="busy"?(e.stdout.write(`${JSON.stringify({status:"busy",message:d.message,teamChatLogId:d.teamChatLogId})}
|
|
2225
2241
|
`),1):d.status==="error"?(e.stdout.write(`${JSON.stringify({status:"error",errorKind:d.errorKind,message:d.message,teamChatLogId:d.teamChatLogId})}
|
|
2226
2242
|
`),1):(e.stdout.write(`${JSON.stringify({status:d.status,replyText:d.replyText,teamChatLogId:d.teamChatLogId})}
|
|
@@ -2233,15 +2249,15 @@ ${OS}
|
|
|
2233
2249
|
`):e.stdout.write(`${d.replyText}${d.replyText.endsWith(`
|
|
2234
2250
|
`)?"":`
|
|
2235
2251
|
`}`),d.status==="stalled"?1:0)}else{if(s.provider===void 0)return e.stderr.write(`error: chat raw mode (bare sessionid / --session) requires --provider <name>
|
|
2236
|
-
`),2;o={provider:s.provider,sessionId:s.sessionid,cwd:process.cwd()}}let i=!1,a=ue(),l=0,c=0,u=0;try{let d={provider:o.provider,sessionId:o.sessionId,cwd:o.cwd,prompt:n.prompt,permissionMode:n.permissionMode,env:r,onDelta:p=>{i=!0,a&&(l+=1,u=Buffer.byteLength(p,"utf8"),c+=u),e.stdout.write(p)},onProgress:p=>CS(e,o.alias??"(raw)",p)};o.model!==void 0&&(d.model=o.model),o.effort!==void 0&&(d.effort=o.effort),o.alias!==void 0&&(d.alias=o.alias),o.isLead!==void 0&&(d.isLead=o.isLead),n.idleTimeoutMs!==void 0&&(d.timeoutMs=n.idleTimeoutMs);let f=await Ht(d);a&&je(JSON.stringify({event:"chat_return",alias:o.alias??"(raw)",provider:o.provider,streamed:i,blockCount:l,streamedBytes:c,resultTextBytes:Buffer.byteLength(f.text,"utf8"),lastChunkBytes:u,tailPreview:
|
|
2252
|
+
`),2;o={provider:s.provider,sessionId:s.sessionid,cwd:process.cwd()}}let i=!1,a=ue(),l=0,c=0,u=0;try{let d={provider:o.provider,sessionId:o.sessionId,cwd:o.cwd,prompt:n.prompt,permissionMode:n.permissionMode,env:r,onDelta:p=>{i=!0,a&&(l+=1,u=Buffer.byteLength(p,"utf8"),c+=u),e.stdout.write(p)},onProgress:p=>CS(e,o.alias??"(raw)",p)};o.model!==void 0&&(d.model=o.model),o.effort!==void 0&&(d.effort=o.effort),o.alias!==void 0&&(d.alias=o.alias),o.isLead!==void 0&&(d.isLead=o.isLead),n.idleTimeoutMs!==void 0&&(d.timeoutMs=n.idleTimeoutMs);let f=await Ht(d);a&&je(JSON.stringify({event:"chat_return",alias:o.alias??"(raw)",provider:o.provider,streamed:i,blockCount:l,streamedBytes:c,resultTextBytes:Buffer.byteLength(f.text,"utf8"),lastChunkBytes:u,tailPreview:ZW(f.text,200)}));let m=f.status==="stalled";return i?f.text.endsWith(`
|
|
2237
2253
|
`)||e.stdout.write(`
|
|
2238
2254
|
`):e.stdout.write(`${f.text}${f.text.endsWith(`
|
|
2239
2255
|
`)?"":`
|
|
2240
2256
|
`}`),f.status==="stalled"?1:0}catch(d){let f=d instanceof Error?d.message:String(d);return e.stderr.write(`error: ${f}
|
|
2241
|
-
`),1}}function
|
|
2257
|
+
`),1}}function zW(t){let e=[],r="yolo",n,s,o,i,a,l=!1,c=!1;for(let p=0;p<t.length;p+=1){let _=t[p];if(_==="--permission-mode"){let g=t[++p];if(g===void 0||g.startsWith("--"))return"missing value for --permission-mode";if(g!=="plan"&&g!=="yolo")return`--permission-mode must be one of plan|yolo (got "${g}")`;r=g;continue}if(_==="--idle-timeout"){let g=t[++p];if(g===void 0||g.startsWith("--"))return"missing value for --idle-timeout";let h=jS(g);if(typeof h=="string")return h;n=h;continue}if(_==="--session"){let g=t[++p];if(g===void 0||g.startsWith("--"))return"missing value for --session";s=g;continue}if(_==="--provider"){let g=t[++p];if(g===void 0||g.startsWith("--"))return"missing value for --provider";o=g;continue}if(_==="--from"||_.startsWith("--from="))return nu("chat");if(_.startsWith("I_am="))return`unknown argument: ${_}`;if(_==="--root"){let g=t[++p];if(g===void 0||g.startsWith("--"))return"missing value for --root";i=g;continue}if(_==="--force"||_.startsWith("--force="))return"unknown option --force (a dead holder auto-reclaims; for a live holder use lmctl chat)";if(_==="--json"){c=!0;continue}if(_==="--run"){let g=t[++p];if(g===void 0||g.startsWith("--"))return"missing value for --run";a=g;continue}if(_==="--done"){l=!0;continue}if(_.startsWith("--"))return`unknown flag: ${_}`;e.push(_)}if(a!==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 --root":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:a,done:l,json:c};let u,d,f;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>"';f=e[0]}else if(e.length===2)u=e[0],f=e[1];else if(e.length===3)u=e[0],d=e[1],f=e[2];else return`too many positionals (${e.length}); expected at most <teamfile> <alias> <prompt>`;if(l)return"--done requires --run";let m={prompt:f,permissionMode:r};return u!==void 0&&(m.target=u),d!==void 0&&(m.alias=d),n!==void 0&&(m.idleTimeoutMs=n),s!==void 0&&(m.sessionFlag=s),o!==void 0&&(m.providerFlag=o),i!==void 0&&(m.rootFlag=i),c&&(m.json=c),m}function jS(t){if(t==="0")return 0;if(/^\d+$/.test(t))return Number(t);let e=/^(\d+)([smhd])$/.exec(t);if(e===null)return`invalid --idle-timeout "${t}" (expected <n>(s|m|h|d), integer ms, or 0)`;let r=Number(e[1]),n=e[2];return r*(n==="s"?1e3:n==="m"?6e4:n==="h"?36e5:864e5)}function CS(t,e,r){r.kind==="tool_use"?t.stderr.write(`[${e}] tool_use ${r.tool??"tool"}${r.summary?`: ${r.summary}`:""}
|
|
2242
2258
|
`):r.kind==="tool_result"?t.stderr.write(`[${e}] tool_result${r.status?` ${r.status}`:""}${r.summary?`: ${r.summary}`:""}
|
|
2243
2259
|
`):r.kind==="api_retry"&&t.stderr.write(`[${e}] api_retry${r.summary?`: ${r.summary}`:""}
|
|
2244
|
-
`)}function
|
|
2260
|
+
`)}function ZW(t,e){return t.slice(-e)}function QW(t,e){e.kind==="delta"?t.stdout.write(e.chunk):e.kind==="progress"?CS(t,e.alias,e.event):t.stderr.write(e.message)}var VW,OS,DS=b(()=>{"use strict";At();ge();xt();Kf();ys();ve();Wa();Jt();VW={name:"chat",allowsBareTeamfile:!1,supportsRaw:!0},OS=`usage: lmctl chat <teamfile>:<alias> "<prompt>"
|
|
2245
2261
|
lmctl chat <teamfile> <alias> "<prompt>"
|
|
2246
2262
|
lmctl chat <sessionid> "<prompt>" --provider <name>
|
|
2247
2263
|
lmctl chat --provider <name> --session <id> "<prompt>"
|
|
@@ -2249,36 +2265,36 @@ ${OS}
|
|
|
2249
2265
|
[--permission-mode plan|yolo] [--idle-timeout <duration>]
|
|
2250
2266
|
[--root <teamfile>] [--json]
|
|
2251
2267
|
|
|
2252
|
-
Send a prompt to a team member or raw provider session, or answer a paused run.`});var FS={};se(FS,{runExec:()=>
|
|
2253
|
-
`),2;let n=r.options,s=e.env??process.env,o=
|
|
2254
|
-
`),2}let l=await
|
|
2268
|
+
Send a prompt to a team member or raw provider session, or answer a paused run.`});var FS={};se(FS,{runExec:()=>oB});import{spawn as eB}from"node:child_process";import{hostname as tB}from"node:os";import{resolve as rB}from"node:path";async function oB(t,e={stdout:process.stdout,stderr:process.stderr}){let r=iB(t);if(r.help)return e.stdout.write(nB),0;if(r.error!==void 0||r.options===void 0)return e.stderr.write(`error: ${r.error??"invalid exec invocation"}
|
|
2269
|
+
`),2;let n=r.options,s=e.env??process.env,o=rB(e.cwd??process.cwd(),n.cwd??"."),i,a=null;try{i=await aB(e,s),n.root!==void 0&&(a=await R(e,d=>ye(n.root,d)))}catch(d){return e.stderr.write(`error: ${d instanceof Error?d.message:String(d)}
|
|
2270
|
+
`),2}let l=await lB(e,{fromIdentity:i,rootTeamfile:a,cwd:o,origin:"agent",command:n.command});cB(e,l,n.json);let c=uB(e,l?.id??null),u=await dB(n.command,o,s,e);return c!==void 0&&clearInterval(c),await fB(e,l?.id??null,u),pB(e,l?.id??null,u,n.json),_B(u)}function iB(t){if(t.includes("--help")||t.includes("-h"))return{help:!0};let e=t.indexOf("--");if(e<0)return{error:"lmctl exec requires -- before the command"};let r=li(t.slice(0,e),"exec");if(r.error!==void 0)return{error:r.error};let n=r.args,s=t.slice(e+1);if(s.length===0)return{error:"lmctl exec requires a command after --"};let o={json:!1,command:s};for(let i=0;i<n.length;i+=1){let a=n[i];if(a==="--json"){o.json=!0;continue}if(a==="--root"||a==="--cwd"){let l=n[i+1];if(l===void 0||l.startsWith("--"))return{error:`missing value for ${a}`};a==="--root"&&(o.root=l),a==="--cwd"&&(o.cwd=l),i+=1;continue}return a.startsWith("--")?{error:`unknown flag: ${a}`}:{error:`unexpected positional before --: ${a}`}}return{options:o}}async function aB(t,e){return await R(t,r=>{let n=ln(e,r);if(n.ok)return n.identity;throw n.reason==="unset"?new Error(gs("exec")):new Error(an("exec"))})}async function lB(t,e){try{return await R(t,r=>r.startTrackedInvocation({kind:"exec",origin:e.origin,scope_teamfile:e.rootTeamfile,from_identity:e.fromIdentity,target_teamfile:null,target_alias:null,root_teamfile:e.rootTeamfile,cwd:e.cwd,command:hB(e.command),holder_pid:process.pid,holder_host:tB(),meta:JSON.stringify({argv:e.command})}))}catch{return null}}function cB(t,e,r){if(e!==null){if(r){t.stdout.write(`${JSON.stringify({id:e.id,status:"running"})}
|
|
2255
2271
|
`);return}t.stdout.write(`exec invocation ${e.id} started
|
|
2256
|
-
`)}}function
|
|
2257
|
-
`),i({code:127,signal:null,spawnError:c}))}),l.on("close",(c,u)=>{a||(a=!0,i({code:c,signal:u}))})})}async function
|
|
2258
|
-
`)}function
|
|
2272
|
+
`)}}function uB(t,e){if(e===null)return;let r=setInterval(()=>{R(t,n=>n.heartbeatTrackedInvocation(e)).catch(()=>{})},sB);return r.unref?.(),r}async function dB(t,e,r,n){let[s,...o]=t;return await new Promise(i=>{let a=!1,l=eB(s,o,{cwd:e,env:r,shell:!1,stdio:["ignore","pipe","pipe"]});l.stdout.on("data",c=>n.stdout.write(c.toString("utf8"))),l.stderr.on("data",c=>n.stderr.write(c.toString("utf8"))),l.on("error",c=>{a||(a=!0,n.stderr.write(`error: failed to start command: ${c.message}
|
|
2273
|
+
`),i({code:127,signal:null,spawnError:c}))}),l.on("close",(c,u)=>{a||(a=!0,i({code:c,signal:u}))})})}async function fB(t,e,r){if(e!==null)try{await R(t,n=>n.finishTrackedInvocation(e,PS(r)))}catch{}}function PS(t){let e=t.spawnError===void 0&&t.signal===null&&t.code===0,r=mB(t);return{status:e?"done":"error",exit_code:t.code,signal:t.signal,result_summary:r,error:e?null:r}}function mB(t){return t.spawnError!==void 0?`spawn failed: ${t.spawnError.message}`:t.signal!==null?`terminated by signal ${t.signal}`:`exit ${t.code??1}`}function pB(t,e,r,n){if(!n||e===null)return;let s=PS(r);t.stdout.write(`${JSON.stringify({id:e,status:s.status,exit_code:s.exit_code,signal:s.signal})}
|
|
2274
|
+
`)}function _B(t){return t.spawnError!==void 0?127:t.signal!==null?1:typeof t.code=="number"?t.code:1}function hB(t){return t.map(e=>JSON.stringify(e)).join(" ")}var nB,sB,US=b(()=>{"use strict";ys();tt();ge();nB=`usage: lmctl exec [--root <teamfile>] [--cwd DIR] [--json] -- <command> [args...]
|
|
2259
2275
|
|
|
2260
2276
|
Run a command as a tracked invocation. (Launch N background invocations by backgrounding this command, then lmctl notify_me interactively returns the FIRST completion; no ids).
|
|
2261
2277
|
Arguments after -- are passed directly to the child process; no shell is used.
|
|
2262
2278
|
Use "lmctl exec -- sh -lc '<command>'" when shell expansion is desired.
|
|
2263
|
-
`,
|
|
2279
|
+
`,sB=3e4});function no(t){for(let e=t.length-1;e>=0;e-=1){let r=t[e],n=gB.exec(r.content);if(n===null){if(r.role==="assistant"&&r.content.trim().length>0)return null;continue}let s=Number.parseInt(n[1],10),o=n[2]===void 0?0:Number.parseInt(n[2],10),i=n[3].toLowerCase(),a=n[4]?.trim()??null,l=`${n[1]}${n[2]!==void 0?`:${n[2]}`:""}${i}`;return{state:"LIMITED",resets_at:a===null?null:yB(r.timestamp,s,o,i,a),reset_time:l,timezone:a,detected_at:r.timestamp.toISOString()}}return null}function yB(t,e,r,n,s){if(!Number.isFinite(t.getTime())||e<1||e>12||r<0||r>59)return null;let o=wB(e,n);try{let i=EB(t,s),a=WS(i.year,i.month,i.day,o,r,s);if(a.getTime()<=t.getTime()){let l=vB(i,1);a=WS(l.year,l.month,l.day,o,r,s)}return a.toISOString()}catch{return null}}function wB(t,e){return e==="am"?t===12?0:t:t===12?12:t+12}function EB(t,e){let r=BS(e,!1).formatToParts(t);return{year:Qt(r,"year"),month:Qt(r,"month"),day:Qt(r,"day")}}function WS(t,e,r,n,s,o){let i=Date.UTC(t,e-1,r,n,s,0,0);for(let a=0;a<3;a+=1){let l=TB(new Date(i),o);i=Date.UTC(t,e-1,r,n,s,0,0)-l}return new Date(i)}function TB(t,e){let r=BS(e,!0).formatToParts(t);return Date.UTC(Qt(r,"year"),Qt(r,"month")-1,Qt(r,"day"),Qt(r,"hour"),Qt(r,"minute"),Qt(r,"second"),0)-t.getTime()}function BS(t,e){let r=e?SB:bB,n=r.get(t);if(n!==void 0)return n;let s=new Intl.DateTimeFormat("en-US",{timeZone:t,hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",...e?{hour:"2-digit",minute:"2-digit",second:"2-digit"}:{}});return r.set(t,s),s}function Qt(t,e){let r=t.find(n=>n.type===e)?.value;if(r===void 0)throw new Error(`missing ${e}`);return Number.parseInt(r,10)}function vB(t,e){let r=new Date(Date.UTC(t.year,t.month-1,t.day+e));return{year:r.getUTCFullYear(),month:r.getUTCMonth()+1,day:r.getUTCDate()}}var gB,bB,SB,Vf=b(()=>{"use strict";gB=/you['\u2019]ve hit your session limit\s*(?:\u00b7|-|:)?\s*resets\s+([0-9]{1,2})(?::([0-9]{2}))?\s*(am|pm)\s*(?:\(([^)]+)\))?/i;bB=new Map,SB=new Map});var JS={};se(JS,{runRecover:()=>IB});import{dirname as qS,resolve as HS}from"node:path";async function IB(t,e,r={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${Yf}
|
|
2264
2280
|
`),0;let n=P(t.filter(p=>p!=="--"),[],["--all","--dry-run","--json"]);if(n.error!==void 0)return y(e,`${n.error}
|
|
2265
2281
|
|
|
2266
2282
|
${Yf}`);if(n.positionals.length===0)return y(e,`recover requires a <teamfile>
|
|
2267
2283
|
|
|
2268
|
-
${Yf}`);if(n.positionals.length>2)return y(e,`unexpected argument: ${n.positionals[2]}`);let s=n.positionals[0],o=jr(s),i=o?.teamfile??s,a=n.positionals[1],l=o?.alias??a;if(o!==null&&a!==void 0)return y(e,"recover alias was provided twice; use either <teamfile>:<alias> or <teamfile> <alias>");if(
|
|
2269
|
-
`)}return m.errors>0?1:0}async function
|
|
2270
|
-
`}var
|
|
2271
|
-
`)});var so,WZ,Zf=b(()=>{"use strict";so=[{name:"lmctl_chat",description:"Synchronous/blocking backup: send one prompt to a member of an AI-managed .lmctl team \u2014 addressed by teamfile path (team) and alias \u2014 and return the reply. This is the only MCP tool lmctl exposes. Prefer the CLI for normal delegation. For batch or long-running shell work, launch it through `lmctl exec -- <command> &` and wait for completion with `lmctl notify_me`.",inputSchema:{type:"object",properties:{team:{type:"string",description:"Path to .lmctl teamfile"},alias:{type:"string",description:"Target alias; omitted means Lead"},prompt:{type:"string",description:"Prompt text to send"}},required:["team","prompt"]},local:!0}],WZ=so.length});import{spawn as
|
|
2272
|
-
`).length})),o({status:"ok",data:{text:l.trim()||"(empty response)"}});return}o({status:"error",code:u??1,message:c.trim()||`lmctl chat exited with code ${u}`})})})}function
|
|
2273
|
-
`}async function VS(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(tm({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
|
|
2284
|
+
${Yf}`);if(n.positionals.length>2)return y(e,`unexpected argument: ${n.positionals[2]}`);let s=n.positionals[0],o=jr(s),i=o?.teamfile??s,a=n.positionals[1],l=o?.alias??a;if(o!==null&&a!==void 0)return y(e,"recover alias was provided twice; use either <teamfile>:<alias> or <teamfile> <alias>");if(C(n,"--all")&&l!==void 0)return y(e,"recover --all is mutually exclusive with <alias>");let c;try{c=await NB(e,i,l)}catch(p){if(p instanceof be)return y(e,p.message);throw p}let u=r.now??new Date,d=C(n,"--dry-run"),f=[];for(let p of c)f.push(await AB(e,p,{now:u,dryRun:d}));let m={checked:f.length,recovered:f.filter(p=>p.action==="recovered").length,wouldRecover:f.filter(p=>p.action==="would_recover").length,skipped:f.filter(p=>p.action!=="recovered"&&p.action!=="would_recover").length,errors:f.filter(p=>p.action==="load_error"||p.action==="send_error").length};if(C(n,"--json"))F(e,{dryRun:d,now:u.toISOString(),summary:m,members:f});else{for(let p of f)e.stdout.write(xB(p));e.stdout.write(`Recover checked ${m.checked}: ${d?`${m.wouldRecover} would recover`:`${m.recovered} recovered`}, ${m.skipped} skipped, ${m.errors} error(s).
|
|
2285
|
+
`)}return m.errors>0?1:0}async function NB(t,e,r){return await R(t,n=>{let s=ye(e,n);if(r!==void 0){let o=qe(s,n);if(o.parseErrors.length>0)throw new be(`lmctl: ${e}: ${o.parseErrors.join("; ")}`);let i=$o(o,r);return i?.teamfile!==void 0?zf(HS(qS(s),i.teamfile),n,new Set):[Pe(e,r,n)]}return zf(s,n,new Set)})}function zf(t,e,r){let n=ye(t,e);if(r.has(n))return[];r.add(n);let s=qe(n,e);if(s.parseErrors.length>0)throw new be(`lmctl: ${n}: ${s.parseErrors.join("; ")}`);let o=[];for(let i of s.members){if(i.teamfile!==void 0){o.push(...zf(HS(qS(n),i.teamfile),e,r));continue}i.session!==void 0&&o.push(Pe(n,i.alias,e))}return o}async function AB(t,e,r){let n;try{let a=await Xt(e.sessionid,e.provider);if(a===null)return jt(e,"session_not_found",null,"session detail not found");n=no(a.messages)}catch(a){return jt(e,"load_error",null,a instanceof Error?a.message:String(a))}if(n===null)return jt(e,"not_limited",null,"no current session-limit marker");if(n.resets_at===null)return jt(e,"unknown_reset",n,"reset time could not be parsed");let s=Date.parse(n.resets_at);if(!Number.isFinite(s))return jt(e,"unknown_reset",n,"reset time could not be parsed");if(s>r.now.getTime())return jt(e,"not_due",n,`resets_at ${n.resets_at} is in the future`);let o=await R(t,a=>a.getAgentInflight(e.teamfile,e.alias));if(o!==null)return jt(e,"busy",n,`in-flight since ${o.started_at}`);if(r.dryRun)return jt(e,"would_recover",n,null);let i=await ll({teamfile:e.teamfile,alias:e.alias,prompt:kB,permissionMode:"yolo",io:t,env:process.env});return i.status==="ok"||i.status==="stalled"?jt(e,"recovered",n,null):jt(e,i.status==="busy"?"busy":"send_error",n,i.message)}function jt(t,e,r,n){return{alias:t.alias,teamfile:t.teamfile,provider:t.provider,sessionid:t.sessionid,action:e,sessionLimit:r,reason:n}}function xB(t){let e=t.sessionLimit?.resets_at??"unknown",r=t.reason===null?"":` (${t.reason})`;return`${t.alias}: ${t.action} resets_at=${e}${r}
|
|
2286
|
+
`}var kB,Yf,XS=b(()=>{"use strict";Vf();Fr();vt();tt();xt();Kf();ge();kB="Your session limit reset time has passed. Continue your work from the last actionable point.",Yf=["usage: lmctl recover <teamfile> [--all|<alias>] [--dry-run] [--json]","","Wake team members whose latest provider output is a session-limit message","and whose resets_at time has passed. Defaults to the full teamfile report","subtree. A busy/in-flight member is skipped."].join(`
|
|
2287
|
+
`)});var so,WZ,Zf=b(()=>{"use strict";so=[{name:"lmctl_chat",description:"Synchronous/blocking backup: send one prompt to a member of an AI-managed .lmctl team \u2014 addressed by teamfile path (team) and alias \u2014 and return the reply. This is the only MCP tool lmctl exposes. Prefer the CLI for normal delegation. For batch or long-running shell work, launch it through `lmctl exec -- <command> &` and wait for completion with `lmctl notify_me`.",inputSchema:{type:"object",properties:{team:{type:"string",description:"Path to .lmctl teamfile"},alias:{type:"string",description:"Target alias; omitted means Lead"},prompt:{type:"string",description:"Prompt text to send"}},required:["team","prompt"]},local:!0}],WZ=so.length});import{spawn as RB}from"node:child_process";async function KS(t,e,r){let n=$B.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 OB(n.name,s)}function OB(t,e){return t==="lmctl_chat"?jB(e):{status:"error",code:404,message:`unknown local tool: ${t}`}}function jB(t){let e=typeof t.prompt=="string"?t.prompt:"";if(e.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: prompt"});let r=typeof t.team=="string"?t.team:"";if(r.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: team"});let n=typeof t.alias=="string"&&t.alias.length>0?t.alias:"Lead",s=["chat",r,n,e];return ue()&&je(JSON.stringify({event:"mcp_chat_spawn",team:r,alias:n})),CB(s,process.cwd())}function CB(t,e){return new Promise(r=>{let n=!1,s,o=u=>{n||(n=!0,s!==void 0&&clearTimeout(s),r(u))},i=RB("lmctl",t,{cwd:e,env:process.env,stdio:["ignore","pipe","pipe"]}),a=MB(process.env);s=setTimeout(()=>{try{i.kill("SIGTERM")}catch{}o({status:"error",code:124,message:`lmctl chat timed out after ${a}ms`})},a),s.unref?.();let l="",c="";i.stdout?.on("data",u=>{l+=u.toString("utf8")}),i.stderr?.on("data",u=>{c+=u.toString("utf8")}),i.on("error",u=>{o({status:"error",code:1,message:`failed to spawn lmctl chat: ${u.message}`})}),i.on("exit",u=>{if(u===0){ue()&&je(JSON.stringify({event:"mcp_chat_payload",bytes:Buffer.byteLength(l,"utf8"),lines:l.split(`
|
|
2288
|
+
`).length})),o({status:"ok",data:{text:l.trim()||"(empty response)"}});return}o({status:"error",code:u??1,message:c.trim()||`lmctl chat exited with code ${u}`})})})}function MB(t){let e=t.LMCTL_MCP_CHAT_TIMEOUT_MS;if(e===void 0||e.trim().length===0)return GS;let r=Number(e);return!Number.isFinite(r)||r<=0?GS:r}function Qf(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:LB),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 LB,GS,$B,em=b(()=>{"use strict";Zf();ve();LB="http://127.0.0.1:8787",GS=30*60*1e3,$B=new Map(so.map(t=>[t.name,t]))});async function UB(t,e){let r=t.id===void 0,n=t.id??null;if(t.method==="exit")return r||e.io.write(tm({jsonrpc:"2.0",id:n,result:null})),{kind:"exit"};if(t.method==="initialize")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{protocolVersion:DB,capabilities:{tools:{listChanged:!1}},serverInfo:{name:PB,version:FB}}}};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:so.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 KS(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 tm(t){return`${JSON.stringify(t)}
|
|
2289
|
+
`}async function VS(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(tm({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 UB(l,t);c.kind==="response"?t.io.write(tm(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(`
|
|
2274
2290
|
`);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(`
|
|
2275
2291
|
`)}};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}
|
|
2276
|
-
`),a.finally(()=>c(1))})})}var
|
|
2277
|
-
`),2;z({event:"mcp_bridge_start",pid:process.pid});let n=e.dal===void 0,s=e.dal??
|
|
2292
|
+
`),a.finally(()=>c(1))})})}var DB,PB,FB,YS=b(()=>{"use strict";Zf();em();DB="2025-06-18",PB="lmctl",FB="0.0.1"});var ZS={};se(ZS,{runMcp:()=>BB});async function BB(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(WB),0;if(t.length>0)return e.stderr.write(`usage: lmctl mcp
|
|
2293
|
+
`),2;z({event:"mcp_bridge_start",pid:process.pid});let n=e.dal===void 0,s=e.dal??qB(),o=1;try{let i=s===void 0?Qf({getConfig:()=>null},process.env):Qf(s,process.env);return o=await VS({io:{write:l=>e.stdout.write(l),log:l=>e.stderr.write(l)},dispatch:{config:i,...s!==void 0?{dal:s}:{}}},r),o}finally{z({event:"mcp_bridge_exit",pid:process.pid,exit_code:o}),n&&s!==void 0&&s.close()}}function qB(){let t=le(),e=3;for(let r=1;r<=e;r+=1)try{return he({path:t})}catch(n){let s=n instanceof Error?n.message:String(n);if(z({event:"mcp_bridge_db_open_failed",pid:process.pid,attempt:r,db_path:t,error_message:s}),r<e&&zS(s))HB(50*r);else if(!zS(s))break}}function zS(t){return/SQLITE_BUSY|database is locked|database is busy/i.test(t)}function HB(t){let e=new Int32Array(new SharedArrayBuffer(4));Atomics.wait(e,0,0,t)}var WB,QS=b(()=>{"use strict";Be();em();YS();ve();Ve();WB=`usage: lmctl mcp
|
|
2278
2294
|
|
|
2279
2295
|
Start the stdio MCP bridge. The bridge resolves api.url and api.token from
|
|
2280
2296
|
local config, then uses stdin/stdout for JSON-RPC frames.
|
|
2281
|
-
`});function oo(t){switch(t.kind){case"run_stale":return`run_stale:${t.run_id}`;case"stuck_job":return`stuck_job:${t.job_id}`;case"attentions_overdue":return`attentions_overdue:${t.project_id??"global"}`;case"issues_overdue":return`issues_overdue:${t.project_id??"global"}`}}var ev=b(()=>{"use strict"});function
|
|
2297
|
+
`});function oo(t){switch(t.kind){case"run_stale":return`run_stale:${t.run_id}`;case"stuck_job":return`stuck_job:${t.job_id}`;case"attentions_overdue":return`attentions_overdue:${t.project_id??"global"}`;case"issues_overdue":return`issues_overdue:${t.project_id??"global"}`}}var ev=b(()=>{"use strict"});function JB(t){return{stale_run_minutes:ao(t,"monitor.stale_run_minutes",io.stale_run_minutes),old_attention_days:ao(t,"monitor.old_attention_days",io.old_attention_days),old_issue_days:ao(t,"monitor.old_issue_days",io.old_issue_days),stuck_job_minutes:ao(t,"monitor.stuck_job_minutes",io.stuck_job_minutes),dedupe_window_hours:ao(t,"monitor.dedupe_window_hours",io.dedupe_window_hours)}}function ao(t,e,r){let n=t.getConfig(e);if(n===null)return r;let s=Number.parseInt(n,10);return!Number.isFinite(s)||s<=0?r:s}function tv(t,e={}){let r=e.now??new Date,n=JB(t),s=[];for(let o of XB(t,n,r))s.push(o);for(let o of GB(t,n,r))s.push(o);for(let o of KB(t,n,r))s.push(o);for(let o of VB(t,n,r))s.push(o);return{findings:s,scanned_at:r.toISOString(),config:n}}function XB(t,e,r){let n=rv(r,e.stale_run_minutes).toISOString(),s=t.db.prepare(`
|
|
2282
2298
|
SELECT r.id AS id,
|
|
2283
2299
|
r.job_id AS job_id,
|
|
2284
2300
|
w.name AS workflow_name,
|
|
@@ -2289,12 +2305,12 @@ local config, then uses stdin/stdout for JSON-RPC frames.
|
|
|
2289
2305
|
WHERE r.terminal_state IS NULL
|
|
2290
2306
|
AND r.paused_at IS NULL
|
|
2291
2307
|
AND r.started_at <= ?
|
|
2292
|
-
`).all(n),o=[];for(let i of s){let a={kind:"run_stale",run_id:i.id},l=oo(a),c={dedupe_key:l,run_id:i.id,job_id:i.job_id,workflow_name:i.workflow_name,started_at:i.started_at,last_event_at:i.last_event_ms===null?null:new Date(i.last_event_ms).toISOString(),threshold_minutes:e.stale_run_minutes},u=`run ${i.id} (${i.workflow_name}) stale since ${i.started_at}`;o.push(cl(t,{kind:"run_stale",severity:"warning",project_id:null,run_id:i.id,payload:c,dedupe_key:l,summary:u,config:e,now:r}))}return o}function
|
|
2308
|
+
`).all(n),o=[];for(let i of s){let a={kind:"run_stale",run_id:i.id},l=oo(a),c={dedupe_key:l,run_id:i.id,job_id:i.job_id,workflow_name:i.workflow_name,started_at:i.started_at,last_event_at:i.last_event_ms===null?null:new Date(i.last_event_ms).toISOString(),threshold_minutes:e.stale_run_minutes},u=`run ${i.id} (${i.workflow_name}) stale since ${i.started_at}`;o.push(cl(t,{kind:"run_stale",severity:"warning",project_id:null,run_id:i.id,payload:c,dedupe_key:l,summary:u,config:e,now:r}))}return o}function GB(t,e,r){let n=rv(r,e.stuck_job_minutes).toISOString(),s=t.db.prepare(`
|
|
2293
2309
|
SELECT id, project_id, source, source_ref, status, enqueued_at
|
|
2294
2310
|
FROM job
|
|
2295
2311
|
WHERE status NOT IN ('done', 'failed')
|
|
2296
2312
|
AND enqueued_at <= ?
|
|
2297
|
-
`).all(n),o=[];for(let i of s){let a={kind:"stuck_job",job_id:i.id},l=oo(a),c={dedupe_key:l,job_id:i.id,project_id:i.project_id,source:i.source,source_ref:i.source_ref,status:i.status,enqueued_at:i.enqueued_at,threshold_minutes:e.stuck_job_minutes},u=`job ${i.id} (${i.source}) stuck in ${i.status} since ${i.enqueued_at}`;o.push(cl(t,{kind:"stuck_job",severity:"warning",project_id:i.project_id,run_id:null,payload:c,dedupe_key:l,summary:u,config:e,now:r}))}return o}function
|
|
2313
|
+
`).all(n),o=[];for(let i of s){let a={kind:"stuck_job",job_id:i.id},l=oo(a),c={dedupe_key:l,job_id:i.id,project_id:i.project_id,source:i.source,source_ref:i.source_ref,status:i.status,enqueued_at:i.enqueued_at,threshold_minutes:e.stuck_job_minutes},u=`job ${i.id} (${i.source}) stuck in ${i.status} since ${i.enqueued_at}`;o.push(cl(t,{kind:"stuck_job",severity:"warning",project_id:i.project_id,run_id:null,payload:c,dedupe_key:l,summary:u,config:e,now:r}))}return o}function KB(t,e,r){let n=nv(r,e.old_attention_days).toISOString(),s=t.db.prepare(`
|
|
2298
2314
|
SELECT project_id,
|
|
2299
2315
|
COUNT(*) AS count,
|
|
2300
2316
|
(SELECT kind FROM attention a2
|
|
@@ -2309,7 +2325,7 @@ local config, then uses stdin/stdout for JSON-RPC frames.
|
|
|
2309
2325
|
AND kind NOT IN ('attentions_overdue', 'issues_overdue')
|
|
2310
2326
|
AND created_at <= ?
|
|
2311
2327
|
GROUP BY project_id
|
|
2312
|
-
`).all(n,n),o=[];for(let i of s){let a={kind:"attentions_overdue",project_id:i.project_id},l=oo(a),c={dedupe_key:l,count:i.count,oldest_kind:i.oldest_kind,oldest_at:i.oldest_at,project_id:i.project_id,threshold_days:e.old_attention_days},u=i.project_id===null?"global":`project ${i.project_id}`,d=`${i.count} attention(s) overdue (${u}; oldest: ${i.oldest_kind})`;o.push(cl(t,{kind:"attentions_overdue",severity:"warning",project_id:i.project_id,run_id:null,payload:c,dedupe_key:l,summary:d,config:e,now:r}))}return o}function
|
|
2328
|
+
`).all(n,n),o=[];for(let i of s){let a={kind:"attentions_overdue",project_id:i.project_id},l=oo(a),c={dedupe_key:l,count:i.count,oldest_kind:i.oldest_kind,oldest_at:i.oldest_at,project_id:i.project_id,threshold_days:e.old_attention_days},u=i.project_id===null?"global":`project ${i.project_id}`,d=`${i.count} attention(s) overdue (${u}; oldest: ${i.oldest_kind})`;o.push(cl(t,{kind:"attentions_overdue",severity:"warning",project_id:i.project_id,run_id:null,payload:c,dedupe_key:l,summary:d,config:e,now:r}))}return o}function VB(t,e,r){let n=nv(r,e.old_issue_days).toISOString(),s=t.db.prepare(`
|
|
2313
2329
|
SELECT project_id,
|
|
2314
2330
|
COUNT(*) AS count,
|
|
2315
2331
|
(SELECT title FROM project_issue i2
|
|
@@ -2322,23 +2338,23 @@ local config, then uses stdin/stdout for JSON-RPC frames.
|
|
|
2322
2338
|
WHERE status IN ('open', 'reopened')
|
|
2323
2339
|
AND created_at <= ?
|
|
2324
2340
|
GROUP BY project_id
|
|
2325
|
-
`).all(n,n),o=[];for(let i of s){let a={kind:"issues_overdue",project_id:i.project_id},l=oo(a),c={dedupe_key:l,count:i.count,oldest_title:i.oldest_title,oldest_at:i.oldest_at,project_id:i.project_id,threshold_days:e.old_issue_days},u=`${i.count} issue(s) overdue in project ${i.project_id} (oldest: ${
|
|
2341
|
+
`).all(n,n),o=[];for(let i of s){let a={kind:"issues_overdue",project_id:i.project_id},l=oo(a),c={dedupe_key:l,count:i.count,oldest_title:i.oldest_title,oldest_at:i.oldest_at,project_id:i.project_id,threshold_days:e.old_issue_days},u=`${i.count} issue(s) overdue in project ${i.project_id} (oldest: ${ZB(i.oldest_title,40)})`;o.push(cl(t,{kind:"issues_overdue",severity:"warning",project_id:i.project_id,run_id:null,payload:c,dedupe_key:l,summary:u,config:e,now:r}))}return o}function cl(t,e){let r=YB(t,e.dedupe_key,e.now,e.config.dedupe_window_hours);if(r!==null)return{kind:e.kind,emitted:!1,dedupe_key:e.dedupe_key,attention_id:r.id,summary:e.summary};let n=t.raiseAttention({kind:e.kind,severity:e.severity,project_id:e.project_id,run_id:e.run_id,payload:JSON.stringify(e.payload)});return{kind:e.kind,emitted:!0,dedupe_key:e.dedupe_key,attention_id:n.id,summary:e.summary}}function YB(t,e,r,n){let s=zB(r,n).toISOString(),o=`%"dedupe_key":"${e}"%`;return t.db.prepare(`
|
|
2326
2342
|
SELECT * FROM attention
|
|
2327
2343
|
WHERE acknowledged_at IS NULL
|
|
2328
2344
|
AND created_at >= ?
|
|
2329
2345
|
AND payload LIKE ?
|
|
2330
2346
|
ORDER BY id DESC
|
|
2331
2347
|
LIMIT 1
|
|
2332
|
-
`).get(s,o)??null}function rv(t,e){return new Date(t.getTime()-e*60*1e3)}function
|
|
2333
|
-
`),0})}catch(o){return _e(e,o)}}function ov(t){let e=t.filter(o=>o.emitted);if(e.length===0)return"monitor: 0 findings";let r=new Map;for(let o of e)r.set(o.kind,(r.get(o.kind)??0)+1);let n=[],s=["run_stale","stuck_job","attentions_overdue","issues_overdue"];for(let o of s){let i=r.get(o);i===void 0||i===0||n.push(`${i} ${
|
|
2348
|
+
`).get(s,o)??null}function rv(t,e){return new Date(t.getTime()-e*60*1e3)}function zB(t,e){return new Date(t.getTime()-e*60*60*1e3)}function nv(t,e){return new Date(t.getTime()-e*24*60*60*1e3)}function ZB(t,e){return t.length<=e?t:`${t.slice(0,e-1)}\u2026`}var io,sv=b(()=>{"use strict";ev();io={stale_run_minutes:30,old_attention_days:7,old_issue_days:14,stuck_job_minutes:60,dedupe_window_hours:24}});var iv={};se(iv,{renderSummary:()=>ov,runMonitor:()=>eq});async function eq(t,e){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(QB),0;let r=P(t,[],["--json","--quiet"]);if(r.error!==void 0)return y(e,r.error);if(r.positionals.length>0)return y(e,`unknown argument: ${r.positionals[0]}`);let n=C(r,"--json"),s=C(r,"--quiet");try{return await R(e,o=>{let i=tv(o);return n?F(e,i):s||e.stdout.write(`${ov(i.findings)}
|
|
2349
|
+
`),0})}catch(o){return _e(e,o)}}function ov(t){let e=t.filter(o=>o.emitted);if(e.length===0)return"monitor: 0 findings";let r=new Map;for(let o of e)r.set(o.kind,(r.get(o.kind)??0)+1);let n=[],s=["run_stale","stuck_job","attentions_overdue","issues_overdue"];for(let o of s){let i=r.get(o);i===void 0||i===0||n.push(`${i} ${tq(o,i)}`)}return`monitor: ${e.length} findings (${n.join(", ")})`}function tq(t,e){switch(t){case"run_stale":return e===1?"stale run":"stale runs";case"stuck_job":return e===1?"stuck job":"stuck jobs";case"attentions_overdue":return"attentions overdue";case"issues_overdue":return"issues overdue"}}var QB,av=b(()=>{"use strict";ge();sv();QB=`usage: lmctl monitor [--json] [--quiet]
|
|
2334
2350
|
|
|
2335
2351
|
Scan the DB for stale runs, stuck jobs, overdue attentions, and overdue
|
|
2336
2352
|
issues; emit findings as attentions for the operator/master to handle.
|
|
2337
|
-
`});var lv={};se(lv,{runDevice:()=>
|
|
2353
|
+
`});var lv={};se(lv,{runDevice:()=>fq});import{readFileSync as rq}from"node:fs";import{homedir as nq}from"node:os";import{join as sq}from"node:path";import{CognitoIdentityClient as oq,GetIdCommand as iq}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as aq}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as lq,ListObjectsV2Command as cq,PutObjectCommand as uq,S3Client as dq}from"@aws-sdk/client-s3";async function fq(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(rm),0;if(r==="init"){let n=Mf();return e.stdout.write(`${n.device_id}
|
|
2338
2354
|
`),0}if(r==="id"){let n=Jr();return n===null?(e.stderr.write(`error: no device id initialized at ${rl()}; run 'lmctl device init'
|
|
2339
2355
|
`),1):(e.stdout.write(`${n.device_id}
|
|
2340
|
-
`),0)}return r==="login"?await
|
|
2341
|
-
`),1)}async function
|
|
2356
|
+
`),0)}return r==="login"?await mq(t.slice(1),e):r==="prompt"?await _q(t.slice(1),e):(e.stderr.write(`usage: lmctl device <id|init|login|prompt>
|
|
2357
|
+
`),1)}async function mq(t,e){let r=pq(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
2342
2358
|
${rm}`),2;let n=ro();if(n.config===void 0)return e.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
|
|
2343
2359
|
`),1;Ob({userId:r.userId,refreshToken:r.accessKey});let s,o,i;try{let c=await Ya({region:n.config.region,clientId:n.config.cognitoClientId??tl,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}
|
|
2344
2360
|
`),1}let a=Qs(s);if(a!==null&&a!==r.userId)return e.stderr.write(`error: access key belongs to user-id ${a}, not ${r.userId}
|
|
@@ -2346,10 +2362,10 @@ ${rm}`),2;let n=ro();if(n.config===void 0)return e.stderr.write(`error: mailbox
|
|
|
2346
2362
|
device id: ${l.device_id}
|
|
2347
2363
|
mailbox prefix: ${r.userId}/${l.device_id}/
|
|
2348
2364
|
access key stored at ${eo()}
|
|
2349
|
-
`),0}function
|
|
2365
|
+
`),0}function pq(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 _q(t,e){let r=hq(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
2350
2366
|
${rm}`),2;let n=ro();if(n.config===void 0)return e.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
|
|
2351
|
-
`),1;let s=
|
|
2352
|
-
`),0}function
|
|
2367
|
+
`),1;let s=yq();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 gq({region:n.config.region,identityPoolId:n.config.identityPoolId,idpProvider:i,idToken:o}),l=aq({identityId:a,logins:{[i]:o},clientConfig:{region:n.config.region}}),c=n.config.deviceId??Jr()?.device_id,u=Qs(o)??void 0,d=new Hr({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 dq({region:n.config.region,credentials:l}),commands:{ListObjectsV2Command:cq,GetObjectCommand:lq,PutObjectCommand:uq},selfRole:"browser",onMessage:async()=>{}}),f=bb({root_teamfile:r.root,text:r.text,...r.promptId!==void 0?{prompt_id:r.promptId}:{}}),m=await d.putMessage({conversation_id:Tb,payload:f});return e.stdout.write(JSON.stringify({prompt_id:f.prompt_id,mailbox_key:d.getMailboxBasePrefix(),object_key:m},null,2)+`
|
|
2368
|
+
`),0}function hq(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 gq(t){let r=await new oq({region:t.region}).send(new iq({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 yq(t=process.env.LMCTL_TOKEN_PATH??sq(nq(),".lmctl","cli-tokens.json")){try{return JSON.parse(rq(t,"utf8"))}catch{return null}}var rm,cv=b(()=>{"use strict";Df();Lf();ja();Sf();vf();Af();kf();rm=`usage: lmctl device <id|init|login|prompt>
|
|
2353
2369
|
lmctl device login --user-id <sub> --access-key <refreshToken>
|
|
2354
2370
|
lmctl device prompt --root <teamfile> --text <prompt> [--prompt-id <id>]
|
|
2355
2371
|
|
|
@@ -2359,22 +2375,22 @@ addressing. The id is stored in ~/.lmctl/device.json by default.
|
|
|
2359
2375
|
'lmctl device login' authenticates this machine's 'lmctl serve' daemon to the
|
|
2360
2376
|
cloud mailbox using your user-id (Cognito sub) and an access key (refresh
|
|
2361
2377
|
token). The access key is stored in ~/.lmctl/device-auth.json (chmod 600).
|
|
2362
|
-
`});var dv={};se(dv,{runTeam:()=>
|
|
2378
|
+
`});var dv={};se(dv,{runTeam:()=>Tq});import{join as wq}from"node:path";async function Tq(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(Eq),0;try{return await R(e,async s=>{switch(r){case"create":return Sq(n,e,s);case"list":return vq(n,e,s);case"show":return kq(n,e,s);case"add-member":return Iq(n,e,s);case"seed":return uv(n,e,s,!1);case"refresh":return uv(n,e,s,!0);case"companion":return Aq(n,e,s);case"list-roots":return bq(n,e,s);default:return y(e,"usage: lmctl team <create|list|show|add-member|seed|refresh|companion|list-roots>")}})}catch(s){return _e(e,s)}}function bq(t,e,r){let n=P(t,[]);if(n.error!==void 0)return y(e,n.error);if(n.positionals.length>0)return y(e,"usage: team list-roots [--json]");let s=r.listRootTeams();return C(n,"--json")?F(e,s):e.stdout.write(s.map(o=>`${o.name??"(unnamed)"} ${o.teamfile_path} ${o.last_seeded_at??""}`).join(`
|
|
2363
2379
|
`)+(s.length>0?`
|
|
2364
|
-
`:"")),0}function
|
|
2365
|
-
`),0}function
|
|
2380
|
+
`:"")),0}function Sq(t,e,r){let[n]=t;if(n===void 0)return y(e,"usage: team create <name>");let s=r.insertTeam({name:n});return e.stdout.write(`created team ${s.name}
|
|
2381
|
+
`),0}function vq(t,e,r){let n=P(t,[]);if(n.error!==void 0)return y(e,n.error);let s=r.listTeams();return C(n,"--json")?F(e,s):e.stdout.write(`${s.map(o=>`${o.id} ${o.name}`).join(`
|
|
2366
2382
|
`)}${s.length>0?`
|
|
2367
|
-
`:""}`),0}function
|
|
2368
|
-
`);for(let a of i)e.stdout.write(`- ${a.alias} ${
|
|
2369
|
-
`)}return 0}function
|
|
2370
|
-
`),0}async function uv(t,e,r,n){let s=P(t,["--alias"]);if(s.error!==void 0)return y(e,s.error);let[o]=s.positionals;if(o===void 0)return y(e,n?"usage: team refresh <team-name> --alias A":"usage: team seed <team-name> [--alias A]");let i=r.findTeamByName(o);if(i===null)return y(e,`team not found: ${o}`);let a=L(s,"--alias");if(n&&a===void 0)return y(e,"team refresh requires --alias");if(n&&a!==void 0&&a.trim().toLowerCase()==="lead")return y(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let l=
|
|
2383
|
+
`:""}`),0}function kq(t,e,r){let n=P(t,[]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: team show <name> [--json]");let o=r.findTeamByName(s);if(o===null)return y(e,`team not found: ${s}`);let i=r.listTeamMembers(o.id);if(C(n,"--json"))F(e,{team:o,members:i});else{e.stdout.write(`team ${o.name}
|
|
2384
|
+
`);for(let a of i)e.stdout.write(`- ${a.alias} ${xe(a)} ${a.sessionid??"(unseeded)"}
|
|
2385
|
+
`)}return 0}function Iq(t,e,r){let n=P(t,["--alias","--provider","--model","--role","--sessiondir"]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: team add-member <team-name> --alias A --provider P [--model M] [--role R] [--sessiondir D]");let o=r.findTeamByName(s);if(o===null)return y(e,`team not found: ${s}`);let i=L(n,"--alias"),a=L(n,"--provider");if(i===void 0||a===void 0)return y(e,"team add-member requires --alias and --provider");let l=r.insertTeamMember({team_id:o.id,alias:i,provider:a,model:L(n,"--model")??null,role:L(n,"--role")??"agent",sessiondir:L(n,"--sessiondir")??wq(vr(),"sessions",o.name,i)});return C(n,"--json")?F(e,l):e.stdout.write(`added member ${l.alias} to ${o.name}
|
|
2386
|
+
`),0}async function uv(t,e,r,n){let s=P(t,["--alias"]);if(s.error!==void 0)return y(e,s.error);let[o]=s.positionals;if(o===void 0)return y(e,n?"usage: team refresh <team-name> --alias A":"usage: team seed <team-name> [--alias A]");let i=r.findTeamByName(o);if(i===null)return y(e,`team not found: ${o}`);let a=L(s,"--alias");if(n&&a===void 0)return y(e,"team refresh requires --alias");if(n&&a!==void 0&&a.trim().toLowerCase()==="lead")return y(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let l=Nq(r.listTeamMembers(i.id),a,n);if(a!==void 0&&l.length===0)return y(e,`member not found or already seeded: ${a}`);if(n&&l.some(f=>f.alias.toLowerCase()==="lead"||f.role==="lead"))return y(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let c=new Set;for(let f of r.listProjects().filter(m=>m.team_id===i.id)){if(c.has(f.workflow_name))continue;c.add(f.workflow_name);let m=r.getWorkflowByName(f.workflow_name);if(m===null)continue;let p=bE(f.workflow_name,m.definition);if(p.status==="FAIL")return y(e,`cannot seed team \`${i.name}\`: workflow \`${f.workflow_name}\` failed verify-at-seed \u2014 ${p.note}. Fix the workflow and retry; NO members were seeded (no side-effects).`)}for(let f of r.listProjects().filter(m=>m.team_id===i.id))xi(f,r),Li(f);let u=[],d=!1;for(let f of l){let m=await fn({member:f,dal:r}),p=r.updateTeamMemberSession(f.id,m.sessionid);if(p!==null){let _=p.role_prompt??"",g=_.length>0?`${_}
|
|
2371
2387
|
|
|
2372
|
-
${hn}`:hn;r.setMemberPromptSnapshot(f.id,g),u.push(p);let h=gn(
|
|
2388
|
+
${hn}`:hn;r.setMemberPromptSnapshot(f.id,g),u.push(p);let h=gn(xe(p),m.sessionid);h!==null&&e.stderr.write(`[seeded ${p.alias}] customize/compact in its native TUI:
|
|
2373
2389
|
${h}
|
|
2374
2390
|
`);try{await Xi({dal:r,member:p,stderr:e.stderr})}catch(T){d=!0,e.stderr.write(`error: ${T instanceof Error?T.message:String(T)}
|
|
2375
|
-
`)}}}return
|
|
2376
|
-
`),d?1:0}function
|
|
2377
|
-
`),0}var
|
|
2391
|
+
`)}}}return C(s,"--json")?F(e,u):e.stdout.write(`seeded ${u.length} member(s)
|
|
2392
|
+
`),d?1:0}function Nq(t,e,r){return t.filter(n=>e!==void 0&&n.alias!==e?!1:r||n.sessionid===null)}function Aq(t,e,r){let n=P(t,["--interpreter","--of"]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: team companion <team-name> --interpreter A --of B[,C]");let o=r.findTeamByName(s);if(o===null)return y(e,`team not found: ${s}`);let i=L(n,"--interpreter"),a=L(n,"--of")?.split(",").map(c=>c.trim()).filter(Boolean);if(i===void 0||a===void 0||a.length===0)return y(e,"team companion requires --interpreter and --of");let l=r.findTeamMemberByAlias(o.id,i);if(l===null)return y(e,`member not found: ${i}`);for(let c of a){let u=r.findTeamMemberByAlias(o.id,c);if(u===null)return y(e,`member not found: ${c}`);r.insertTeamMemberCompanion({interpreter_id:l.id,companion_id:u.id})}return e.stdout.write(`recorded ${a.length} companion link(s)
|
|
2393
|
+
`),0}var Eq,fv=b(()=>{"use strict";Ve();di();As();Lu();Be();Fr();Xu();va();ge();$u();Eq=`usage: lmctl team create <name>
|
|
2378
2394
|
lmctl team list [--json]
|
|
2379
2395
|
lmctl team show <name> [--json]
|
|
2380
2396
|
lmctl team add-member <team-name> --alias A --provider P [--model M] [--role R] [--sessiondir D] [--json]
|
|
@@ -2385,8 +2401,8 @@ ${hn}`:hn;r.setMemberPromptSnapshot(f.id,g),u.push(p);let h=gn(Ae(p),m.sessionid
|
|
|
2385
2401
|
|
|
2386
2402
|
Manage DB-backed teams, members, and provider session lifecycle. Use seed or
|
|
2387
2403
|
refresh to create/update native provider sessions for team members.
|
|
2388
|
-
`});var wv={};se(wv,{applyMaxBytes:()=>ul,renderMessage:()=>gv,runTail:()
|
|
2389
|
-
`),0;let r=P(t,["--lines","--max-bytes","--watch-interval","--provider","--session","--run"],["--watch","--help"]);if(r.error!==void 0)return y(e,r.error);let n=L(r,"--lines"),s=L(r,"--max-bytes");if(n!==void 0&&s!==void 0)return y(e,"--lines and --max-bytes are mutually exclusive (choose one)");let o;if(n!==void 0){let m=Number.parseInt(n,10);if(!Number.isFinite(m)||m<1||String(m)!==n)return y(e,`invalid --lines "${n}" (expected a positive integer)`);o={kind:"lines",lines:m}}else{let m=s===void 0?
|
|
2404
|
+
`});var wv={};se(wv,{applyMaxBytes:()=>ul,renderMessage:()=>gv,runTail:()=>Oq});async function Oq(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${$q}
|
|
2405
|
+
`),0;let r=P(t,["--lines","--max-bytes","--watch-interval","--provider","--session","--run"],["--watch","--help"]);if(r.error!==void 0)return y(e,r.error);let n=L(r,"--lines"),s=L(r,"--max-bytes");if(n!==void 0&&s!==void 0)return y(e,"--lines and --max-bytes are mutually exclusive (choose one)");let o;if(n!==void 0){let m=Number.parseInt(n,10);if(!Number.isFinite(m)||m<1||String(m)!==n)return y(e,`invalid --lines "${n}" (expected a positive integer)`);o={kind:"lines",lines:m}}else{let m=s===void 0?Rq:Number.parseInt(s,10);if(!Number.isFinite(m)||m<0||s!==void 0&&String(m)!==s)return y(e,`invalid --max-bytes "${s}" (expected a non-negative integer)`);o={kind:"bytes",maxBytes:m}}let i=C(r,"--watch"),a=L(r,"--watch-interval"),l=a===void 0?Lq:Number.parseInt(a.replace(/s$/,""),10);if(!Number.isFinite(l)||l<1)return y(e,`invalid --watch-interval "${a}" (expected <N>s, N\u22651)`);if(r.positionals.length>2)return y(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let c=L(r,"--run");if(c!==void 0){if(r.positionals.length>0)return y(e,"--run is mutually exclusive with positional [target] [alias]");if(L(r,"--session")!==void 0)return y(e,"--run is mutually exclusive with --session");if(L(r,"--provider")!==void 0)return y(e,"--run is mutually exclusive with --provider");let m=Number.parseInt(c,10);if(!Number.isFinite(m)||m<=0||String(m)!==c)return y(e,`invalid --run "${c}" (expected a positive integer run id)`);try{return await R(e,async p=>jq(e,p,m,o,i,l))}catch(p){return _e(e,p)}}let u=ur(xq,{target:r.positionals[0],alias:r.positionals[1],flags:{session:L(r,"--session"),provider:L(r,"--provider")}});if(u.mode==="error")return y(e,u.message);if(u.mode==="managed")return y(e,"tail managed mode requires --run <id>");let d;if(u.mode==="ai-team")if(u.alias===void 0){let m;try{m=await R(e,g=>ye(u.teamfile,g))}catch(g){return y(e,`tail: ${g instanceof Error?g.message:String(g)}`)}let p;try{p=Me(m)}catch(g){return y(e,`tail: ${g instanceof Error?g.message:String(g)}`)}let _=et(p);if(_===void 0)return y(e,`tail: ${u.teamfile} has no Lead member; pass <tf>:<alias>`);try{let g=await R(e,h=>Pe(u.teamfile,_.alias,h));d={provider:g.provider,sessionId:g.sessionid,cwd:g.sessiondir}}catch(g){return g instanceof be?y(e,g.message):_e(e,g)}}else try{let m=await R(e,p=>Pe(u.teamfile,u.alias,p));d={provider:m.provider,sessionId:m.sessionid,cwd:m.sessiondir}}catch(m){return m instanceof be?y(e,m.message):_e(e,m)}else{let m=u.sessionid,p=u.provider;if(p===void 0){let _=await Oi(m);if(_.length===0)return y(e,`tail: session "${m}" not found in any provider store`);if(_.length>1)return y(e,`tail: session "${m}" matches multiple providers (${_.join(", ")}); pass --provider`);p=_[0]}d={provider:p,sessionId:m}}let f=await mv(e,d.provider,d.sessionId,o,-1);return f<0?1:i?await new Promise(m=>{let p=async()=>{try{let h=await mv(e,d.provider,d.sessionId,o,f);h>=0&&(f=h)}catch(h){e.stderr.write(`tail: ${h instanceof Error?h.message:String(h)}
|
|
2390
2406
|
`)}},_=setInterval(()=>{p()},l*1e3),g=()=>{clearInterval(_),m(0)};process.once("SIGINT",g),process.once("SIGTERM",g)}):0}async function mv(t,e,r,n,s){let o;try{o=await Xt(r,e)}catch(c){return t.stderr.write(`tail: failed to load session: ${c instanceof Error?c.message:String(c)}
|
|
2391
2407
|
`),-1}if(o===null)return t.stderr.write(`tail: session not found: ${r} (provider=${e})
|
|
2392
2408
|
`),-1;let i=o.messages??[],a=s<0&&n.kind==="lines"?Math.max(0,i.length-n.lines):s+1;if(a>=i.length)return i.length-1;let l="";for(let c=a;c<i.length;c+=1)l+=`${gv(i[c])}
|
|
@@ -2395,18 +2411,18 @@ refresh to create/update native provider sessions for team members.
|
|
|
2395
2411
|
`).split(`
|
|
2396
2412
|
`),o=s[0]??"",i=s.slice(1);return i.length===0?`${r}: ${o}`:`${r}: ${o}
|
|
2397
2413
|
${i.map(a=>` ${a}`).join(`
|
|
2398
|
-
`)}`}async function
|
|
2414
|
+
`)}`}async function jq(t,e,r,n,s,o){if(e.getRun(r)===null)return y(t,`tail: run ${r}: not found`);let a=e.listSessionEvents(r),c=(n.kind==="lines"?a.slice(Math.max(0,a.length-n.lines)):a).map(d=>`${hv(d)}
|
|
2399
2415
|
`).join("");t.stdout.write(n.kind==="bytes"?ul(c,n.maxBytes):c);let u=a.length>0?a[a.length-1].id:0;return s?await new Promise(d=>{let m=setInterval(()=>{try{let _=e.listSessionEvents(r,u),g="";for(let h of _)g+=`${hv(h)}
|
|
2400
2416
|
`,u=h.id;g.length>0&&t.stdout.write(n.kind==="bytes"?ul(g,n.maxBytes):g)}catch(_){t.stderr.write(`tail: ${_ instanceof Error?_.message:String(_)}
|
|
2401
|
-
`)}},o*1e3),p=()=>{clearInterval(m),d(0)};process.once("SIGINT",p),process.once("SIGTERM",p)}):0}function ul(t,e){if(e===0||Buffer.byteLength(t,"utf8")<=e)return t;let n=Buffer.byteLength(pv,"utf8");if(n>=e)return _v(t,e);let s=e-n,o=_v(t,s);return`${pv}${o}`}function _v(t,e){if(e<=0)return"";let r=Buffer.from(t,"utf8"),n=Math.max(0,r.length-e);for(;n<r.length&&(r[n]&192)===128;)n+=1;return r.subarray(n).toString("utf8")}function hv(t){let e=yv(new Date(t.timestamp_ms))??"",r="";try{let o=JSON.parse(t.payload);typeof o.alias=="string"&&(r=`alias=${o.alias}`),typeof o.provider=="string"&&(r+=`${r?" ":""}provider=${o.provider}`),typeof o.tool=="string"&&(r+=`${r?" ":""}tool=${o.tool}`),typeof o.status=="string"&&(r+=`${r?" ":""}status=${o.status}`),(typeof o.tokens_in=="number"||typeof o.tokens_out=="number")&&(r+=`${r?" ":""}tokens=${o.tokens_in??0}/${o.tokens_out??0}`)}catch{}let n=r!==""?r:t.payload.slice(0,200),s=t.step_id===null?"":` step=${t.step_id}`;return`${e} ${t.kind}${s}: ${n}`}function yv(t){if(t===void 0)return;let e=t instanceof Date?t:new Date(t);if(Number.isNaN(e.getTime()))return;let r=n=>String(n).padStart(2,"0");return`${e.getFullYear()}-${r(e.getMonth()+1)}-${r(e.getDate())} ${r(e.getHours())}:${r(e.getMinutes())}:${r(e.getSeconds())}`}var xq,
|
|
2417
|
+
`)}},o*1e3),p=()=>{clearInterval(m),d(0)};process.once("SIGINT",p),process.once("SIGTERM",p)}):0}function ul(t,e){if(e===0||Buffer.byteLength(t,"utf8")<=e)return t;let n=Buffer.byteLength(pv,"utf8");if(n>=e)return _v(t,e);let s=e-n,o=_v(t,s);return`${pv}${o}`}function _v(t,e){if(e<=0)return"";let r=Buffer.from(t,"utf8"),n=Math.max(0,r.length-e);for(;n<r.length&&(r[n]&192)===128;)n+=1;return r.subarray(n).toString("utf8")}function hv(t){let e=yv(new Date(t.timestamp_ms))??"",r="";try{let o=JSON.parse(t.payload);typeof o.alias=="string"&&(r=`alias=${o.alias}`),typeof o.provider=="string"&&(r+=`${r?" ":""}provider=${o.provider}`),typeof o.tool=="string"&&(r+=`${r?" ":""}tool=${o.tool}`),typeof o.status=="string"&&(r+=`${r?" ":""}status=${o.status}`),(typeof o.tokens_in=="number"||typeof o.tokens_out=="number")&&(r+=`${r?" ":""}tokens=${o.tokens_in??0}/${o.tokens_out??0}`)}catch{}let n=r!==""?r:t.payload.slice(0,200),s=t.step_id===null?"":` step=${t.step_id}`;return`${e} ${t.kind}${s}: ${n}`}function yv(t){if(t===void 0)return;let e=t instanceof Date?t:new Date(t);if(Number.isNaN(e.getTime()))return;let r=n=>String(n).padStart(2,"0");return`${e.getFullYear()}-${r(e.getMonth()+1)}-${r(e.getDate())} ${r(e.getHours())}:${r(e.getMinutes())}:${r(e.getSeconds())}`}var xq,Rq,Lq,$q,pv,Ev=b(()=>{"use strict";Fr();ge();xt();vt();tt();xq={name:"tail",allowsBareTeamfile:!0,supportsRaw:!0},Rq=4096,Lq=2,$q=`usage: lmctl tail [target] [alias]
|
|
2402
2418
|
lmctl tail --session <id> [--provider <name>]
|
|
2403
2419
|
lmctl tail --run <id>
|
|
2404
2420
|
[--lines N | --max-bytes N] [--watch] [--watch-interval Ns] [--provider <name>]
|
|
2405
2421
|
|
|
2406
2422
|
Print or watch provider session messages, or follow a managed run timeline.
|
|
2407
2423
|
--lines and --max-bytes are mutually exclusive. Default: --max-bytes 4096.`;pv=`\u2026 [truncated older output \u2014 raise with --max-bytes]
|
|
2408
|
-
`});var Nv={};se(Nv,{runInfo:()=>
|
|
2409
|
-
`),0;let r=P(t,["--provider","--run"],["--json","--help"]);if(r.error!==void 0)return y(e,r.error);if(r.positionals.length>2)return y(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let n=
|
|
2424
|
+
`});var Nv={};se(Nv,{runInfo:()=>Fq});import{execFileSync as nm}from"node:child_process";import{dirname as bv,resolve as Cq}from"node:path";function Pq(t){return t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${Math.round(t/1e3)}K`:String(t)}async function Fq(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${Dq}
|
|
2425
|
+
`),0;let r=P(t,["--provider","--run"],["--json","--help"]);if(r.error!==void 0)return y(e,r.error);if(r.positionals.length>2)return y(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let n=C(r,"--json"),s=L(r,"--run");if(s!==void 0){if(r.positionals.length>0)return y(e,"--run is mutually exclusive with positional [target] [alias]");if(L(r,"--provider")!==void 0)return y(e,"--run is mutually exclusive with --provider");let c=Number.parseInt(s,10);if(!Number.isFinite(c)||c<=0||String(c)!==s)return y(e,`invalid --run "${s}" (expected a positive integer run id)`);try{return await R(e,async u=>Wq(e,u,c,n))}catch(u){return _e(e,u)}}let o=ur(Mq,{target:r.positionals[0],alias:r.positionals[1],flags:{provider:L(r,"--provider")}});if(o.mode==="error")return y(e,o.message);if(o.mode==="managed")return y(e,"health managed mode requires --run <id>");if(o.mode==="ai-team"&&o.alias===void 0){let c;try{c=await R(e,u=>ye(o.teamfile,u))}catch(u){return y(e,`health: ${u instanceof Error?u.message:String(u)}`)}return Bq(e,c,n)}let i,a,l;if(o.mode==="ai-team")try{let c=await R(e,u=>Pe(o.teamfile,o.alias,u));i=c.provider,a=c.sessionid,l=c.alias}catch(c){return c instanceof be?y(e,c.message):_e(e,c)}else if(a=o.sessionid,o.provider!==void 0)i=o.provider;else{let c=await Oi(a);if(c.length===0)return y(e,`health: session "${a}" not found in any provider store`);if(c.length>1)return y(e,`health: session "${a}" matches multiple providers (${c.join(", ")}); pass --provider`);i=c[0]}return Uq(e,i,a,l,n)}async function Uq(t,e,r,n,s){let o;try{o=await Xt(r,e)}catch(l){return y(t,`health: failed to load session: ${l instanceof Error?l.message:String(l)}`)}if(o===null)return y(t,`health: session not found: ${r} (provider=${e})`);let i=no(o.messages),a={provider:o.provider,sessionId:o.sessionId,cwd:o.cwd,messageCount:o.messageCount??null,...o.model!==void 0?{model:o.model}:{},...n!==void 0?{alias:n}:{},totalInputTokens:o.totalInputTokens??null,totalOutputTokens:o.totalOutputTokens??null,...o.totalCachedInputTokens!==void 0?{totalCachedInputTokens:o.totalCachedInputTokens}:{},sessionLimit:i,createdAt:o.createdAt.toISOString(),modifiedAt:o.modifiedAt.toISOString()};return s?(F(t,a),0):(t.stdout.write(`Session: ${o.sessionId}
|
|
2410
2426
|
`),t.stdout.write(` Provider: ${o.provider}
|
|
2411
2427
|
`),n!==void 0&&t.stdout.write(` Alias: ${n}
|
|
2412
2428
|
`),t.stdout.write(` CWD: ${o.cwd}
|
|
@@ -2417,7 +2433,7 @@ Print or watch provider session messages, or follow a managed run timeline.
|
|
|
2417
2433
|
`),i!==null&&t.stdout.write(` SessionLimit: LIMITED resets_at=${Iv(i)}
|
|
2418
2434
|
`),t.stdout.write(` Created: ${a.createdAt}
|
|
2419
2435
|
`),t.stdout.write(` Modified: ${a.modifiedAt}
|
|
2420
|
-
`),0)}async function
|
|
2436
|
+
`),0)}async function Wq(t,e,r,n){let s=Mr(e,r);if(s===null)return y(t,`health: run ${r}: not found`);let o=pn(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?(F(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}
|
|
2421
2437
|
`),t.stdout.write(` Workflow: ${s.workflow?.name??"(unknown)"}
|
|
2422
2438
|
`),t.stdout.write(` Team: ${s.team?.name??"(unknown)"}
|
|
2423
2439
|
`),t.stdout.write(` State: ${s.current_state??"(none)"}${s.terminal_state!==null?` (terminal: ${s.terminal_state})`:""}
|
|
@@ -2427,63 +2443,63 @@ Print or watch provider session messages, or follow a managed run timeline.
|
|
|
2427
2443
|
`),t.stdout.write(` Steps: ${s.steps.length}
|
|
2428
2444
|
`),t.stdout.write(` AgentCalls: ${i.agentCallCount}
|
|
2429
2445
|
`),t.stdout.write(` Tokens: ${i.totalInputTokens} in / ${i.totalOutputTokens} out
|
|
2430
|
-
`),0)}async function
|
|
2431
|
-
`)}let k=E?.messageCount,N=i===null?void 0:E===null?null:
|
|
2446
|
+
`),0)}async function Bq(t,e,r){let n,s;try{let w=await R(t,E=>{let k=qe(e,E);if(k.parseErrors.length>0)throw new Error(k.parseErrors.join("; "));return{teamName:k.name,targets:Sv(e,E,new Set,[])}});s=w.teamName,n=w.targets}catch(w){return y(t,`health: ${w instanceof Error?w.message:String(w)}`)}let o=Gq(e),i=o.kind==="repo"?o:null,a=await qq(t,n),l=[],c=0,u=i===null?void 0:0,d=i===null?void 0:0;for(let w of n){let E=null;try{E=await Xt(w.sessionid,w.provider)}catch(q){t.stderr.write(`warning: failed to load session "${w.sessionid}" for ${w.reportPath} (${w.provider}): ${q instanceof Error?q.message:String(q)}
|
|
2447
|
+
`)}let k=E?.messageCount,N=i===null?void 0:E===null?null:Vq(E,i.since),H=i===null?void 0:E===null?null:Yq(E)??"n/a",ne=i===null?void 0:{messageCount:N??null,tokens:null};l.push({alias:w.alias,reportPath:w.reportPath,teamfile:w.teamfile,provider:w.provider,sessionid:w.sessionid,messageCount:k??null,model:E?.model??"(unknown)",lastContext:E?.lastInputTokens,detailLoaded:E!==null,liveness:a.get(vv(w.teamfile,w.alias))??kv(),sessionLimit:E===null?null:no(E.messages),...i!==null?{activitySinceLastCommit:ne,cumulativeTokens:H}:{}}),k===void 0?c=void 0:c!==void 0&&(c+=k),i!==null&&(N==null?u=void 0:u!==void 0&&(u+=N),H==null||H==="n/a"?d=void 0:d!==void 0&&(d+=H))}if(r)return F(t,{team:s,git:i===null?null:{teamDir:i.teamDir,commits:i.commits.map(w=>({ref:w.ref,timestamp:w.timestamp.toISOString()})),since:i.since.toISOString(),working:i.working},members:l.map(({detailLoaded:w,cumulativeTokens:E,...k})=>({...k,lastContext:k.lastContext??null,...E!==void 0?{cumulativeTokens:E==="n/a"?null:E}:{}})),total:{messageCount:c??null}}),0;let f=Math.max(7,...l.map(w=>w.sessionid.length)),m=Math.max(5,...l.map(w=>w.reportPath.length))+1,p=Math.max(8,...l.map(w=>w.provider.length))+1,_=Math.max(5,...l.map(w=>w.model.length))+1,g=Math.max(4,...l.map(w=>Tv(w.liveness).length))+1;if(t.stdout.write(`TEAM: ${s}
|
|
2432
2448
|
`),o.kind==="repo"){t.stdout.write(`Git progress:
|
|
2433
2449
|
`);for(let w of o.commits)t.stdout.write(` ${w.ref}: ${w.timestamp.toISOString()}
|
|
2434
2450
|
`);t.stdout.write(` Uncommitted: ${Et(o.working.uncommittedTracked)} changed (tracked), ${Et(o.working.untracked)} untracked
|
|
2435
2451
|
`)}else o.reason==="no-commits"?t.stdout.write(`Git progress: git repository in ${o.teamDir} has no commits (no commit-based progress to report)
|
|
2436
2452
|
`):t.stdout.write(`Git progress: no git repository in ${o.teamDir} (no commit-based progress to report)
|
|
2437
2453
|
`);t.stdout.write(` ${"SESSION".padEnd(f)} ${"ALIAS".padEnd(m)}${"PROVIDER".padEnd(p)}${"MODEL".padEnd(_)}${"LIVE".padEnd(g)}${"MSGS".padStart(6)} ${"LAST CONTEXT".padStart(12)}`+(i!==null?` ${"MSGS SINCE COMMIT".padStart(17)} ${"TOKENS SINCE COMMIT".padStart(19)} ${"TOKENS (cumulative)".padStart(19)}`:"")+`
|
|
2438
|
-
`);let h=!1,T=l.filter(w=>w.sessionLimit!==null);for(let w of l){let E=
|
|
2454
|
+
`);let h=!1,T=l.filter(w=>w.sessionLimit!==null);for(let w of l){let E=Xq(w.lastContext,w.detailLoaded,Pq);(E==="n/a"||w.cumulativeTokens==="n/a")&&(h=!0),t.stdout.write(` ${w.sessionid.padEnd(f)} ${w.reportPath.padEnd(m)}${w.provider.padEnd(p)}${w.model.padEnd(_)}${Tv(w.liveness).padEnd(g)}${Et(w.messageCount).padStart(6)} ${E.padStart(12)}`+(i!==null?` ${Et(w.activitySinceLastCommit?.messageCount).padStart(17)} ${Et(w.activitySinceLastCommit?.tokens).padStart(19)} ${Jq(w.cumulativeTokens).padStart(19)}`:"")+`
|
|
2439
2455
|
`)}if(t.stdout.write(` ${"TOTAL".padEnd(f)} ${"".padEnd(m)}${"".padEnd(p)}${"".padEnd(_)}${"".padEnd(g)}${Et(c).padStart(6)}`+(i!==null?` ${"".padStart(12)} ${Et(u).padStart(17)} ${Et(null).padStart(19)} ${Et(d).padStart(19)}`:"")+`
|
|
2440
2456
|
`),h&&t.stdout.write(`n/a = this provider does not expose a context/token total; absence is not a health signal.
|
|
2441
2457
|
`),T.length>0){t.stdout.write(`Session limits:
|
|
2442
2458
|
`);for(let w of T)t.stdout.write(` ${w.reportPath}: LIMITED resets_at=${Iv(w.sessionLimit)}
|
|
2443
|
-
`)}return 0}function Sv(t,e,r,n){let s=ye(t,e);if(r.has(s))return[];r.add(s);let o=qe(s,e);if(o.parseErrors.length>0)throw new Error(`${s}: ${o.parseErrors.join("; ")}`);let i=[];for(let a of o.members){if(a.teamfile!==void 0){i.push(...Sv(
|
|
2459
|
+
`)}return 0}function Sv(t,e,r,n){let s=ye(t,e);if(r.has(s))return[];r.add(s);let o=qe(s,e);if(o.parseErrors.length>0)throw new Error(`${s}: ${o.parseErrors.join("; ")}`);let i=[];for(let a of o.members){if(a.teamfile!==void 0){i.push(...Sv(Cq(bv(s),a.teamfile),e,r,[...n,a.alias]));continue}a.session===void 0||a.session.length===0||i.push({teamfile:s,alias:a.alias,reportPath:[...n,a.alias].join("/"),provider:a.provider,sessionid:a.session})}return i}async function qq(t,e){try{let r=await R(t,n=>e.map(s=>{let o=n.getAgentInflight(s.teamfile,s.alias);return[vv(s.teamfile,s.alias),Hq(o)]}));return new Map(r)}catch{return new Map}}function vv(t,e){return`${t}\0${e.toLowerCase()}`}function Hq(t){return t===null?kv():{state:"in_flight",inFlight:{senderTeamfile:t.sender_teamfile,senderAlias:t.sender_alias,startedAt:t.started_at,activeCount:t.active_count,holderPid:t.holder_pid}}}function kv(){return{state:"idle",inFlight:null}}function Tv(t){return t.state}function Iv(t){return t.resets_at!==null?t.resets_at:t.timezone!==null?`${t.reset_time} (${t.timezone})`:t.reset_time}function Et(t){return t==null?"unknown":String(t)}function Jq(t){return t==="n/a"?t:Et(t)}function Xq(t,e,r=String){return t!==void 0?r(t):e?"n/a":"unknown"}function Gq(t){let e=bv(t),r;try{nm("git",["-C",e,"rev-parse","--is-inside-work-tree"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{kind:"unavailable",reason:"no-repo",teamDir:e}}try{r=nm("git",["-C",e,"log","-2","--format=%ct"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{kind:"unavailable",reason:"no-commits",teamDir:e}}let n=r.split(/\r?\n/).map(o=>Number.parseInt(o.trim(),10)).filter(o=>Number.isFinite(o)&&o>0);if(n.length===0)return{kind:"unavailable",reason:"no-commits",teamDir:e};let s=n.slice(0,2).map((o,i)=>({ref:i===0?"HEAD":`HEAD~${i}`,timestamp:new Date(o*1e3)}));return{kind:"repo",teamDir:e,since:s[0].timestamp,commits:s,working:Kq(e)}}function Kq(t){let e;try{e=nm("git",["-C",t,"status","--porcelain"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{uncommittedTracked:null,untracked:null}}let r=0,n=0;for(let s of e.split(/\r?\n/))s.trim().length!==0&&(s.startsWith("??")?n+=1:r+=1);return{uncommittedTracked:r,untracked:n}}function Vq(t,e){let r=e.getTime();return t.messages.filter(n=>(n.role==="user"||n.role==="assistant")&&Number.isFinite(n.timestamp.getTime())&&n.timestamp.getTime()>r).length}function Yq(t){if(t===null)return null;let e=[t.totalInputTokens,t.totalCachedInputTokens,t.totalCacheWriteInputTokens,t.totalOutputTokens,t.totalReasoningOutputTokens].filter(r=>typeof r=="number"&&Number.isFinite(r));return e.length===0?null:e.reduce((r,n)=>r+n,0)}var Mq,Dq,Av=b(()=>{"use strict";Fr();ge();xt();tt();Jt();Vf();Mq={name:"health",allowsBareTeamfile:!0,supportsRaw:!0},Dq=`usage: lmctl health [target] [alias]
|
|
2444
2460
|
lmctl health <teamfile> # team rollup
|
|
2445
2461
|
lmctl health <sessionid> [--provider <name>]
|
|
2446
2462
|
[--json]
|
|
2447
2463
|
|
|
2448
|
-
Show provider session details, team rollups, or managed run state/token totals.`});var Rv={};se(Rv,{runLs:()=>
|
|
2449
|
-
`),0;let r=P(t,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(r.error!==void 0)return y(e,r.error);if(r.positionals.length>0)return y(e,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let n=L(r,"--format"),s=
|
|
2464
|
+
Show provider session details, team rollups, or managed run state/token totals.`});var Rv={};se(Rv,{runLs:()=>eH});import{resolve as sm}from"node:path";function Qq(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 eH(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${zq}
|
|
2465
|
+
`),0;let r=P(t,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(r.error!==void 0)return y(e,r.error);if(r.positionals.length>0)return y(e,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let n=L(r,"--format"),s=C(r,"--json");if(C(r,"--runs")){for(let h of["--provider","--sessiondir"])if(L(r,h)!==void 0)return y(e,`--runs is mutually exclusive with ${h}`);for(let h of["--recursive","--all"])if(C(r,h))return y(e,`--runs is mutually exclusive with ${h}`);if(n==="teamfile")return y(e,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let p=L(r,"--limit"),_=Zq;if(p!==void 0){let h=Number.parseInt(p,10);if(!Number.isFinite(h)||h<1||String(h)!==p)return y(e,`invalid --limit "${p}" (expected a positive integer)`);if(h>xv)return y(e,`--limit ${h} exceeds maximum (${xv})`);_=h}let g=n==="json"||s===!0?"json":"table";try{return await R(e,async h=>tH(e,h,_,g))}catch(h){return _e(e,h)}}let i=rH(n,s);if("error"in i)return y(e,i.error);let a=i.format,l=L(r,"--provider"),c=L(r,"--sessiondir"),u=C(r,"--recursive"),d=C(r,"--all"),f;try{f=await Qc(l?{provider:l}:{})}catch(p){return y(e,`ls: discovery failed: ${p instanceof Error?p.message:String(p)}`)}if(!d){let p=c!==void 0?sm(c):sm(process.cwd());f=f.filter(_=>{let g=sm(_.cwd);return u?g===p||g.startsWith(`${p}/`):g===p})}if(f=Qq(f),a==="json")return F(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(),_=u?"under":"in";e.stdout.write(`No native sessions found ${_} ${p}.
|
|
2450
2466
|
`)}return 0}if(a==="teamfile"){for(let p of f)e.stdout.write(`_MEMBER_ alias=- provider=${p.provider} sessionid=${p.sessionId} sessiondir=${p.cwd}
|
|
2451
2467
|
`);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
|
|
2452
2468
|
`);for(let p of f){let _=p.cwd.length>36?`\u2026${p.cwd.slice(-35)}`:p.cwd;e.stdout.write(`${p.sessionId.padEnd(m)} ${p.provider.padEnd(10)} ${_.padEnd(36)} ${p.modifiedAt.toISOString()}
|
|
2453
|
-
`)}return 0}async function
|
|
2469
|
+
`)}return 0}async function tH(t,e,r,n){let s=mn(e,{limit:r});if(n==="json")return F(t,s.map(o=>({id:o.id,job_id:o.job_id,workflow_id:o.workflow_id,team_id:o.team_id,current_state:o.current_state,terminal_state:o.terminal_state,started_at:o.started_at,ended_at:o.ended_at,paused_at:o.paused_at}))),0;if(s.length===0)return t.stdout.write(`No runs found.
|
|
2454
2470
|
`),0;t.stdout.write(`${"RUN_ID".padEnd(8)} ${"WORKFLOW".padEnd(8)} ${"TEAM".padEnd(8)} ${"STATE".padEnd(20)} ${"TERMINAL".padEnd(20)} STARTED
|
|
2455
2471
|
`);for(let o of s){let i=(o.current_state??"").padEnd(20),a=(o.terminal_state??"").padEnd(20);t.stdout.write(`${String(o.id).padEnd(8)} ${String(o.workflow_id).padEnd(8)} ${String(o.team_id).padEnd(8)} ${i} ${a} ${o.started_at}
|
|
2456
|
-
`)}return 0}function
|
|
2472
|
+
`)}return 0}function rH(t,e){return t===void 0?{format:e?"json":"teamfile"}:t==="table"||t==="teamfile"||t==="json"?{format:t}:{error:`invalid --format "${t}" (expected: table | teamfile | json)`}}var zq,Zq,xv,Lv=b(()=>{"use strict";At();ge();Jt();zq=`usage: lmctl ls [--provider <name>] [--sessiondir <path>]
|
|
2457
2473
|
[--recursive] [--all] [--format table|teamfile|json] [--json]
|
|
2458
2474
|
lmctl ls --runs [--limit N] [--format table|json] [--json]
|
|
2459
2475
|
|
|
2460
|
-
List native provider sessions in scope, or list recent managed runs with --runs.`,
|
|
2461
|
-
`),2;let r=t[0],n;try{n=await R(e,c=>ye(r,c))}catch(c){return Ce(e,`${r}: ${c instanceof Error?c.message:String(c)}`)}let s;try{s=
|
|
2476
|
+
List native provider sessions in scope, or list recent managed runs with --runs.`,Zq=50,xv=500});import{existsSync as co,readFileSync as $v}from"node:fs";import{homedir as nH}from"node:os";import{dirname as Ov,resolve as Hn}from"node:path";import{fileURLToPath as sH}from"node:url";function am(t,e={}){let r=[],n=aH(e.modelSelectionDocPath);for(let s of t){let o=s.provider.trim().toLowerCase();if(s.effort&&o!=="opencode"&&o!=="lmplayer"&&o!=="qwen"&&r.push(`[${s.alias}] effort="${s.effort}" is ignored: effort selection is only supported for opencode and lmplayer.`),o==="qwen"&&s.effort&&r.push(`[${s.alias}] effort="${s.effort}" is not a qwen CLI flag: Qwen Code does not expose reasoning-effort selection. Use a thinking/effort model id in model= instead.`),o==="copilot"){if(!s.model)continue;r.push(`[${s.alias}] model="${s.model}" is ignored: copilot does not support lmctl model selection.`);continue}if(o==="lmplayer"&&!s.model){r.push(`[${s.alias}] provider=lmplayer has no model= \u2014 lmplayer will choose its own default model, which may not be visible in the teamfile. Set model= explicitly (e.g. github-copilot/gpt-5.4).`);continue}if(o==="lmplayer")continue;if(o==="opencode"){if(s.effort&&!s.model&&r.push(`[${s.alias}] effort="${s.effort}" has no effect without model= on an opencode member.`),!s.model){r.push(`[${s.alias}] provider=opencode has no model= \u2014 opencode will choose its own default model, which may not be servable and isn't visible in the teamfile. Set model= explicitly (e.g. github-copilot/gpt-5.4).`);continue}let a=mH(e.opencodeConfigPath);if(!a.available){r.push(`[${s.alias}] model="${s.model}" cannot be verified for opencode: ${a.reason}.`);continue}if(a.models.includes(s.model)||/^github-copilot\/(gpt|gemini|o[0-9])/.test(s.model))continue;if(!s.model.includes("/")){let l=a.models.filter(c=>c.endsWith(`/${s.model}`));r.push(l.length>0?`[${s.alias}] model="${s.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model>. Your opencode.json declares it as ${l.join(" / ")}; set model=${l[0]}.`:`[${s.alias}] model="${s.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model> (e.g. github-copilot/${s.model}). Declare it in ~/.config/opencode/opencode.json (see https://lmctl.com/examples/opencode.json).`);continue}r.push(`[${s.alias}] model="${s.model}" is not declared in your opencode.json. opencode resolves github-copilot GPT/Gemini config-free, but copilot Claude and custom providers must be declared \u2014 copy https://lmctl.com/examples/opencode.json to ~/.config/opencode/opencode.json and adjust for your account.`);continue}if(!s.model)continue;let i=n.get(o);if(!i){r.push(`[${s.alias}] model="${s.model}" cannot be verified for provider "${o}": `+(fl??"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: ${_H(i)}`)}return r}function aH(t){if(!t&&lo)return lo;let e=new Map,r,n=t??lH();if(!co(n))return r=`${n} not found`,t||om(e),t||(lo=e),t||(fl=r),e;let s;try{s=$v(n,"utf-8")}catch(o){return r=`${n} could not be read: ${o instanceof Error?o.message:String(o)}`,t||om(e),t||(lo=e),t||(fl=r),e}for(let[o,i]of Object.entries(oH)){let a=dH(s,i),l=fH(a);l.length>0&&e.set(o,l)}return e.size===0&&(r=`${n} has no tested model rows`),!t&&e.size===0&&om(e),t||(lo=e),t||(fl=r),e}function lH(){return cH(Ov(sH(import.meta.url)))}function cH(t){let e=uH(t);if(e){let n=Hn(e,"durable-memory","model_selection.md");if(co(n))return n}let r=[Hn(t,"..","..","durable-memory","model_selection.md"),Hn(t,"..","..","..","durable-memory","model_selection.md")];for(let n of r)if(co(n))return n;return r[r.length-1]}function uH(t){let e=Hn(t);for(;;){if(co(Hn(e,"package.json")))return e;let r=Ov(e);if(r===e)return null;e=r}}function om(t){for(let[e,r]of Object.entries(iH))t.set(e,r)}function dH(t,e){let n=new RegExp(`^## ${hH(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 fH(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 mH(t){let e=t??Hn(nH(),".config","opencode","opencode.json");if(!co(e))return{available:!0,models:[]};let r;try{r=JSON.parse($v(e,"utf-8"))}catch(n){return{available:!1,models:[],reason:`${e} could not be parsed: ${n instanceof Error?n.message:String(n)}`}}return{available:!0,models:pH(r)}}function pH(t){if(!im(t))return[];let e=dl(t.provider)??dl(t.providers);if(!e)return[];let r=new Set;for(let[n,s]of Object.entries(e)){if(!im(s))continue;let o=dl(s.models)??dl(s.model);if(o)for(let i of Object.keys(o))r.add(i.startsWith(`${n}/`)?i:`${n}/${i}`)}return[...r].sort()}function dl(t){return im(t)?t:null}function im(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function _H(t){return t.length>0?t.join(", "):"(none)"}function hH(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var oH,iH,lo,fl,jv=b(()=>{"use strict";oH={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen",agy:"Antigravity"},iH={claude:["claude-opus-4-6","claude-opus-4-7","claude-opus-4-8","claude-sonnet-4-6","claude-sonnet-5","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"]},lo=null});import{homedir as gH}from"node:os";import{basename as yH}from"node:path";function ml(t,e){let r=new Set;return{text:t.replace(EH,(s,o)=>{let i=o.trim(),a=wH[i];return a===void 0?(r.add(i),s):a(e)}),unknownNames:[...r].sort()}}function pl(t){return{workdir:t.workdir,teamfile:t.teamfile,date:TH(t.date)}}function TH(t){return t.toISOString().slice(0,10)}var wH,EH,lm=b(()=>{"use strict";wH={workdir:t=>t.workdir,teamfile:t=>t.teamfile,teamname:t=>{let e=yH(t.teamfile);return e.endsWith(".lmctl")?e.slice(0,-6):e},home:()=>gH(),date:t=>t.date},EH=/{{\s*([A-Za-z0-9_-]+)\s*}}/g});var mo={};se(mo,{GEMINI_PROVIDER_NOTICE:()=>Pv,_setLintSessiondirFsOpsForTests:()=>xH,_setTeamfileSeedForTests:()=>AH,buildRootTeamRegistrationRow:()=>qv,registerRootTeam:()=>Hv,runHire:()=>DH,runLint:()=>MH,runRefresh:()=>PH,runSeed:()=>Wv,sha256Text:()=>Bv});import{createHash as bH}from"node:crypto";import{accessSync as SH,constants as Cv,existsSync as vH,readFileSync as gl,realpathSync as dm,statSync as kH,writeFileSync as hl}from"node:fs";import{dirname as Gr,resolve as Dv}from"node:path";function AH(t){Fv=t??(async e=>{let{seed:r}=await Promise.resolve().then(()=>(At(),tu)),n=await r(e);return n.success?{sessionId:n.sessionId}:{error:n.error??"provider seed failed"}})}function xH(t){Xr=t===null?fm:{...fm,...t}}function RH(t,e){let r=Gr(e),n=new Set,s=[];for(let o of t){if(o.teamfile!==void 0)continue;let i=o.sessiondir??r,a=Dv(i);if(n.has(a))continue;let l=LH(a);l!==void 0&&(n.add(a),s.push(`${o.alias}: sessiondir ${a} is not writable (seed would fail: ${l}) \u2014 fix permissions or set a writable sessiondir`))}return s}function LH(t){try{if(Xr.existsSync(t)){if(!Xr.statSync(t).isDirectory())return"ENOTDIR";Xr.accessSync(t,Cv.W_OK);return}let e=jH(t);if(e===void 0)return;if(!Xr.statSync(e).isDirectory())return"ENOTDIR";Xr.accessSync(e,Cv.W_OK);return}catch(e){return CH(e)??"permission check failed"}}function $H(t,e){let r=[];for(let n of t)n.teamfile!==void 0||n.sessiondir===void 0||Uv(n.sessiondir,e)&&r.push(`${n.alias}: sessiondir equals the teamfile directory and is redundant; lmctl seed will remove it`);return r}function OH(t,e,r,n){let s=!1;for(let o of t){if(o.teamfile!==void 0||o.sessiondir===void 0||!Uv(o.sessiondir,n))continue;let i=r.get(o.alias.toLowerCase());if(i===void 0)continue;let a=Jv(e[i],"sessiondir");a!==e[i]&&(e[i]=a,s=!0),o.sessiondir=void 0}return s}function Uv(t,e){return Mv(t)===Mv(e)}function Mv(t){let e=Dv(t);try{return dm(e)}catch{return e}}function jH(t){let e=t;for(;;){try{if(Xr.existsSync(e))return e}catch{return}let r=Gr(e);if(r===e)return;e=r}}function CH(t){if(typeof t=="object"&&t!==null&&"code"in t){let e=t.code;if(typeof e=="string"&&e.length>0)return e}}async function MH(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(IH),0;if(t.length!==1)return e.stderr.write(`usage: lmctl lint <teamfile.lmctl>
|
|
2477
|
+
`),2;let r=t[0],n;try{n=await R(e,c=>ye(r,c))}catch(c){return Ce(e,`${r}: ${c instanceof Error?c.message:String(c)}`)}let s;try{s=Me(n)}catch(c){return Ce(e,`${r}: ${c instanceof Error?c.message:String(c)}`)}let o=Zl(s,Gr(n)),i=am(s.members),a=gl(n,"utf8"),l=ml(a,pl({workdir:Gr(n),teamfile:n,date:new Date})).unknownNames;l.length>0&&i.push(`unknown template placeholder${l.length===1?"":"s"}: ${l.map(c=>`{{${c}}}`).join(", ")}`),i.push(...hc(s.members,Gr(n))),i.push(...RH(s.members,n)),i.push(...$H(s.members,Gr(n)));for(let c of o)e.stderr.write(`error: ${c.field}: ${c.message}
|
|
2462
2478
|
`);for(let c of s.members)pm([c],e),c.session!==void 0&&c.session.length<uo&&i.push(`${c.alias}: sessionid is shorter than ${uo} chars; run lmctl seed to refresh it`);for(let c of i)e.stderr.write(`warning: ${c}
|
|
2463
2479
|
`);return await R(e,c=>{Hp(n,c,u=>e.stderr.write(`${u}
|
|
2464
2480
|
`))}),o.length>0?1:(e.stdout.write(`ok
|
|
2465
|
-
`),0)}async function Wv(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(
|
|
2466
|
-
`),2;let r=t[0],n;try{n=await R(e,h=>ye(r,h))}catch(h){return Ce(e,`${r}: ${h instanceof Error?h.message:String(h)}`)}let s;try{s=dm(n)}catch(h){return Ce(e,`${r}: ${h instanceof Error?h.message:String(h)}`)}let o=Gr(n),i;try{i=
|
|
2467
|
-
`),c=
|
|
2481
|
+
`),0)}async function Wv(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(NH),0;if(t.length!==1)return e.stderr.write(`usage: lmctl seed <teamfile.lmctl>
|
|
2482
|
+
`),2;let r=t[0],n;try{n=await R(e,h=>ye(r,h))}catch(h){return Ce(e,`${r}: ${h instanceof Error?h.message:String(h)}`)}let s;try{s=dm(n)}catch(h){return Ce(e,`${r}: ${h instanceof Error?h.message:String(h)}`)}let o=Gr(n),i;try{i=Me(n)}catch(h){return Ce(e,`${r}: ${h instanceof Error?h.message:String(h)}`)}let l=gl(n,"utf8").split(`
|
|
2483
|
+
`),c=WH(l),u=OH(i.members,l,c,o),d=Zl(i,o);if(d.length>0){pm(i.members,e);for(let h of d)e.stderr.write(`error: ${h.field}: ${h.message}
|
|
2468
2484
|
`);return 1}try{bn(e,i,n)}catch{}pm(i.members,e);for(let h of am(i.members))e.stderr.write(`warning: ${h}
|
|
2469
2485
|
`);for(let h of hc(i.members,o))e.stderr.write(`warning: ${h}
|
|
2470
2486
|
`);let f=0,m=i.members.filter(h=>h.teamfile!==void 0?!1:h.session===void 0||h.session.length<uo);for(let h of m)if(!Xv(h.provider))return e.stderr.write(`error: ${h.alias}: invalid provider "${h.provider}"
|
|
2471
2487
|
`),1;for(let h of i.members){if(h.teamfile!==void 0)continue;if(h.session!==void 0&&h.session.length>=uo){e.stderr.write(`warning: ${h.alias}: existing sessionid preserved; skipping
|
|
2472
|
-
`);continue}let T=h.sessiondir??o,w=await Fv({provider:h.provider,cwd:T,...h.model!==void 0?{model:h.model}:{},...h.effort!==void 0?{effort:h.effort}:{},...h.alias.toLowerCase()==="lead"?{prompt:
|
|
2488
|
+
`);continue}let T=h.sessiondir??o,w=await Fv({provider:h.provider,cwd:T,...h.model!==void 0?{model:h.model}:{},...h.effort!==void 0?{effort:h.effort}:{},...h.alias.toLowerCase()==="lead"?{prompt:FH(n,l.join(`
|
|
2473
2489
|
`),i.members)}:{}});if(w.error!==void 0||w.sessionId===void 0||w.sessionId.length<uo){let N=`provider did not report a sessionid; no new session was found for ${T} (possible provider workspace/cwd mismatch)`;return e.stderr.write(`error: ${h.alias}: seed failed${w.error!==void 0?`: ${w.error}`:`; ${N}`}
|
|
2474
2490
|
`),1}let E=c.get(h.alias.toLowerCase());if(E===void 0)return e.stderr.write(`error: ${h.alias}: could not find matching _MEMBER_ line to update
|
|
2475
|
-
`),1;let k=
|
|
2491
|
+
`),1;let k=JH(l[E],"sessionid",w.sessionId);l[E]=k,f+=1,hl(n,l.join(`
|
|
2476
2492
|
`),"utf8"),e.stdout.write(`${h.alias}: seeded ${w.sessionId} provider=${h.provider} sessiondir=${T}
|
|
2477
2493
|
`)}let p=l.join(`
|
|
2478
|
-
`),_=
|
|
2479
|
-
`);let g=new Date().toISOString();return await R(e,h=>{Hv(h,{teamfilePath:s,name:i.name,rawText:_,now:g})}),0}async function
|
|
2494
|
+
`),_=GH(p,dm(n));(_!==p||u)&&hl(n,_,"utf8"),f===0&&e.stdout.write(`no members needed seeding
|
|
2495
|
+
`);let g=new Date().toISOString();return await R(e,h=>{Hv(h,{teamfilePath:s,name:i.name,rawText:_,now:g})}),0}async function DH(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(_l),0;let r=P(t,["--provider","--sessiondir"],[]);if(r.error!==void 0)return um(e,r.error,_l);if(r.positionals.length!==2)return um(e,"expected <teamfile.lmctl> and <alias>",_l);let[n,s]=r.positionals;if(!HH(s))return Ce(e,`invalid alias "${s}"`);if(s.toLowerCase()==="lead")return Ce(e,"hire only applies to non-Lead members");let o=L(r,"--provider");if(o===void 0)return um(e,"missing value for --provider",_l);if(!Xv(o))return Ce(e,`invalid provider "${o}"`);let i;try{i=await R(e,d=>ye(n,d))}catch(d){return Ce(e,`${n}: ${d instanceof Error?d.message:String(d)}`)}let a;try{a=gl(i,"utf8")}catch(d){return Ce(e,`${n}: ${d instanceof Error?d.message:String(d)}`)}if(qH(a,s))return Ce(e,`${s}: alias already exists in ${i}`);let l=L(r,"--sessiondir"),c=[`_MEMBER_ alias=${mm(s)} provider=${o}`,...l===void 0?[]:[`sessiondir=${mm(l)}`]].join(" "),u=XH(a,c);return hl(i,u,"utf8"),e.stdout.write(`Hired ${s} (${o}) -> ${i}
|
|
2480
2496
|
`),e.stdout.write(`Run: lmctl seed ${i}
|
|
2481
|
-
`),0}async function
|
|
2482
|
-
`),a=
|
|
2483
|
-
`),"utf8"),Wv([s],e))}function Bv(t){return
|
|
2484
|
-
`):"- (no non-Lead members)",o=r.find(a=>a.alias.toLowerCase()==="lead")?.provider??"",i=
|
|
2485
|
-
`)}function
|
|
2486
|
-
`))if(/^\s*#?\s*_MEMBER_\s+\S/u.test(r)&&fo(r,"alias")===e)return!0;return!1}function
|
|
2497
|
+
`),0}async function PH(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(cm),0;let r,n;if(t.length===1){let d=jr(t[0]);if(d===null)return e.stderr.write(cm),2;r=d.teamfile,n=d.alias}else if(t.length===2)[r,n]=t;else return e.stderr.write(cm),2;let s;try{s=await R(e,d=>ye(r,d))}catch(d){return Ce(e,`${r}: ${d instanceof Error?d.message:String(d)}`)}let o;try{o=gl(s,"utf8")}catch(d){return Ce(e,`${r}: ${d instanceof Error?d.message:String(d)}`)}let i=o.split(`
|
|
2498
|
+
`),a=BH(i,n);if(a===void 0)return Ce(e,`${n}: no active _MEMBER_ entry found`);let l=i[a];if(fo(l,"teamfile")!==void 0)return Ce(e,`${n}: refresh only applies to provider-backed members, not teamfile= members`);let c=(e.env??process.env)[xr],u=fo(l,"sessionid");return c!==void 0&&c.length>0&&u===c?Ce(e,`${n}: cannot refresh its own running session \u2014 a meta-Lead or the operator must run this refresh.`):(i[a]=Jv(l,"sessionid"),a>0&&/^\s*#CreationTime:/u.test(i[a-1])&&i.splice(a-1,1),hl(s,i.join(`
|
|
2499
|
+
`),"utf8"),Wv([s],e))}function Bv(t){return bH("sha256").update(t).digest("hex")}function qv(t,e){return{teamfile_path:e.teamfilePath,name:e.name,raw_text:e.rawText,raw_sha256:Bv(e.rawText),registered_at:t?.registered_at??e.now,last_seeded_at:e.now}}function Hv(t,e){let r=qv(t.getRootTeam(e.teamfilePath),e);return t.upsertRootTeam(r),r}function FH(t,e,r){let n=r.filter(a=>a.alias.toLowerCase()!=="lead").map(a=>{let l=a.teamfile!==void 0?`teamfile=${a.teamfile}`:`provider=${a.provider}`;return`- ${a.alias}: ${l}`}),s=n.length>0?n.join(`
|
|
2500
|
+
`):"- (no non-Lead members)",o=r.find(a=>a.alias.toLowerCase()==="lead")?.provider??"",i=UH(o,t);return["lmctl seed initial connection only. Create or pin this provider session, then stop.","Do not inspect files, run commands, infer a task, delegate, edit, or begin work.","",`Teamfile path: ${t}`,"You are alias Lead for this AI-managed .lmctl team.","","Delegating work:",`- Blocking command shape: lmctl chat "${t}" <alias> "your task here"`,"- MCP lmctl_chat is synchronous/blocking; use it only as a quick-ping or backup path.",'- Plain shell "&" alone is blind backgrounding. Use lmctl-tracked commands, then run lmctl notify_me.',"- Call lmctl notify_me in the FOREGROUND; it holds your process and returns when a member finishes.","- notify_me means: I'm done with this round; my delegations are all running in the background; I'm taking a break \u2014 notify me when something lands.",`- For non-blocking member work: run the blocking lmctl chat command in the background, then run lmctl notify_me. Example: lmctl chat "${t}" <alias> "your task here" & lmctl notify_me`,"- For arbitrary shell work: lmctl exec -- <command> & lmctl notify_me",i,"","Delegation is an ACTION, not a plan: to hand a member a task, run the command or call the tool.","If you use lmctl_chat and it appears only after tool search, call it in the SAME turn and do not stop after discovering it or say you're about to call it.","","Team members:",s,"","Example MCP calls:",...r.filter(a=>a.alias.toLowerCase()!=="lead").map(a=>`lmctl_chat(team="${t}", alias="${a.alias}", prompt="your task here")`),"","If a member feels sluggish or starts drifting (degraded or off-track output):",` 1. Check ONE member's session health: lmctl health "${t}" <alias> (size/state \u2014 informational).`," 2. Make sure important state is captured in durable-memory/ \u2014 update it if not.",` 3. Replace its session: lmctl refresh "${t}" <alias> (re-seeds the member: drops chat history, re-reads durable-memory/). You cannot refresh your own Lead session \u2014 a meta-Lead or the operator does that.`,` Optional: lmctl tail "${t}" <alias> to inspect its recent messages while troubleshooting.`,"(These health/recovery commands are shell commands. For delegation, prefer tracked CLI commands plus lmctl notify_me; lmctl_chat is the synchronous backup.)","","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(`
|
|
2501
|
+
`)}function UH(t,e){let r=`lmctl chat "${e}" <alias> "your task here"`;switch(t.toLowerCase()){case"claude":return`- Claude tip: run the blocking command (${r}) as background Bash (run_in_background: true); the runtime re-invokes you with the reply when it completes.`;case"copilot":return`- Copilot tip: run the blocking command (${r}) via bash async mode (mode:"async"); the runtime notifies you with output when it completes.`;case"agy":return`- Antigravity tip: run the blocking command (${r}) via run_command with WaitMsBeforeAsync: 0 (Background Tasks); agy wakes you with the output when it completes.`;case"qwen":return`- Qwen tip: run the blocking command (${r}) via the monitor tool; it notifies you on completion.`;case"codex":return"- Codex note: no native completion push; for long work, background tracked lmctl chat or lmctl exec, then run lmctl notify_me.";case"gemini":return"- Gemini note: no native completion push; for long work, background tracked lmctl chat or lmctl exec, then run lmctl notify_me.";case"opencode":return"- OpenCode note: use the provider-native background/task surface when available; otherwise run one blocking lmctl chat turn and wait.";default:return"- If your provider has native background-shell completion, use it around the blocking command; otherwise background the tracked command and run lmctl notify_me."}}function WH(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=fo(n,"alias");s!==void 0&&e.set(s.toLowerCase(),r)}return e}function BH(t,e){let r=e.toLowerCase();for(let n=0;n<t.length;n+=1){let s=t[n];if(/^\s*_MEMBER_\s+\S/u.test(s)&&fo(s,"alias")?.toLowerCase()===r)return n}}function qH(t,e){for(let r of t.split(`
|
|
2502
|
+
`))if(/^\s*#?\s*_MEMBER_\s+\S/u.test(r)&&fo(r,"alias")===e)return!0;return!1}function HH(t){return/^[A-Za-z][A-Za-z0-9_-]*$/u.test(t)}function fo(t,e){let n=new RegExp(`(?:^|\\s)${e}=(?:"([^"]*)"|(\\S*))`).exec(t);return n===null?void 0:n[1]??n[2]??""}function JH(t,e,r){let n=`${e}=${mm(r)}`,s=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return s.test(t)?t.replace(s,(o,i)=>`${i}${n}`):`${t.trimEnd()} ${n}`}function Jv(t,e){let r=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return t.replace(r,"").replace(/\s+/gu," ").trimEnd()}function mm(t){return/[\s"]/u.test(t)?`"${t.replace(/"/g,'\\"')}"`:t}function XH(t,e){let r=t.split(`
|
|
2487
2503
|
`),n=-1;for(let a=r.length-1;a>=0;a-=1)if(/^\s*_MEMBER_(?:\s|$)/u.test(r[a])){n=a;break}if(n>=0)return r.splice(n+1,0,e),r.join(`
|
|
2488
2504
|
`);let s=r.length;for(;s>0&&r[s-1]==="";)s-=1;let o=r.slice(0,s).join(`
|
|
2489
2505
|
`),i=r.slice(s).join(`
|
|
@@ -2491,7 +2507,7 @@ List native provider sessions in scope, or list recent managed runs with --runs.
|
|
|
2491
2507
|
|
|
2492
2508
|
`:""}${e}${i.length>0?`
|
|
2493
2509
|
${i}`:`
|
|
2494
|
-
`}`}function
|
|
2510
|
+
`}`}function GH(t,e){let r=`#teamfile: ${e}`,n=t.indexOf(`
|
|
2495
2511
|
`),s=n>=0?t.slice(0,n):t,o=n>=0?t.slice(n+1):"";return s===r?t:s.startsWith("#teamfile:")?o.length>0?`${r}
|
|
2496
2512
|
${o}`:`${r}
|
|
2497
2513
|
`:t.length>0?`${r}
|
|
@@ -2500,10 +2516,10 @@ ${t}`:`${r}
|
|
|
2500
2516
|
`),1}function um(t,e,r){return t.stderr.write(`error: ${e}
|
|
2501
2517
|
${r}`),2}function pm(t,e){for(let r of t)r.teamfile!==void 0&&e.stderr.write(`warning: member "${r.alias}" uses deprecated member-level teamfile=; cross-team calls now work at runtime without _CONNECT_
|
|
2502
2518
|
`),r.provider==="gemini"&&e.stderr.write(`${Pv.replace("%s",r.alias)}
|
|
2503
|
-
`)}var uo,
|
|
2519
|
+
`)}var uo,IH,NH,_l,cm,Pv,fm,Fv,Xr,po=b(()=>{"use strict";vt();jv();Ho();rt();ge();tt();xt();tt();lm();Os();uo=5,IH=`usage: lmctl lint <teamfile.lmctl>
|
|
2504
2520
|
|
|
2505
2521
|
Validate an lmctl teamfile and warn about stale or placeholder session ids.
|
|
2506
|
-
`,
|
|
2522
|
+
`,NH=`usage: lmctl seed <teamfile.lmctl>
|
|
2507
2523
|
|
|
2508
2524
|
Seed missing or placeholder session ids in an lmctl teamfile by calling each
|
|
2509
2525
|
member's configured native provider.
|
|
@@ -2520,32 +2536,32 @@ Refreshing the Lead drops its chat history; it re-reads durable-memory/ on
|
|
|
2520
2536
|
re-seed.
|
|
2521
2537
|
A member cannot refresh its own running session; run the refresh from a
|
|
2522
2538
|
meta-Lead or operator shell outside that sessiondir.
|
|
2523
|
-
`,Pv='notice: member "%s" uses provider=gemini \u2014 the Gemini CLI requires an API/enterprise Google account; personal Google subscriptions should use provider=agy (Antigravity).',fm={existsSync:
|
|
2524
|
-
`),2;let[r,n]=t,s,o=r;try{if(/^https?:\/\//i.test(r)){let c=await fetch(r);if(!c.ok)throw new Error(`HTTP ${c.status}`);s=await c.text()}else{let c=Kv(r);if(!_m(c))throw new Error(`source not found: ${r}`);let d=Vv(c).isDirectory()?
|
|
2525
|
-
`),1}let i=Kv(n),a=
|
|
2526
|
-
`),1;let l=
|
|
2539
|
+
`,Pv='notice: member "%s" uses provider=gemini \u2014 the Gemini CLI requires an API/enterprise Google account; personal Google subscriptions should use provider=agy (Antigravity).',fm={existsSync:vH,statSync:kH,accessSync:SH},Fv=async t=>{let{seed:e}=await Promise.resolve().then(()=>(At(),tu)),r=await e(t);return r.success?{sessionId:r.sessionId}:{error:r.error??"provider seed failed"}},Xr=fm});var zv={};se(zv,{runClone:()=>t2});import{existsSync as _m,mkdirSync as KH,readFileSync as VH,readdirSync as YH,statSync as Vv,writeFileSync as zH}from"node:fs";import{basename as Gv,dirname as ZH,extname as QH,join as Yv,resolve as Kv}from"node:path";async function t2(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(e2),0;if(t.length!==2)return e.stderr.write(`usage: lmctl clone <source> <dest>
|
|
2540
|
+
`),2;let[r,n]=t,s,o=r;try{if(/^https?:\/\//i.test(r)){let c=await fetch(r);if(!c.ok)throw new Error(`HTTP ${c.status}`);s=await c.text()}else{let c=Kv(r);if(!_m(c))throw new Error(`source not found: ${r}`);let d=Vv(c).isDirectory()?r2(c):c;s=VH(d,"utf8"),o=d}}catch(c){return e.stderr.write(`error: ${c instanceof Error?c.message:String(c)}
|
|
2541
|
+
`),1}let i=Kv(n),a=n2(i,o,n);if(_m(a))return e.stderr.write(`error: ${a} already exists.
|
|
2542
|
+
`),1;let l=o2(s2(s));return KH(ZH(a),{recursive:!0}),zH(a,l,"utf8"),e.stdout.write(`Cloned ${r} -> ${a}
|
|
2527
2543
|
`),e.stdout.write(`Edit ${a}; only _MEMBER_ lines are parsed, everything else is free-form.
|
|
2528
2544
|
`),e.stdout.write(`After editing, run: lmctl lint ${a}
|
|
2529
2545
|
`),e.stdout.write(`Then run: lmctl seed ${a}
|
|
2530
|
-
`),0}function
|
|
2546
|
+
`),0}function r2(t){let e=YH(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 Yv(t,e[0])}function n2(t,e,r){if(r.endsWith("/")||_m(t)&&Vv(t).isDirectory()){let n=Gv(e).endsWith(".lmctl")?Gv(e):"team.lmctl";return Yv(t,n)}return QH(t)?t:`${t}.lmctl`}function s2(t){return t.split(`
|
|
2531
2547
|
`).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(`
|
|
2532
|
-
`)}function
|
|
2548
|
+
`)}function o2(t){return t.split(`
|
|
2533
2549
|
`).map(e=>/^\s*_MEMBER_\s+\S/.test(e)?e.replace(/\s+sessiondir=(?:"[^"]*"|\S+)/g,"").replace(/^(\s*_MEMBER_)\s+sessiondir=(?:"[^"]*"|\S+)\s+/g,"$1 "):e).join(`
|
|
2534
|
-
`)}var
|
|
2550
|
+
`)}var e2,Zv=b(()=>{"use strict";e2=`usage: lmctl clone <source> <dest>
|
|
2535
2551
|
|
|
2536
2552
|
Copy a teamfile and strip its session ids, producing a static editable template.
|
|
2537
2553
|
|
|
2538
2554
|
Examples:
|
|
2539
2555
|
lmctl clone ./backend/backend.lmctl ./backend-v2/backend-v2.lmctl
|
|
2540
|
-
`});var tk={};se(tk,{runPlan:()=>
|
|
2556
|
+
`});var tk={};se(tk,{runPlan:()=>f2});import{existsSync as i2,mkdirSync as a2,writeFileSync as l2}from"node:fs";import{basename as Qv,extname as ek,join as c2,resolve as u2}from"node:path";async function f2(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(d2),0;let r=P(t,["--team","--provider"],[]);if(r.error!==void 0)return e.stderr.write(`error: ${r.error}
|
|
2541
2557
|
`),e.stderr.write(`usage: lmctl plan [options] <directory>
|
|
2542
2558
|
`),2;if(r.positionals.length!==1)return e.stderr.write(`usage: lmctl plan [options] <directory>
|
|
2543
|
-
`),2;let n=
|
|
2544
|
-
`),1;let a=
|
|
2559
|
+
`),2;let n=u2(r.positionals[0]);a2(n,{recursive:!0});let s=L(r,"--team")??Qv(n),o=L(r,"--provider")??"claude",i=c2(n,m2(s));if(i2(i))return e.stderr.write(`error: ${i} already exists.
|
|
2560
|
+
`),1;let a=_2({teamName:p2(s),leadProvider:o}),l=ml(a,pl({workdir:n,teamfile:i,date:new Date}));return l2(i,l.text,"utf8"),e.stdout.write(`Created ${i}
|
|
2545
2561
|
`),e.stdout.write(`Edit ${i}; only _MEMBER_ lines are parsed, everything else is free-form.
|
|
2546
2562
|
`),e.stdout.write(`After editing, run: lmctl lint ${i}
|
|
2547
2563
|
`),e.stdout.write(`Then run: lmctl seed ${i}
|
|
2548
|
-
`),0}function
|
|
2564
|
+
`),0}function m2(t){return ek(t)?t:`${t}.lmctl`}function p2(t){let e=ek(t);return e?Qv(t,e):t}function _2(t){let{teamName:e,leadProvider:r}=t;return`# ${e}
|
|
2549
2565
|
|
|
2550
2566
|
# Lead operating guide: https://lmctl.com/skills/lmctl-lead.md
|
|
2551
2567
|
|
|
@@ -2557,7 +2573,7 @@ _MEMBER_ alias=Coder provider=codex
|
|
|
2557
2573
|
_MEMBER_ alias=Reviewer1 provider=codex
|
|
2558
2574
|
_MEMBER_ alias=Reviewer2 provider=${r}
|
|
2559
2575
|
_MEMBER_ alias=Reviewer3 provider=agy
|
|
2560
|
-
`}var
|
|
2576
|
+
`}var d2,rk=b(()=>{"use strict";ge();lm();d2=`usage: lmctl plan [options] <directory>
|
|
2561
2577
|
|
|
2562
2578
|
Generate a starter lmctl team document template for a directory.
|
|
2563
2579
|
|
|
@@ -2572,7 +2588,7 @@ Examples:
|
|
|
2572
2588
|
|
|
2573
2589
|
# Same shape, codex for the Lead and Reviewer2
|
|
2574
2590
|
lmctl plan ./backend --provider codex
|
|
2575
|
-
`});var ok={};se(ok,{SIZE_WARN_EST_TOKENS:()=>_o,estimateTokens:()=>sk,runTerminal:()=>
|
|
2591
|
+
`});var ok={};se(ok,{SIZE_WARN_EST_TOKENS:()=>_o,estimateTokens:()=>sk,runTerminal:()=>w2});import{spawn as h2}from"node:child_process";import{statSync as g2}from"node:fs";async function w2(t,e){if(t.includes("--help")||t.includes("-h"))return v2(e);let r=P(t,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(r.error!==void 0)return y(e,r.error);let n=L(r,"--run");if(n!==void 0){let s=Number.parseInt(n,10);if(!Number.isFinite(s)||s<=0||String(s)!==n)return y(e,`invalid --run "${n}" (expected a positive integer run id)`);if(r.positionals.length>0)return y(e,"--run is mutually exclusive with positional <teamfile>[:alias]");let o=["--team","--project","--size","--json"];for(let i of o)if(i==="--size"||i==="--json"?C(r,i):L(r,i)!==void 0)return y(e,`--run is mutually exclusive with ${i}`);try{return await R(e,async i=>{let a=L(r,"--alias"),l=bT(i,s,a);return"err"in l?y(e,l.err):hm(e,{provider:l.ok.provider,sessionid:l.ok.sessionid,sessiondir:l.ok.sessiondir})})}catch(i){return _e(e,i)}}if(r.positionals.length>0){let s=["--team","--project","--size","--alias","--json"];for(let l of s)if(l==="--size"||l==="--json"?C(r,l):L(r,l)!==void 0)return y(e,`positional <teamfile>[:alias] is mutually exclusive with ${l} (alias is the SECOND POSITIONAL: \`terminal <teamfile> <alias>\`).`);if(r.positionals.length>2)return y(e,`too many positionals (${r.positionals.length}); expected <teamfile>[:alias] [alias]`);let o=r.positionals[0],i=r.positionals[1],a=ur(y2,{target:o,alias:i,flags:{}});return a.mode==="error"?y(e,a.message):a.mode!=="ai-team"?y(e,`internal: terminal positional yielded unexpected mode "${a.mode}"`):a.alias===void 0?y(e,"terminal: alias required for the teamfile target"):await R(e,l=>E2(e,a.teamfile,a.alias,l))}try{return await R(e,async s=>{let o=T2(e,s,r);if(typeof o=="number")return o;let i=L(r,"--alias");return C(r,"--size")?S2(e,s,o,i,C(r,"--json")):b2(e,s,o,i)})}catch(s){return _e(e,s)}}async function E2(t,e,r,n){let s;try{s=Pe(e,r,n)}catch(l){return l instanceof be?y(t,l.message):_e(t,l)}let o=nr(n,{receiver_teamfile:s.teamfile,receiver_alias:s.alias,sender_teamfile:s.teamfile,sender_alias:"terminal",ttlMs:sr()});if(!o.acquired)return y(t,`${s.alias} is busy/held by ${o.current.sender_alias} (${o.current.sender_teamfile}) since ${o.current.started_at}`);let i=bS({teamfile:s.teamfile,alias:s.alias}),a=null;try{n.setTerminalLock(i),a=setInterval(()=>{try{!n.heartbeatTerminalLock(i.teamfile,i.alias,i.lock_id,new Date().toISOString())&&a!==null&&(clearInterval(a),a=null)}catch{}},SS()),a.unref?.();try{bn(t,Me(s.teamfile),s.teamfile)}catch{}return await hm(t,{provider:s.provider,sessionid:s.sessionid,sessiondir:s.sessiondir,isLead:s.isLead})}finally{a!==null&&clearInterval(a),n.clearTerminalLock(i.teamfile,i.alias,i.lock_id),n.releaseAgentInflight(o.lease)}}async function hm(t,e){let{provider:r,sessionid:n,sessiondir:s}=e;if(!$i(r))return y(t,`no resume incantation for provider "${r}"`);if(!Ig.test(n))return y(t,"refusing to resume: malformed sessionid");let o=Cu(r,n,{isLead:e.isLead});if(o===null||o.length===0)return y(t,`no resume incantation for provider "${r}"`);let[i,...a]=o;return await new Promise(l=>{let c=h2(i,a,{stdio:"inherit",cwd:s,env:Je(process.env,s,n)});c.on("error",u=>{l(y(t,`failed to launch ${i}: ${u.message}`))}),c.on("exit",u=>l(u??0))})}function T2(t,e,r){let n=L(r,"--team");if(n!==void 0){let i=e.findTeamByName(n);return i===null?y(t,`team not found: ${n}`):i}let s=Gi(t,e,L(r,"--project"));return typeof s=="number"?s:Ki(t,e,s,void 0)}async function b2(t,e,r,n){let s=Vi(t,e,r,n);if(typeof s=="number")return s;let o=s.sessionid;return o===null||o.trim().length===0?y(t,`member ${s.alias} has no session yet \u2014 run \`lmctl team seed ${r.name}\` first`):hm(t,{provider:xe(s),sessionid:o,sessiondir:s.sessiondir})}function sk(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=g2(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 S2(t,e,r,n,s){let o;if(n!==void 0){let a=e.findTeamMemberByAlias(r.id,n);if(a===null||a.state==="retired")return y(t,`member not found: ${n}`);o=[a]}else o=e.listTeamMembers(r.id).filter(a=>a.state!=="retired"&&a.sessionid!==null);let i=[];for(let a of o){let l=a.sessionid;if(l===null)continue;let c=xe(a),u=null;$i(c)&&(u=await Xt(l,c));let d=sk(u),f=d.est>_o;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?gn(c,l):null})}if(s)return F(t,{estimate:!0,legend:nk,guide_tokens:_o,members:i}),0;t.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
|
|
2576
2592
|
`),t.stdout.write(`${nk}
|
|
2577
2593
|
`);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)
|
|
2578
2594
|
`),a.over_guide&&t.stdout.write(` \u26A0 ${a.alias}: estimated ~${a.est_tokens} tokens \u2014 ESTIMATE only, exceeds the 200K guide.
|
|
@@ -2580,7 +2596,7 @@ Examples:
|
|
|
2580
2596
|
session yourself:
|
|
2581
2597
|
${a.resume_incantation??"(no resume incantation for provider "+a.provider+")"}
|
|
2582
2598
|
(or: lmctl terminal --team ${r.name} --alias ${a.alias})
|
|
2583
|
-
`)}return 0}function
|
|
2599
|
+
`)}return 0}function v2(t){return t.stdout.write(`usage: lmctl terminal <teamfile>:<alias>
|
|
2584
2600
|
lmctl terminal <teamfile> <alias>
|
|
2585
2601
|
lmctl terminal --run <id> [--alias A]
|
|
2586
2602
|
lmctl terminal [--project P] [--team T] [--alias A] [--size] [--json]
|
|
@@ -2611,66 +2627,66 @@ Examples:
|
|
|
2611
2627
|
tokens it surfaces the resume incantation so YOU can
|
|
2612
2628
|
open & self-compact. Nothing is ever changed
|
|
2613
2629
|
automatically; ${_o} is a guide, not a gate.
|
|
2614
|
-
`),0}var
|
|
2630
|
+
`),0}var y2,_o,nk,ik=b(()=>{"use strict";Be();Fr();ge();Vu();xt();vt();rt();Os();es();Oo();Bf();Wa();y2={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},_o=2e5,nk="est = rough local heuristic (~4 chars/token), NOT an exact provider token count \u2014 open the session to verify before acting."});import{resolve as gm,dirname as uk}from"node:path";function ym(t,e){let r=gm(t);for(;;){let n=k2(e,r);if(n!==null)return n;let s=uk(r);if(s===r)return null;r=s}}function k2(t,e){return t.db.prepare("SELECT * FROM project WHERE local_path = ? LIMIT 1").get(e)??null}function yl(){return process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0}function wl(){return process.env.LMCTL_WORKSPACE!==void 0&&process.env.LMCTL_WORKSPACE.length>0}function wm(t){if(t.io.dal!==void 0){let o=ak(t.io.dal,t.cwd,t.projectName);if(o===null)throw new ct(lk(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(yl()||wl()){let o=le(),i=he({path:o}),a=ak(i,t.cwd,t.projectName);if(a===null)throw i.close(),new ct(lk(t.projectName));return{dal:i,ownsDal:!0,dbPath:o,workspaceName:wl()?process.env.LMCTL_WORKSPACE??null:null,project:a,matchedLocalPath:t.projectName===void 0?a.local_path:null,resolverMode:yl()?"explicit-db":"explicit-workspace"}}let e=t.projectName===void 0?fk(t.cwd):I2(t.projectName),r=mk(e,t.projectName===void 0?"cwd":"project"),n=he({path:r.candidate.db_path}),s=n.getProject(r.project.id);if(s===null)throw n.close(),new ct(`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 dk(t){if(t.io.dal!==void 0)return{dal:t.io.dal,ownsDal:!1,dbPath:":injected:",workspaceName:null,resolverMode:"injected"};if(yl()||wl()){let n=le();return{dal:he({path:n}),ownsDal:!0,dbPath:n,workspaceName:wl()?process.env.LMCTL_WORKSPACE??null:null,resolverMode:yl()?"explicit-db":"explicit-workspace"}}let e;try{e=fk(t.cwd)}catch{throw new ct("job ids are workspace-local and cwd does not resolve to a workspace DB; use --workspace <name> or --db <path>")}let r=mk(e,"job-cwd");return{dal:he({path:r.candidate.db_path}),ownsDal:!0,dbPath:r.candidate.db_path,workspaceName:r.candidate.workspace_name,resolverMode:"cwd-scan"}}function ak(t,e,r){return r!==void 0?t.findProjectByName(r):ym(e,t)}function lk(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 I2(t){let e=[];for(let r of Nl())for(let n of pk(r))n.name===t&&e.push({candidate:r,project:n,matched_local_path:null,match_depth:0});if(e.length===0)throw new ct(`project not found in any workspace DB: ${t}`);return e}function fk(t){let e=N2(t),r=new Map;e.forEach((s,o)=>{r.set(s,e.length-o)});let n=[];for(let s of Nl())for(let o of pk(s)){let i=gm(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 ct("no lmctl project found for cwd in workspace DBs; pass --workspace and --project");return n}function mk(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 ct(`job ids are workspace-local and cwd resolves ambiguously; use --workspace <name> or --db <path>
|
|
2615
2631
|
${ck(n)}`):new ct(`ambiguous lmctl ${e} match; use --workspace <name> --project <name>
|
|
2616
2632
|
${ck(n)}`)}function ck(t){return t.map(e=>` workspace ${e.candidate.workspace_name??"(legacy)"} project ${e.project.name} ${e.project.local_path}`).join(`
|
|
2617
|
-
`)}function
|
|
2618
|
-
`),0;let r=P(t,["--workflow","--project","--inputs","--job"],["--json","--verbose","--yes","--no-prompt"]);if(r.error!==void 0)return br(e,r.error);if(r.positionals.length>1)return br(e,El);let n=
|
|
2633
|
+
`)}function N2(t){let e=[],r=gm(t);for(;;){e.push(r);let n=uk(r);if(n===r)return e;r=n}}function pk(t){let e=null;try{e=new ko(t.db_path,{readonly:!0,fileMustExist:!0});let r=Number(e.pragma("user_version",{simple:!0})??0);if(!Number.isInteger(r)||r<=0||r>ql)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 ct,Em=b(()=>{"use strict";Bl();Jl();Be();Ve();ct=class extends Error{constructor(e){super(e),this.name="CliContextError"}}});var Im={};se(Im,{assertNoCrossWorkflowSubflowCycle:()=>Tk,firstUnregisteredArchetype:()=>km,runWorkflow:()=>W2});import{createHash as Sm,randomUUID as A2}from"node:crypto";import{existsSync as x2,readFileSync as bl,readdirSync as R2,writeFileSync as L2}from"node:fs";import{basename as $2,join as O2,resolve as j2}from"node:path";import{pathToFileURL as C2}from"node:url";function vm(t,e){return{source_uri:C2(j2(t)).href,source_sha256:Sm("sha256").update(e).digest("hex")}}function gk(t){return Sm("sha256").update(t).digest("hex")}async function F2(t){let e=await So(t,{description:"remote workflow URL"});return{definition:e.toString("utf8"),source_uri:t,source_sha256:gk(e),remote:!0}}async function Tl(t){if(pr(t)){let n=await Ls(t),s=bl(n,"utf8");return{definition:s,source_uri:t,source_sha256:gk(s),remote:!1}}let e=Qn(t,"remote workflow URLs");if(e!==null)throw new Error(e);if(Zn(t))return F2(t);let r=bl(t,"utf8");return{definition:r,...vm(t,r),remote:!1}}function yk(t){return Fe(t.definition)}function wk(t){if(t.definition_schema_version!==3)return null;let e=km(t);return e!==null?`unknown archetype \`${e.type}\` (step \`${e.id}\`) \u2014 not in the live archetype registry`:null}function U2(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 W2(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(P2),0;try{return r==="run"?await B2(n,e):await R(e,s=>{switch(r){case"load":return X2(n,e,s);case"author":return G2(n,e,s);case"list":return K2(n,e,s);case"sync":return V2(n,e,s);case"export":return Y2(n,e,s);default:return y(e,"usage: lmctl workflow <load|author|list|sync|export|run>")}})}catch(s){return s instanceof ct?y(e,s.message):_e(e,s)}}async function B2(t,e){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(`${El}
|
|
2634
|
+
`),0;let r=P(t,["--workflow","--project","--inputs","--job"],["--json","--verbose","--yes","--no-prompt"]);if(r.error!==void 0)return br(e,r.error);if(r.positionals.length>1)return br(e,El);let n=C(r,"--json"),s=L(r,"--workflow"),o=L(r,"--project"),i=L(r,"--job"),a=L(r,"--inputs"),l=C(r,"--verbose"),c=r.positionals[0],u=C(r,"--yes")||C(r,"--no-prompt");if(c!==void 0){if(s!==void 0||i!==void 0)return br(e,"remote workflow URL cannot be combined with --workflow or --job");if(!jl(c))return br(e,El);if(pr(c))return _k(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u});let m=Qn(c,"remote workflow URLs");return m!==null?y(e,m):_k(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u})}if(s!==void 0&&i!==void 0)return br(e,"--workflow and --job are mutually exclusive");if(s===void 0&&i===void 0)return br(e,El);if(i!==void 0&&(o!==void 0||a!==void 0))return br(e,"--job cannot be combined with --project or --inputs");if(i!==void 0){let m=q2(i);if(m===null)return br(e,`invalid --job: ${i}`);let p=dk({cwd:process.cwd(),io:e});try{let _=await Ks({dal:p.dal,job_id:m,worker_id:Tm()});return bm(e,_,{json:n,workflowName:null,projectName:null,workspaceName:p.workspaceName,dbPath:p.dbPath,verbose:l})}finally{p.ownsDal&&p.dal.close()}}let d=Ek(a,e);if(d===Sl)return 2;let f=wm({cwd:process.cwd(),io:e,projectName:o});try{let m=f.dal.getWorkflowByName(s);if(m===null)return y(e,`workflow not found: ${s}`);let p=f.dal.enqueueJob({project_id:f.project.id,workflow_id_override:m.id,source:"cli-workflow-run",payload:JSON.stringify(d),priority:0}),_=await Ks({dal:f.dal,job_id:p.id,worker_id:Tm()});return bm(e,_,{json:n,workflowName:s,projectName:f.project.name,workspaceName:f.workspaceName,dbPath:f.dbPath,verbose:l})}finally{f.ownsDal&&f.dal.close()}}async function _k(t,e){let{io:r,json:n,projectName:s,inputsValue:o,verbose:i,yes:a}=e,l=Ek(o,r);if(l===Sl)return 2;let c,u;try{c=await Tl(t),u=yk(c)}catch(m){return y(r,m instanceof Error?m.message:String(m))}let d=wk(u);if(d!==null)return y(r,d);if(c.remote&&!await H2(r,c,u,a))return 1;let f=wm({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}),_=await Ks({dal:f.dal,job_id:p.id,worker_id:Tm()});return bm(r,_,{json:n,workflowName:m.name,projectName:f.project.name,workspaceName:f.workspaceName,dbPath:f.dbPath,verbose:i})}finally{f.ownsDal&&f.dal.close()}}function br(t,e){return t.stderr.write(`error: ${e}
|
|
2619
2635
|
`),2}function Ek(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)}
|
|
2620
2636
|
`),Sl}return r===null||typeof r!="object"||Array.isArray(r)?(e.stderr.write(`error: --inputs must be a JSON object
|
|
2621
|
-
`),Sl):r}function
|
|
2637
|
+
`),Sl):r}function q2(t){if(!/^[1-9][0-9]*$/.test(t))return null;let e=Number(t);return Number.isSafeInteger(e)?e:null}function Tm(){return`cli-${process.pid}-${A2().slice(0,8)}`}function bm(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?F(t,s):t.stderr.write(`error: job ${e.job_id} not claimable: ${e.reason}${e.locked_by?` (locked_by=${e.locked_by})`:""}
|
|
2622
2638
|
`),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?F(t,n):e.status==="paused"?t.stdout.write(`workflow paused job=${e.job_id} run=${e.run_id}
|
|
2623
2639
|
`):e.status==="failed"?t.stderr.write(`workflow failed job=${e.job_id}
|
|
2624
2640
|
`):(t.stdout.write(`workflow completed job=${e.job_id} run=${e.run_id} terminal_state=${e.terminal_state??"null"}
|
|
2625
2641
|
`),e.terminal_state!==null&&e.terminal_state!=="done"&&e.terminal_state!=="success"&&t.stderr.write(`warning: workflow terminal_state=${e.terminal_state}
|
|
2626
|
-
`)),e.status==="failed"?1:0}async function
|
|
2642
|
+
`)),e.status==="failed"?1:0}async function H2(t,e,r,n){let s=U2(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(`
|
|
2627
2643
|
`)+`
|
|
2628
|
-
`),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
|
|
2629
|
-
`),a}function
|
|
2644
|
+
`),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 J2(o),a=/^(y|yes)$/i.test(i.trim());return a||t.stderr.write(`aborted remote workflow run
|
|
2645
|
+
`),a}function J2(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 X2(t,e,r){let[n,s]=t;if(n===void 0||s===void 0)return y(e,"usage: workflow load <name> <path-to-json | lmctl://workflow/<name> | https://...>");let o;if(pr(s))try{o=await Tl(s)}catch(c){return y(e,c instanceof Error?c.message:String(c))}else if(Zn(s))try{o=await Tl(s)}catch(c){return y(e,c instanceof Error?c.message:String(c))}else{let c=Qn(s,"remote workflow URLs");if(c!==null)return y(e,c);o=await Tl(s)}let i;try{i=yk(o)}catch(c){if(o.remote)return y(e,c instanceof Error?c.message:String(c));throw c}let a=o.remote?wk(i):null;if(a!==null)return y(e,a);let l=r.upsertWorkflow({name:n,definition_schema_version:i.definition_schema_version,definition:o.definition,source_uri:o.source_uri,source_sha256:o.source_sha256});return e.stdout.write(`loaded workflow ${l.name}@${l.version}
|
|
2630
2646
|
`),o.remote&&e.stdout.write(`source: ${o.source_uri}
|
|
2631
2647
|
sha256: ${o.source_sha256}
|
|
2632
|
-
`),0}function km(t){let e=Ta();for(let r of t.steps)if(e.get(r.type)===void 0)return{id:r.id,type:r.type};return null}function hk(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 Tk(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
|
|
2633
|
-
`),0}function
|
|
2648
|
+
`),0}function km(t){let e=Ta();for(let r of t.steps)if(e.get(r.type)===void 0)return{id:r.id,type:r.type};return null}function hk(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 Tk(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 G2(t,e,r){let n=process.env.LMCTL_DSL;if(n!==void 0&&["0","false","off"].includes(n.trim().toLowerCase()))return y(e,"workflow author is disabled by the LMCTL_DSL kill-switch (unset it to use the GA DSL path; durable-memory/composition-language-design.md \xA710)");let[s,o]=t;if(s===void 0)return y(e,"usage: lmctl workflow author <file.dsl> [name]");let i=bl(s,"utf8"),a;try{a=Fe(i)}catch(m){return y(e,`compile failed: ${m instanceof Error?m.message:String(m)}`)}if(a.definition_schema_version!==3)return _e(e,new Error("composition DSL must compile to a v3 graph workflow"));let l=a,c=km(l);if(c!==null)return y(e,`unknown archetype \`${c.type}\` (step \`${c.id}\`) \u2014 not in the live archetype registry`);let u=o??l.name,d=JSON.stringify(l);try{Tk(u,hk(l),m=>{let p=r.getWorkflowByName(m);if(p===null)return null;try{return hk(JSON.parse(p.definition))}catch{return null}})}catch(m){return y(e,`${m instanceof Error?m.message:String(m)}`)}let f;try{f=r.upsertWorkflow({name:u,definition_schema_version:3,definition:d,...vm(s,i)})}catch(m){return y(e,`${m instanceof Error?m.message:String(m)}`)}return r.insertCompositionUnit({name:u,version:f.version,lang:"lmctl/dsl@1",source:i,source_sha:Sm("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)
|
|
2649
|
+
`),0}function K2(t,e,r){let n=P(t,[]);if(n.error!==void 0)return y(e,n.error);let s=r.listWorkflows();return C(n,"--json")?F(e,s):e.stdout.write(`${s.map(o=>`${o.name}@${o.version}`).join(`
|
|
2634
2650
|
`)}${s.length>0?`
|
|
2635
|
-
`:""}`),0}function
|
|
2636
|
-
`),0}function
|
|
2637
|
-
`,c=L(n,"--out");return c!==void 0?(
|
|
2638
|
-
`)):e.stdout.write(l),0}var
|
|
2651
|
+
`:""}`),0}function V2(t,e,r){let n=P(t,[]);if(n.error!==void 0)return y(e,n.error);Di({swallow:!0});let s=Lg(),o=[];try{o=x2(s)?R2(s).filter(c=>M2.some(u=>c.endsWith(u))):[]}catch{o=[]}let i=0,a=0,l=0;for(let c of[...o].sort()){let u=O2(s,c),d=bl(u,"utf8"),f;try{f=Fe(d)}catch(k){return y(e,`compile failed for ${c}: ${k instanceof Error?k.message:String(k)}`)}let m=f.name,p=typeof m=="string"&&m.length>0?m:$2(c).replace(/\.(compound\.json|lmctl)$/i,""),_=c.endsWith(".lmctl"),g=_?JSON.stringify(f):d,h=_?3:f.definition_schema_version,T=vm(u,d),w=r.getWorkflowByName(p);if(w!==null&&w.source_sha256===T.source_sha256){l+=1;continue}let E=w===null;r.upsertWorkflow({name:p,definition_schema_version:h,definition:g,...T}),E?i+=1:a+=1}return C(n,"--json")?F(e,{total:o.length,created:i,updated:a,unchanged:l}):e.stdout.write(`synced ${o.length} template(s): ${i} created, ${a} updated, ${l} unchanged
|
|
2652
|
+
`),0}function Y2(t,e,r){let n=P(t,["--out"]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: lmctl workflow export <name> [--out <file>] [--json]");let o=r.getWorkflowByName(s);if(o===null)return y(e,`workflow not found: ${s}`);let i;try{i=JSON.parse(o.definition)}catch{i=o.definition}let a={_lmctl_export:D2,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)}
|
|
2653
|
+
`,c=L(n,"--out");return c!==void 0?(L2(c,l),e.stdout.write(`exported ${o.name}@${o.version} \u2192 ${c} (inspection-only; NOT re-importable)
|
|
2654
|
+
`)):e.stdout.write(l),0}var M2,D2,P2,El,Sl,Nm=b(()=>{"use strict";jd();xn();Fi();Fu();ge();Em();Cl();Vs();M2=[".compound.json",".lmctl"],D2="INSPECTION ONLY \u2014 NOT a re-importable workflow source. Edit the basedir template then `lmctl workflow sync`; do NOT `workflow load` this file.",P2=`usage: lmctl workflow <load|author|list|sync|export|run>
|
|
2639
2655
|
|
|
2640
2656
|
Load, author, list, synchronize, inspect, or run workflow definitions. The
|
|
2641
2657
|
load subcommand accepts local JSON, lmctl:// workflow URIs, and https:// JSON
|
|
2642
2658
|
URLs. The run subcommand executes a loaded workflow/job, or one-shot runs a
|
|
2643
2659
|
remote https:// workflow after a trust prompt.
|
|
2644
|
-
`,El="usage: workflow run (<https-url | lmctl://workflow/<name>> [--project <name>] [--inputs <json-object>] [--yes|--no-prompt] [--verbose] | --workflow <name> [--project <name>] [--inputs <json-object>] [--verbose] | --job <id>) [--json]";Sl=Symbol("inputs-error")});function
|
|
2645
|
-
`)}return 0}function
|
|
2646
|
-
`),0}function
|
|
2647
|
-
`),
|
|
2648
|
-
`),0}function
|
|
2649
|
-
`),0}function
|
|
2650
|
-
`),0):y(e,`workspace not found: ${n}`)}function
|
|
2651
|
-
`),kl(t).isDirectory()?
|
|
2660
|
+
`,El="usage: workflow run (<https-url | lmctl://workflow/<name>> [--project <name>] [--inputs <json-object>] [--yes|--no-prompt] [--verbose] | --workflow <name> [--project <name>] [--inputs <json-object>] [--verbose] | --job <id>) [--json]";Sl=Symbol("inputs-error")});function Am(t,e){let r=z2[t],n=e("which",[t]);return n.status===0&&(n.stdout??"").toString().trim()!==""?e(t,["--version"]).status===0?{provider:t,status:"ok",detail:"installed, --version OK"}:{provider:t,status:"unverified",detail:"installed, session unverified (auth may be required)"}:r.optional?{provider:t,status:"skipped",detail:"not installed"}:{provider:t,status:"missing",detail:`not installed (install: ${r.install_hint})`,remediation:r.install_remediation}}var z2,bk=b(()=>{"use strict";z2={claude:{install_hint:"https://docs.claude.com/en/docs/claude-code",optional:!1,install_remediation:"see https://docs.claude.com/en/docs/claude-code"},codex:{install_hint:"https://github.com/openai/codex",optional:!1,install_remediation:"see https://github.com/openai/codex"},gemini:{install_hint:"https://github.com/google/generative-ai-cli",optional:!1,install_remediation:"npm i -g @google/gemini-cli"},opencode:{install_hint:"https://opencode.ai",optional:!0,install_remediation:"see https://opencode.ai"},lmplayer:{install_hint:"Install lmplayer and ensure the lmplayer binary is on PATH.",optional:!0,install_remediation:"install lmplayer and ensure the lmplayer binary is on PATH"},qwen:{install_hint:"https://github.com/QwenLM/qwen-code",optional:!0,install_remediation:"npm i -g @qwen-code/qwen-code"},copilot:{install_hint:"https://docs.github.com/copilot/cli",optional:!0,install_remediation:"see https://docs.github.com/copilot/cli"},agy:{install_hint:"https://antigravity.google",optional:!0,install_remediation:"see https://antigravity.google"}}});var xk={};se(xk,{initWorkspace:()=>Nk,runWorkspace:()=>sJ,setWorkspaceProvider:()=>Ak});import{copyFileSync as Z2,cpSync as Q2,existsSync as We,mkdirSync as Sr,readdirSync as Rm,renameSync as eJ,rmSync as vl,statSync as kl,writeFileSync as tJ}from"node:fs";import{spawnSync as rJ}from"node:child_process";import{homedir as Sk}from"node:os";import{dirname as Lm,join as ho}from"node:path";async function sJ(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(nJ),0;switch(r){case"list":return oJ(n,e);case"create":return iJ(n,e);case"use":return aJ(n,e);case"show":return lJ(n,e);case"delete":return cJ(n,e);case"migrate":return uJ(n,e);case"init":return Nk(n,e);case"set-provider":return Ak(n,e);default:return y(e,"usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>")}}function kk(){let t=yo(),e=[],r=new Set,n=Ir.default,s=We(Gn()),o=We(Dt(n));if((s||o||t===null||t===n)&&(e.push({name:n,db_path:o?er(n):Gn(),active:t===null||t===n,legacy:!o&&s}),r.add(n)),We(kr())){let i;try{i=Rm(kr())}catch{i=[]}for(let a of i.sort()){if(r.has(a)||!Ke(a))continue;let l=!1;try{l=kl(Dt(a)).isDirectory()}catch{l=!1}l&&(e.push({name:a,db_path:er(a),active:t===a,legacy:!1}),r.add(a))}}return e}function oJ(t,e){let r=P(t,[]);if(r.error!==void 0)return y(e,r.error);if(r.positionals.length!==0)return y(e,"usage: lmctl workspace list");let n=kk();if(C(r,"--json"))return F(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}
|
|
2661
|
+
`)}return 0}function iJ(t,e){let r=P(t,["--docroot"]);if(r.error!==void 0)return y(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return y(e,"usage: lmctl workspace create <name> [--docroot PATH]");if(!Ke(n))return y(e,`invalid workspace name: ${n} (allowed: letters, digits, '.', '-', '_'; must start with alnum; \u226464 chars)`);let s=Dt(n);if(We(s))return y(e,`workspace already exists: ${n} (${s})`);let o=L(r,"--docroot")??Al(n);Sr(s,{recursive:!0}),Sr(o,{recursive:!0});let i=er(n);Sr(Lm(i),{recursive:!0});let a=he({path:i});try{a.setConfig("project.docroot",o)}finally{a.close()}let l={name:n,dir:s,db_path:i,docroot:o};return C(r,"--json")?F(e,l):e.stdout.write(`created workspace ${n} at ${s}
|
|
2662
|
+
`),0}function aJ(t,e){let r=P(t,[]);if(r.error!==void 0)return y(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return y(e,"usage: lmctl workspace use <name>");if(!Ke(n))return y(e,`invalid workspace name: ${n}`);if(n!==Ir.default&&!We(Dt(n)))return y(e,`workspace not found: ${n} (run \`lmctl workspace create ${n}\` first)`);let s=go();return Sr(Lm(s),{recursive:!0}),tJ(s,`${n}
|
|
2663
|
+
`),C(r,"--json")?F(e,{active:n,path:s}):e.stdout.write(`active workspace set to ${n}
|
|
2664
|
+
`),0}function lJ(t,e){let r=P(t,[]);if(r.error!==void 0)return y(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return y(e,"usage: lmctl workspace show <name>");if(!Ke(n))return y(e,`invalid workspace name: ${n}`);let s=kk().find(u=>u.name===n);if(s===void 0)return y(e,`workspace not found: ${n}`);let o=0;try{o=We(s.db_path)?kl(s.db_path).size:0}catch{o=0}let i=0,a=null,l={};if(We(s.db_path)){let u=he({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 C(r,"--json")?F(e,c):e.stdout.write(`${JSON.stringify(c,null,2)}
|
|
2665
|
+
`),0}function cJ(t,e){let r=P(t,[],["--json","--confirm","--force"]);if(r.error!==void 0)return y(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return y(e,"usage: lmctl workspace delete <name> --confirm [--force]");if(!Ke(n))return y(e,`invalid workspace name: ${n}`);if(!C(r,"--confirm"))return y(e,`refusing to delete workspace ${n} without --confirm`);if(n===Ir.default&&!C(r,"--force"))return y(e,"refusing to delete the default workspace without --force");if(yo()===n&&!C(r,"--force"))return y(e,`refusing to delete the active workspace (${n}) without --force`);let o=Dt(n);return We(o)?(vl(o,{recursive:!0,force:!0}),C(r,"--json")?F(e,{deleted:n,dir:o}):e.stdout.write(`deleted workspace ${n}
|
|
2666
|
+
`),0):y(e,`workspace not found: ${n}`)}function xm(t,e,r){try{eJ(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
|
|
2667
|
+
`),kl(t).isDirectory()?Q2(t,e,{recursive:!0}):Z2(t,e),!We(e))throw new Error(`migration copy verification failed: ${e} not present after copy`);vl(t,{recursive:!0,force:!0})}function uJ(t,e){let r=P(t,[],["--json"]);if(r.error!==void 0)return y(e,r.error);let n=C(r,"--json"),s=xl(),o=kr(),i=[],a=(f,m)=>{if(n)F(e,{migrated:f,reason:m??null,actions:i});else{for(let p of i)e.stdout.write(`${p}
|
|
2652
2668
|
`);e.stdout.write(f?`migration complete
|
|
2653
2669
|
`:`${m??"nothing to migrate"}
|
|
2654
|
-
`)}return 0};if(!
|
|
2670
|
+
`)}return 0};if(!We(s))return a(!1,"no legacy ~/.lmctl/profiles/ found; nothing to migrate");let l;try{l=Rm(s).sort()}catch{l=[]}let c=l.filter(f=>{try{return kl(ho(s,f)).isDirectory()}catch{return!1}});if(c.length===0)vl(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`);else if(!We(o))xm(s,o,e),i.push(`renamed ${s} -> ${o}`);else{let f=c.filter(m=>We(ho(o,m)));if(f.length>0)return y(e,`refusing to migrate: ~/.lmctl/workspaces/ already has: ${f.join(", ")} (no files were moved; resolve the name collision, then re-run \`lmctl workspace migrate\`)`);Sr(o,{recursive:!0});for(let m of c)xm(ho(s,m),ho(o,m),e),i.push(`moved ${m} -> workspaces/${m}`);try{Rm(s).length===0&&(vl(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`))}catch{}}let u=Xm(),d=go();return We(u)&&(We(d)?i.push("left active-profile in place (active-workspace already exists; not clobbering)"):(xm(u,d,e),i.push("renamed active-profile -> active-workspace"))),a(!0)}function Ik(t,e){return rJ(t,e,{encoding:"utf8",timeout:5e3,maxBuffer:1024*1024})}function mJ(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 vk(t){return t==="~"?Sk():t.startsWith("~/")?ho(Sk(),t.slice(2)):t}async function Nk(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: ${Jn.join(", ")}.`].join(`
|
|
2655
2671
|
`)+`
|
|
2656
|
-
`),0;let s=P(t,["--name","--basedir","--provider1","--provider2","--provider3"]);if(s.error!==void 0)return y(e,s.error);if(s.positionals.length!==0)return y(e,n);let o=r.spawn??Ik,a=Jn.map(N=>
|
|
2657
|
-
`),2;let l=r.isTty??!!process.stdin.isTTY,c=r.promptLine??
|
|
2672
|
+
`),0;let s=P(t,["--name","--basedir","--provider1","--provider2","--provider3"]);if(s.error!==void 0)return y(e,s.error);if(s.positionals.length!==0)return y(e,n);let o=r.spawn??Ik,a=Jn.map(N=>Am(N,o)).filter(N=>N.status==="ok"||N.status==="unverified").map(N=>N.provider);if(a.length===0)return e.stderr.write(`error: no provider CLI found on PATH; install/auth ${Jn.join("|")} first
|
|
2673
|
+
`),2;let l=r.isTty??!!process.stdin.isTTY,c=r.promptLine??mJ,u=r.promptLine!==void 0||l,d=N=>(e.stderr.write(`error: ${N} is required in non-interactive mode (no TTY); pass it explicitly
|
|
2658
2674
|
`),2),f,m=L(s,"--name");if(m!==void 0){if(!Ke(m))return e.stderr.write(`error: invalid workspace name: ${m}
|
|
2659
2675
|
`),2;f=m}else{if(!u)return d("--name");for(;;){let N=(await c("Workspace name [default]: ")).trim(),H=N.length===0?"default":N;if(Ke(H)){f=H;break}e.stderr.write(`invalid workspace name: ${H} (letters/digits/.-_, start alnum, \u226464)
|
|
2660
|
-
`)}}let p=Dt(f);if(
|
|
2661
|
-
`),2;let _,g=L(s,"--basedir"),h=
|
|
2662
|
-
`),2;T[N]=H;continue}if(!u)return d(`--${N}`);for(;;){let O=(await c(`${N} (${
|
|
2663
|
-
`)}}Sr(p,{recursive:!0}),Sr(_,{recursive:!0});let w=er(f);Sr(Lm(w),{recursive:!0});let E=he({path:w});try{E.setConfig("project.docroot",_),E.setConfig("workspace.provider1",T.provider1),E.setConfig("workspace.provider2",T.provider2),E.setConfig("workspace.provider3",T.provider3)}finally{E.close()}let k={name:f,dir:p,db_path:w,basedir:_,providers:{...T}};return
|
|
2676
|
+
`)}}let p=Dt(f);if(We(p))return e.stderr.write(`error: workspace already exists: ${f} (${p}) \u2014 refusing to overwrite
|
|
2677
|
+
`),2;let _,g=L(s,"--basedir"),h=Al(f);if(g!==void 0)_=vk(g);else{if(!u)return d("--basedir");let N=(await c(`Base directory for this workspace's projects [${h}]: `)).trim();_=N.length===0?h:vk(N)}let T={};for(let N of["provider1","provider2","provider3"]){let H=L(s,`--${N}`),ne=dJ[N],q=a.includes(ne)?ne:a[0];if(H!==void 0){if(!a.includes(H))return e.stderr.write(`error: --${N} ${H} is not an available provider (available: ${a.join(", ")})
|
|
2678
|
+
`),2;T[N]=H;continue}if(!u)return d(`--${N}`);for(;;){let O=(await c(`${N} (${fJ[N]}) [${q}]: `)).trim(),x=O.length===0?q:O;if(a.includes(x)){T[N]=x;break}e.stderr.write(`not an available provider: ${x} (available: ${a.join(", ")})
|
|
2679
|
+
`)}}Sr(p,{recursive:!0}),Sr(_,{recursive:!0});let w=er(f);Sr(Lm(w),{recursive:!0});let E=he({path:w});try{E.setConfig("project.docroot",_),E.setConfig("workspace.provider1",T.provider1),E.setConfig("workspace.provider2",T.provider2),E.setConfig("workspace.provider3",T.provider3)}finally{E.close()}let k={name:f,dir:p,db_path:w,basedir:_,providers:{...T}};return C(s,"--json")?F(e,k):(e.stdout.write(`created workspace ${f} at ${p}
|
|
2664
2680
|
`),e.stdout.write(` basedir: ${_}
|
|
2665
2681
|
`),e.stdout.write(` provider1=${T.provider1} provider2=${T.provider2} provider3=${T.provider3}
|
|
2666
2682
|
`),e.stdout.write(`activate it with: lmctl workspace use ${f}
|
|
2667
|
-
`)),0}async function
|
|
2683
|
+
`)),0}async function Ak(t,e,r={}){let n="usage: lmctl [--workspace W] workspace set-provider <provider1|provider2|provider3> <concrete>";if(t.includes("--help")||t.includes("-h"))return e.stdout.write([n,"","Remaps an abstract provider slot for the selected workspace. The next","`team seed` resolves that slot to the new concrete; already-seeded",`members keep their frozen provider_resolved. Scanned providers: ${Jn.join(", ")}.`].join(`
|
|
2668
2684
|
`)+`
|
|
2669
2685
|
`),0;let s=P(t,[]);if(s.error!==void 0)return y(e,s.error);let[o,i,...a]=s.positionals;if(o===void 0||i===void 0||a.length!==0)return y(e,n);let l=/^provider[123]$/.test(o)?o:/^[123]$/.test(o)?`provider${o}`:null;if(l===null)return e.stderr.write(`error: invalid slot: ${o} (expected provider1, provider2, or provider3)
|
|
2670
|
-
`),2;let c=r.spawn??Ik,u=Jn.map(p=>
|
|
2686
|
+
`),2;let c=r.spawn??Ik,u=Jn.map(p=>Am(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 ${Jn.join("|")} first
|
|
2671
2687
|
`),2;if(!u.includes(i))return e.stderr.write(`error: ${i} is not an available provider (available: ${u.join(", ")})
|
|
2672
2688
|
`),2;let d=e.dal===void 0,f=e.dal??he({path:le()});try{f.setConfig(`workspace.${l}`,i)}finally{d&&f.close()}let m=Kn()??Ir.default;return e.stdout.write(`workspace.${l} = ${i} (workspace: ${m})
|
|
2673
|
-
`),0}var
|
|
2689
|
+
`),0}var nJ,Jn,dJ,fJ,Rk=b(()=>{"use strict";Be();bk();ge();Ve();nJ=`usage: lmctl workspace list [--json]
|
|
2674
2690
|
lmctl workspace create <name> [--docroot PATH] [--json]
|
|
2675
2691
|
lmctl workspace use <name> [--json]
|
|
2676
2692
|
lmctl workspace show <name> [--json]
|
|
@@ -2682,18 +2698,18 @@ remote https:// workflow after a trust prompt.
|
|
|
2682
2698
|
Manage isolated workspace state directories, active workspace selection,
|
|
2683
2699
|
legacy profile migration, and configured provider slots.
|
|
2684
2700
|
delete requires --confirm; deleting default or active workspaces also requires --force.
|
|
2685
|
-
`;Jn=["claude","codex","gemini","qwen"],
|
|
2686
|
-
`),0}function
|
|
2701
|
+
`;Jn=["claude","codex","gemini","qwen"],dJ={provider1:"claude",provider2:"codex",provider3:"gemini"},fJ={provider1:"primary implementer",provider2:"independent reviewer",provider3:"auxiliary / tie-break"}});var Ok={};se(Ok,{runProject:()=>gJ});import{existsSync as pJ,statSync as _J}from"node:fs";import{join as $k}from"node:path";async function gJ(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(hJ),0;try{return await R(e,s=>{switch(r){case"create":return IJ(n,e,s);case"list":return NJ(n,e,s);case"show":return vJ(n,e,s);case"status":return kJ(n,e,s);case"workflow":return yJ(n,e,s);default:return y(e,"usage: lmctl project <create|list|show|status|workflow>")}})}catch(s){return _e(e,s)}}function yJ(t,e,r){let[n,...s]=t;switch(n){case"add":return wJ(s,e,r);case"list":return EJ(s,e,r);case"show":return TJ(s,e,r);case"remove":return bJ(s,e,r);case"enable":return Lk(s,e,r,!0);case"disable":return Lk(s,e,r,!1);default:return y(e,"usage: lmctl project workflow <add|list|show|remove|enable|disable>")}}function wJ(t,e,r){let n=P(t,["--condition","--params","--priority"]);if(n.error!==void 0)return y(e,n.error);let[s,o]=n.positionals;if(s===void 0||o===void 0||n.positionals.length!==2)return y(e,"usage: project workflow add <project> <workflow> [--condition JEXL] [--params JSON] [--priority N]");let i=r.findProjectByName(s);if(i===null)return y(e,`project not found: ${s}`);let a=r.getWorkflowByName(o);if(a===null)return y(e,`workflow not found: ${o}`);let l=L(n,"--condition")??null;if(l!==null)try{hr(l)}catch{return y(e,"invalid --condition JEXL")}let c=SJ(L(n,"--params"));if(typeof c=="string")return y(e,c);let u=L(n,"--priority"),d=u===void 0?100:Number(u);if(!Number.isInteger(d))return y(e,`invalid --priority: ${u??""}`);let f=r.insertProjectWorkflow({project_id:i.id,workflow_id:a.id,condition:l,parameters_override:c?.json??null,priority:d});return C(n,"--json")?F(e,f):e.stdout.write(`added project workflow ${f.id}
|
|
2702
|
+
`),0}function EJ(t,e,r){let n=P(t,[]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0||n.positionals.length!==1)return y(e,"usage: project workflow list <project>");let o=r.findProjectByName(s);if(o===null)return y(e,`project not found: ${s}`);let i=r.listProjectWorkflows(o.id);return C(n,"--json")?F(e,i):e.stdout.write(`${i.map(a=>`${a.id} ${a.workflow_id} ${a.priority} ${a.enabled} ${a.condition??""}`).join(`
|
|
2687
2703
|
`)}${i.length>0?`
|
|
2688
|
-
`:""}`),0}function
|
|
2689
|
-
`),0)}function
|
|
2690
|
-
`),0):y(e,`project workflow not found: ${s}`)}function Lk(t,e,r,n){let s=P(t,[]);if(s.error!==void 0)return y(e,s.error);let o=$m(s.positionals[0]),i=n?"enable":"disable";if(typeof o=="string"||s.positionals.length!==1)return y(e,`usage: project workflow ${i} <id>`);let a=r.setProjectWorkflowEnabled(o,n);return a===null?y(e,`project workflow not found: ${o}`):(
|
|
2691
|
-
`),0)}function
|
|
2692
|
-
`),0}function
|
|
2693
|
-
`),0}function
|
|
2694
|
-
`),0}function
|
|
2704
|
+
`:""}`),0}function TJ(t,e,r){let n=P(t,[]);if(n.error!==void 0)return y(e,n.error);let s=$m(n.positionals[0]);if(typeof s=="string"||n.positionals.length!==1)return y(e,"usage: project workflow show <id>");let o=r.getProjectWorkflow(s);return o===null?y(e,`project workflow not found: ${s}`):(C(n,"--json")?F(e,o):e.stdout.write(`${JSON.stringify(o,null,2)}
|
|
2705
|
+
`),0)}function bJ(t,e,r){let n=P(t,[]);if(n.error!==void 0)return y(e,n.error);let s=$m(n.positionals[0]);return typeof s=="string"||n.positionals.length!==1?y(e,"usage: project workflow remove <id>"):r.removeProjectWorkflow(s)?(e.stdout.write(`removed project workflow ${s}
|
|
2706
|
+
`),0):y(e,`project workflow not found: ${s}`)}function Lk(t,e,r,n){let s=P(t,[]);if(s.error!==void 0)return y(e,s.error);let o=$m(s.positionals[0]),i=n?"enable":"disable";if(typeof o=="string"||s.positionals.length!==1)return y(e,`usage: project workflow ${i} <id>`);let a=r.setProjectWorkflowEnabled(o,n);return a===null?y(e,`project workflow not found: ${o}`):(C(s,"--json")?F(e,a):e.stdout.write(`${n?"enabled":"disabled"} project workflow ${o}
|
|
2707
|
+
`),0)}function SJ(t){if(t===void 0)return null;try{let e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)?{json:JSON.stringify(e)}:"--params must be a JSON object"}catch{return"--params must be valid JSON"}}function $m(t){return t===void 0||!/^\d+$/.test(t)||Number(t)<=0?"invalid id":Number(t)}function vJ(t,e,r){let n=P(t,[]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: project show <name>");let o=r.findProjectByName(s);if(o===null)return y(e,`project not found: ${s}`);let i=o.name.indexOf("/"),a=i>0?o.name.slice(0,i):null,l=i>0?o.name.slice(i+1):o.name,c={...o,owner:a,repo:l};return C(n,"--json")?F(e,c):e.stdout.write(`${JSON.stringify(c,null,2)}
|
|
2708
|
+
`),0}function kJ(t,e,r){let n=P(t,[]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: project status <name>");let o=r.findProjectByName(s);if(o===null)return y(e,`project not found: ${s}`);let i={project:o.name,workflow_name:o.workflow_name};return C(n,"--json")?F(e,i):e.stdout.write(`${JSON.stringify(i,null,2)}
|
|
2709
|
+
`),0}function IJ(t,e,r){let n=P(t,["--local-path","--workflow","--team","--default-branch","--owner","--repo","--test-argv","--durable-memory-mode"]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals,o=L(n,"--owner"),i=L(n,"--repo"),a=o!==void 0&&i!==void 0?`${o}/${i}`:s;if(a===void 0)return y(e,`usage: project create <name> --local-path P --workflow W --team T [--default-branch B] [--test-argv '["go","test","./..."]'] OR project create --owner OWNER --repo REPO ...`);let l=r.getConfig("project.docroot"),c=a.indexOf("/"),u=c>0?a.slice(c+1):a,d=L(n,"--local-path")??(l!==null?$k(l,u):void 0),f=L(n,"--workflow"),m=L(n,"--team");if(d===void 0||f===void 0||m===void 0)return y(e,"project create requires --local-path (or `api config set project.docroot`), --workflow, and --team");if(r.getWorkflowByName(f)===null)return y(e,`workflow not found: ${f}`);let p=r.findTeamByName(m);if(p===null)return y(e,`team not found: ${m}`);let _=L(n,"--test-argv"),g=null;if(_!==void 0)try{let E=JSON.parse(_);if(!Array.isArray(E)||!E.every(k=>typeof k=="string")||E.length===0)return y(e,`--test-argv must be a non-empty JSON array of strings (e.g. '["go","test","./..."]')`);g=JSON.stringify(E)}catch{return y(e,"--test-argv must be valid JSON")}let h=L(n,"--durable-memory-mode");if(h!==void 0&&h!=="folder"&&h!=="db")return y(e,'--durable-memory-mode must be "folder" or "db"');let T=h!==void 0?h:AJ(d)||Ns(d)?"folder":"db",w=r.insertProject({name:a,local_path:d,workflow_name:f,team_id:p.id,default_branch:L(n,"--default-branch")??null,test_argv:g,durable_memory_mode:T});return C(n,"--json")?F(e,w):e.stdout.write(`created project ${w.name}
|
|
2710
|
+
`),0}function NJ(t,e,r){let n=P(t,[]);if(n.error!==void 0)return y(e,n.error);let s=r.listProjects();return C(n,"--json")?F(e,s):e.stdout.write(`${s.map(o=>`${o.id} ${o.name} ${o.workflow_name}`).join(`
|
|
2695
2711
|
`)}${s.length>0?`
|
|
2696
|
-
`:""}`),0}function
|
|
2712
|
+
`:""}`),0}function AJ(t){try{let e=$k(t,"durable-memory");return pJ(e)&&_J(e).isDirectory()}catch{return!1}}var hJ,jk=b(()=>{"use strict";ge();kn();As();hJ=`usage: lmctl project create <name> [--local-path P] --workflow W --team T [--default-branch B] [--test-argv JSON] [--durable-memory-mode folder|db] [--json]
|
|
2697
2713
|
lmctl project create --owner OWNER --repo REPO --workflow W --team T [--local-path P] [--default-branch B] [--test-argv JSON] [--durable-memory-mode folder|db] [--json]
|
|
2698
2714
|
lmctl project list [--json]
|
|
2699
2715
|
lmctl project show <name> [--json]
|
|
@@ -2708,7 +2724,7 @@ delete requires --confirm; deleting default or active workspaces also requires -
|
|
|
2708
2724
|
Create, list, inspect, and check projects. The workflow subcommand manages
|
|
2709
2725
|
per-project workflow bindings and routing conditions.
|
|
2710
2726
|
If project create omits --local-path, project.docroot must be configured.
|
|
2711
|
-
`});import{createHash as xJ,randomBytes as
|
|
2727
|
+
`});import{createHash as xJ,randomBytes as RJ}from"node:crypto";import{readFile as LJ}from"node:fs/promises";function Ck(t=new Date,e=RJ(4)){let r=t.getUTCFullYear().toString().padStart(4,"0"),n=(t.getUTCMonth()+1).toString().padStart(2,"0"),s=t.getUTCDate().toString().padStart(2,"0"),o=t.getUTCHours().toString().padStart(2,"0"),i=t.getUTCMinutes().toString().padStart(2,"0"),a=t.getUTCSeconds().toString().padStart(2,"0"),l=e.toString("hex").slice(0,8).padEnd(8,"0");return`dxx-${r}${n}${s}-${o}${i}${a}-${l}`}function $J(t){return xJ("sha256").update(t).digest("hex")}async function Mk(t){return(await Promise.all(t.map(async({bundlePath:r,absPath:n})=>{let s=await LJ(n);return{path:r,sha256:$J(s),size:s.byteLength}}))).sort((r,n)=>r.path<n.path?-1:r.path>n.path?1:0)}function Dk(t){return{ticket_id:t.ticketId,lmctl_next_version:t.lmctlNextVersion,node_version:t.nodeVersion,platform:t.platform,generated_at:t.generatedAt.toISOString(),sanitized:t.sanitized,files:t.files}}var Om=b(()=>{"use strict"});import{spawnSync as Pk}from"node:child_process";import{mkdir as jm,writeFile as Fk,readFile as OJ,rm as Uk}from"node:fs/promises";import{tmpdir as jJ}from"node:os";import{dirname as Wk,join as Cm}from"node:path";async function Bk(t){let e=t.stagingDir??Cm(jJ(),`lmctl-diag-${t.ticketId}`),r=Cm(e,`diagnostic-${t.ticketId}`);await jm(r,{recursive:!0});let n=[],s=async(d,f)=>{let m=Cm(r,d);if(await jm(Wk(m),{recursive:!0}),typeof f=="string")await Fk(m,f);else{let p=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);await Fk(m,new Uint8Array(p))}n.push({bundlePath:d,absPath:m})},o=d=>`${JSON.stringify(d,null,2)}
|
|
2712
2728
|
`;if(t.data.serve!==void 0){let d=t.data.serve,f=d.pid===null?`no daemon (source=${d.pid_source})
|
|
2713
2729
|
`:`${d.pid}
|
|
2714
2730
|
# source=${d.pid_source} alive=${String(d.pid_alive)}
|
|
@@ -2726,31 +2742,31 @@ If project create omits --local-path, project.docroot must be configured.
|
|
|
2726
2742
|
`:`# source=${f}
|
|
2727
2743
|
# tail_lines=${d.tail_lines}
|
|
2728
2744
|
`;await s("intents/recent.log",`${m}${d.tail}${d.tail.length>0?`
|
|
2729
|
-
`:""}`)}if(await s("README.md",
|
|
2730
|
-
`)}var qk=b(()=>{"use strict";Om();wo()});import{spawnSync as
|
|
2745
|
+
`:""}`)}if(await s("README.md",CJ(t)),t.sanitized)for(let d of n){let f=await OJ(d.absPath);try{zm(d.bundlePath,f.toString("utf8"))}catch(m){throw await Uk(e,{recursive:!0,force:!0}),m instanceof Nr,m}}let i=await Mk(n),a=Dk({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 jm(Wk(t.outputPath),{recursive:!0});let l=Pk("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=Pk("stat",["-c","%s",t.outputPath],{encoding:"utf8"}),u=Number.parseInt((c.stdout??"0").trim(),10)||0;return await Uk(e,{recursive:!0,force:!0}),{outputPath:t.outputPath,manifest:a,bundleSizeBytes:u}}function CJ(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(`
|
|
2746
|
+
`)}var qk=b(()=>{"use strict";Om();wo()});import{spawnSync as MJ}from"node:child_process";import{stat as DJ}from"node:fs/promises";async function Hk(t){try{if(!(await DJ(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 PJ(t);case"hq":return FJ(t)}}function PJ(t){let r=MJ("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 FJ(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 Jk=b(()=>{"use strict"});var Gk={};se(Gk,{parseDiagnoseArgs:()=>Xk,runDiagnose:()=>BJ});import{tmpdir as UJ}from"node:os";import{join as WJ}from"node:path";async function BJ(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${JJ()}
|
|
2731
2747
|
`),0;let r=Xk(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
2732
2748
|
`),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)
|
|
2733
2749
|
`),2;if(r.upload&&r.internalS3)return e.stderr.write(`error: pick one of --upload (HQ) or --internal-s3, not both
|
|
2734
|
-
`),2;let n=Ck(),s=r.outputPath??
|
|
2750
|
+
`),2;let n=Ck(),s=r.outputPath??HJ(n),o=r.internalS3?"internal-s3":r.upload?"hq":"local";try{return await R(e,async i=>{let a=await Qm({dal:i,include:r.include,dbPath:le(),intentLog:process.env.LMCTL_INTENT_LOG}),l;try{l=await Bk({ticketId:n,data:a,outputPath:s,lmctlNextVersion:Tt(),sanitized:!r.noSanitize})}catch(d){if(d instanceof Nr)return e.stderr.write(`sanitization failed: ${d.message}
|
|
2735
2751
|
`),2;throw d}let c=await Hk({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)}
|
|
2736
2752
|
`):(e.stdout.write(`ticket: ${n}
|
|
2737
2753
|
`),e.stdout.write(`bundle: ${l.outputPath} (${l.bundleSizeBytes} bytes, ${l.manifest.files.length} files)
|
|
2738
2754
|
`),e.stdout.write(`upload[${c.mode}]: ${c.ok?"ok":"noop"} \u2014 ${c.message}
|
|
2739
2755
|
`)),c.ok||o==="local"?0:1})}catch(i){return e.stderr.write(`diagnose failed: ${i instanceof Error?i.message:String(i)}
|
|
2740
|
-
`),1}}function Xk(t){let e={upload:!1,internalS3:!1,noSanitize:!1,json:!1},r=[];for(let n=0;n<t.length;n+=1){let s=t[n];if(s==="--output"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --output";e.outputPath=o;continue}if(s==="--upload"){e.upload=!0;continue}if(s==="--internal-s3"){e.internalS3=!0;continue}if(s==="--hq"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --hq";e.hqUrl=o,e.upload=!0;continue}if(s==="--include"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --include";if(!
|
|
2741
|
-
`)}var Kk=b(()=>{"use strict";zn();qk();Om();wo();Jk();Ve();ge()});var eI={};se(eI,{ATTENTION_STATES:()=>Pm,DAEMON_INTERVAL_FAST_MS:()=>Dm,REQUIRED_TEAM_ALIASES:()=>Vk,chooseDiagnoses:()=>Zk,collectEvidence:()=>zk,diagnose:()=>Yk,renderReport:()=>Qk,runDiagnosePrompt:()=>
|
|
2756
|
+
`),1}}function Xk(t){let e={upload:!1,internalS3:!1,noSanitize:!1,json:!1},r=[];for(let n=0;n<t.length;n+=1){let s=t[n];if(s==="--output"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --output";e.outputPath=o;continue}if(s==="--upload"){e.upload=!0;continue}if(s==="--internal-s3"){e.internalS3=!0;continue}if(s==="--hq"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --hq";e.hqUrl=o,e.upload=!0;continue}if(s==="--include"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --include";if(!qJ(o))return`unknown section: ${o} (expected one of ${Eo.join(", ")})`;r.push(o);continue}if(s==="--no-sanitize"){e.noSanitize=!0;continue}if(s==="--json"){e.json=!0;continue}if(!(s==="--help"||s==="-h"))return`unknown argument: ${s}`}return r.length>0&&(e.include=r),e}function qJ(t){return Eo.includes(t)}function HJ(t){return WJ(UJ(),`lmctl-diag-${t}.tar.gz`)}function JJ(){return["usage: lmctl diagnose [options]","","Collect platform diagnostics into a sanitized troubleshooting bundle,","with optional upload modes for support workflows.","","options:"," --output <path> write bundle to <path> (default /tmp/lmctl-diag-<ticket>.tar.gz)"," --upload upload to headquarter (HTTP, currently stub)"," --hq <url> override headquarter base URL (implies --upload)"," --internal-s3 upload to s3://lmctl/diagnostics/ (stub; checks aws CLI)"," --include <section> restrict to one of: serve|db|runs|jobs|attentions|env|intents (repeatable)"," --no-sanitize DANGER: skip secret redaction; incompatible with upload"," --json emit JSON summary to stdout"].join(`
|
|
2757
|
+
`)}var Kk=b(()=>{"use strict";zn();qk();Om();wo();Jk();Ve();ge()});var eI={};se(eI,{ATTENTION_STATES:()=>Pm,DAEMON_INTERVAL_FAST_MS:()=>Dm,REQUIRED_TEAM_ALIASES:()=>Vk,chooseDiagnoses:()=>Zk,collectEvidence:()=>zk,diagnose:()=>Yk,renderReport:()=>Qk,runDiagnosePrompt:()=>KJ});function Yk(t,e){let r=zk(t,e),n=Zk(r);return Qk(r,n)}function zk(t,e){let r=e.trim(),n={promptId:r,prompt:{exists:!1},dispatch:{sectionAvailable:!0,rowExists:!1},job:{sectionAvailable:!0,exists:!1},run:{sectionAvailable:!0,exists:!1},project:{sectionAvailable:!0,exists:!1},workflows:{sectionAvailable:!0,count:0,rows:[]},team:{sectionAvailable:!0,members:[],missingAliases:[]},daemon:{workerPid:null,intervalMs:zs(),lastTickAt:null}},s=null;try{s=t.getPromptDispatch(r)}catch{n.dispatch.sectionAvailable=!1}if(s!=null&&(n.dispatch.rowExists=!0,n.prompt.exists=!0,n.prompt.project_id=s.project_id,n.prompt.text_preview=GJ(s.text),n.prompt.created_at=s.created_at,n.prompt.completed_at=s.completed_at,n.prompt.job_id=s.job_id),n.prompt.job_id!==void 0)try{let o=t.getJob(n.prompt.job_id);if(o!==null&&(n.job.exists=!0,n.job.status=o.status,n.job.attempt_count=o.attempt_count,n.job.last_error=o.last_error,n.job.available_at=o.available_at,n.job.locked_by=o.locked_by,n.job.run_id=o.run_id,o.run_id!==null))try{let i=t.getRun(o.run_id);if(i!==null){n.run.exists=!0,n.run.id=i.id,n.run.current_state=i.current_state,n.run.terminal_state=i.terminal_state,n.run.started_at=i.started_at,n.run.ended_at=i.ended_at;let a="__paused__:";n.run.paused_step=i.current_state!==null&&i.current_state.startsWith(a)?i.current_state.slice(a.length):null,n.run.paused_at=i.paused_at}}catch{n.run.sectionAvailable=!1}}catch{n.job.sectionAvailable=!1}if(n.prompt.project_id!==void 0)try{let o=t.getProject(n.prompt.project_id);if(o!==null){n.project.exists=!0,n.project.id=o.id,n.project.name=o.name,n.project.local_path=o.local_path,n.project.test_command=o.test_command,n.project.workflow_name=o.workflow_name,n.project.team_id=o.team_id;try{n.project.workflow_name_resolves=t.getWorkflowByName(o.workflow_name)!==null}catch{n.project.workflow_name_resolves=!1}}}catch{n.project.sectionAvailable=!1}if(n.project.id!==void 0)try{let o=t.listProjectWorkflows(n.project.id);n.workflows.count=o.length;for(let i of o){let a=`workflow_id=${i.workflow_id}`,l=0,c=null;try{let d=t.listWorkflows().find(f=>f.id===i.workflow_id);d!==void 0&&(a=d.name,l=d.version,c=d.source_uri)}catch{}n.workflows.rows.push({workflow_name:a,version:l,enabled:i.enabled,source_uri:c})}}catch{n.workflows.sectionAvailable=!1}if(n.project.team_id!==void 0)try{n.team.teamId=n.project.team_id;let o=t.listTeamMembers(n.project.team_id);for(let a of o)n.team.members.push({alias:a.alias,provider:a.provider,sessionid:a.sessionid,sessiondir:a.sessiondir,state:a.state,state_reason:a.state_reason,state_updated_at:a.state_updated_at});let i=new Set(o.map(a=>a.alias));n.team.missingAliases=Vk.filter(a=>!i.has(a))}catch{n.team.sectionAvailable=!1}return n.daemon.workerPid=null,n.daemon.lastTickAt=null,n}function Zk(t){let e=[];if(t.dispatch.sectionAvailable&&!t.dispatch.rowExists)return e.push({cause:"Prompt wasn't enqueued (no prompt_dispatch row); SPA\u2192agent submitPrompt path broken",action:"Inspect mailbox-rest-router submitPrompt logs on the agent; confirm the SPA reached /mailbox/projects/:id/prompts"}),e;t.dispatch.rowExists&&t.job.exists&&(t.job.run_id===null||t.job.run_id===void 0)&&!t.run.exists&&e.push({cause:"Daemon poll didn't pick up the job (no run row); check daemon interval + worker pid",action:"Restart the agent serve process or lower LMCTL_DAEMON_INTERVAL_MS (current default 600000ms = 10min)"}),t.daemon.intervalMs>Dm&&e.push({cause:`Daemon poll interval is ${t.daemon.intervalMs}ms (${Math.round(t.daemon.intervalMs/1e3)}s); WT/dev expected <=${Dm}ms`,action:"Set LMCTL_DAEMON_INTERVAL_MS=5000 (or lower) in the agent's env before relaunching `lmctl-next-agent`"}),t.project.exists&&t.workflows.sectionAvailable&&t.workflows.count===0&&t.project.workflow_name_resolves!==!0&&e.push({cause:`Project ${t.project.name??`id=${t.project.id??"?"}`} has 0 workflows registered AND project.workflow_name does not resolve; engine can't dispatch`,action:"Run `lmctl workflow load <name>` then `lmctl project bind <project> <workflow>` (or check the v4-project bootstrap path)"}),t.team.sectionAvailable&&t.team.missingAliases.length>0&&e.push({cause:`Default team (team_id=${t.team.teamId??"?"}) missing required aliases: ${t.team.missingAliases.join(", ")} (TC2 DEFECT-E class \u2014 engine will stall with missing_agent:<alias>)`,action:"Run `lmctl team seed` against this project's team, or add the missing members via `lmctl team add-member`"});let r=t.team.sectionAvailable?t.team.members.filter(s=>Pm.has(s.state)):[];if(t.run.exists&&(t.run.paused_step??null)!==null||r.length>0){let s=t.run.paused_step??null,o=r.map(a=>a.alias).join(", "),i=s!==null&&o.length>0?`Run paused at ${s} awaiting operator escalation decision (member ${o} attention_needed)`:s!==null?`Run paused at ${s} awaiting operator escalation decision`:`Team member(s) ${o} awaiting operator attention`;e.push({cause:i,action:"Open the run in the SPA escalations panel (paused badge) or resolve via the operator-resume verb"})}return t.dispatch.rowExists&&t.job.exists&&!t.run.exists&&t.daemon.workerPid===null&&e.push({cause:"Worker pid not observable (agent serve process may not be actively daemoning)",action:"Verify `lmctl-next-agent` is running and check stderr for `[lmctl-next-agent]` lines"}),e.slice(0,3)}function Qk(t,e){let r=[];if(r.push(`DIAGNOSE ${t.promptId}`),r.push(""),r.push("[PROMPT]"),t.prompt.exists?(r.push(` id: ${t.promptId}`),r.push(` project_id: ${t.prompt.project_id??"?"}`),r.push(` text: ${t.prompt.text_preview??"?"}`),r.push(` created_at: ${t.prompt.created_at??"?"}`),r.push(` completed_at: ${t.prompt.completed_at??"null"}`)):r.push(" not present in prompt_dispatch table"),r.push(""),r.push("[PROMPT_DISPATCH]"),t.dispatch.sectionAvailable?(r.push(` row exists in prompt_dispatch table: ${t.dispatch.rowExists?"YES":"NO"}`),t.dispatch.rowExists&&(r.push(` job_id: ${t.prompt.job_id??"?"}`),r.push(` dispatched_at: ${t.prompt.created_at??"?"}`),r.push(` last_seen_status: ${XJ(t)}`))):r.push(" table not present (schema variation)"),r.push(""),r.push("[PROMPT_RUN]"),t.job.sectionAvailable?t.job.exists?t.run.exists?(r.push(" row exists in prompt_runs table: YES"),r.push(` run_id: ${t.run.id??"?"}`),r.push(` current_step: ${t.run.current_state??"null"}`),r.push(` status: ${t.run.terminal_state??"in_progress"}`),r.push(` started_at: ${t.run.started_at??"?"}`),r.push(` attempts: ${t.job.attempt_count??0}`)):(r.push(" row exists in prompt_runs table: NO"),r.push(` job_id: ${t.prompt.job_id??"?"} status=${t.job.status??"?"} attempts=${t.job.attempt_count??0}`),r.push(" -> job enqueued but no run; daemon poll did not consume it")):(r.push(" row exists in prompt_runs table: NO"),r.push(" -> worker never picked up the prompt (job row missing)")):r.push(" job table not accessible"),r.push(""),r.push("[PROJECT]"),t.project.sectionAvailable?t.project.exists?(r.push(` id: ${t.project.id??"?"}`),r.push(` name: ${t.project.name??"?"}`),r.push(` local_path: ${t.project.local_path??"?"}`),r.push(` test_command: ${t.project.test_command??"null"}`),r.push(` default_workflow: ${t.project.workflow_name??"null"}`)):t.prompt.project_id===void 0?r.push(" not resolvable (no project_id on prompt)"):r.push(` not present (id=${t.prompt.project_id})`):r.push(" project table not accessible"),r.push(""),r.push("[WORKFLOWS REGISTERED FOR PROJECT]"),!t.workflows.sectionAvailable)r.push(" project_workflow table not accessible");else if(t.workflows.count===0&&t.project.exists&&t.project.workflow_name_resolves===!0)r.push(` default_workflow_name: ${t.project.workflow_name??"?"} (resolved via project.workflow_name)`),r.push(" project_workflow rows: 0 (uses fallback resolution; expected)");else{r.push(` count: ${t.workflows.count}`);for(let o of t.workflows.rows)r.push(` - ${o.workflow_name} v${o.version} enabled=${o.enabled===1?"true":"false"} source=${o.source_uri??"null"}`)}if(r.push(""),r.push("[TEAM MEMBERS FOR PROJECT'S DEFAULT TEAM]"),!t.team.sectionAvailable)r.push(" team_member table not accessible");else if(t.team.teamId===void 0)r.push(" not resolvable (no team_id on project)");else{t.team.members.length===0&&r.push(" (no members)");for(let o of t.team.members)r.push(` - alias=${o.alias} provider=${o.provider} state=${o.state} sessionid=${o.sessionid??"null"} sessiondir=${o.sessiondir}`);t.team.missingAliases.length>0&&r.push(` ! missing aliases: ${t.team.missingAliases.join(", ")}`)}r.push("");let n=t.team.sectionAvailable?t.team.members.filter(o=>Pm.has(o.state)):[],s=t.run.exists?t.run.paused_step??null:null;if(s!==null||n.length>0){if(r.push("[ATTENTION/ESCALATION]"),s!==null){let o=t.run.paused_at??t.run.started_at??"?";r.push(` paused_step: ${s} (started: ${o})`)}if(n.length>0){let o=n.map(i=>`${i.alias} (state=${i.state}${i.state_updated_at?` since ${i.state_updated_at}`:""}${i.state_reason?`, reason="${i.state_reason}"`:""})`).join(", ");r.push(` members awaiting operator: ${o}`)}else r.push(" members awaiting operator: (none flagged on team)");r.push(" next action expected: operator response via /admin or webcli escalations verb"),r.push("")}if(r.push("[DAEMON STATE]"),r.push(` worker pid: ${t.daemon.workerPid===null?"not observable from CLI":String(t.daemon.workerPid)}`),r.push(` daemon poll interval (LMCTL_DAEMON_INTERVAL_MS env): ${t.daemon.intervalMs}`),r.push(` last daemon tick: ${t.daemon.lastTickAt??"not exposed"}`),r.push(""),r.push("[DIAGNOSIS]"),e.length===0)r.push(" no obvious root cause flagged by the v1 rules (see brief Part 4)");else for(let o of e)r.push(` - ${o.cause}`),r.push(` -> ${o.action}`);return r.join(`
|
|
2742
2758
|
`)+`
|
|
2743
|
-
`}function
|
|
2759
|
+
`}function XJ(t){return t.dispatch.rowExists?t.prompt.completed_at!==null&&t.prompt.completed_at!==void 0?"done":t.job.exists?t.run.exists?t.run.terminal_state!==null&&t.run.terminal_state!==void 0?`terminal:${t.run.terminal_state}`:`running:${t.run.current_state??"?"}`:"pending (no run)":"pending (no job)":"unknown"}function GJ(t){let e=t.replace(/\s+/g," ").trim();return e.length<=80?e:`${e.slice(0,80)}...`}async function KJ(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${Mm()}
|
|
2744
2760
|
`),0;let r=[];for(let s of t){if(s.startsWith("--"))return e.stderr.write(`error: unknown flag: ${s}
|
|
2745
2761
|
`),e.stderr.write(`${Mm()}
|
|
2746
2762
|
`),2;r.push(s)}if(r.length!==1)return e.stderr.write(`error: expected exactly one positional arg: <prompt_id>
|
|
2747
2763
|
`),e.stderr.write(`${Mm()}
|
|
2748
2764
|
`),2;let n=r[0];try{return await R(e,s=>(e.stdout.write(Yk(s,n)),0))}catch(s){return e.stderr.write(`diagnose-prompt failed: ${s instanceof Error?s.message:String(s)}
|
|
2749
2765
|
`),1}}function Mm(){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(`
|
|
2750
|
-
`)}var Vk,Dm,Pm,tI=b(()=>{"use strict";cf();ge();Vk=["Coder","Reviewer1","Polisher"],Dm=3e4,Pm=new Set(["attention_needed","paused","escalation"])});var oI={};se(oI,{appendIntent:()=>sI,resolveIntentLogPath:()=>nI,runStatus:()=>
|
|
2751
|
-
`)}catch{}}async function
|
|
2766
|
+
`)}var Vk,Dm,Pm,tI=b(()=>{"use strict";cf();ge();Vk=["Coder","Reviewer1","Polisher"],Dm=3e4,Pm=new Set(["attention_needed","paused","escalation"])});var oI={};se(oI,{appendIntent:()=>sI,resolveIntentLogPath:()=>nI,runStatus:()=>nX});import{appendFileSync as VJ,mkdirSync as YJ}from"node:fs";import{homedir as zJ}from"node:os";import{dirname as ZJ,join as QJ}from"node:path";function nI(){return process.env.LMCTL_INTENT_LOG??QJ(zJ(),".lmctl","recent-intents.log")}function sI(t){try{let e=nI();YJ(ZJ(e),{recursive:!0});let r=JSON.stringify({ts:t.ts??new Date().toISOString(),cwd:t.cwd??process.cwd(),verb:t.verb,args:[...t.args]});VJ(e,`${r}
|
|
2767
|
+
`)}catch{}}async function nX(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(rX),0;let r=P(t,["--project"],["--web","--json"]);if(r.error!==void 0)return y(e,r.error);if(r.positionals.length>0)return y(e,`unknown argument: ${r.positionals[0]}`);let n=C(r,"--web"),s=L(r,"--project"),o=C(r,"--json");return n&&s!==void 0?y(e,"--web and --project are mutually exclusive"):R(e,i=>{let a=sX(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.
|
|
2752
2768
|
`),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.
|
|
2753
|
-
`),1;if(a.kind==="project-not-found")return y(e,`project not found: ${a.name}`);let l=a.project,c=
|
|
2769
|
+
`),1;if(a.kind==="project-not-found")return y(e,`project not found: ${a.name}`);let l=a.project,c=oX(i,l,a.source);return o?F(e,c):e.stdout.write(uX(c)),sI({verb:"status",args:t}),0})}function sX(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=ym(e.cwd,t);return r===null?{kind:"no-cwd-match"}:{kind:"ok",project:r,source:"cwd"}}function oX(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=iX(t,e.id,tX),a=aX(t,e.id),l=lX(t,e.id,eX);return{project:{name:e.name,local_path:e.local_path,workflow_name:e.workflow_name,team_name:n?.name??null},active_run:o===null?null:{id:o.id,current_state:o.current_state,paused_at:o.paused_at,started_at:o.started_at},attentions:{unacked_count:a,recent:i.map(c=>({id:c.id,kind:c.kind,severity:c.severity,payload_summary:cX(c.payload),created_at:c.created_at}))},recent_runs:l.map(c=>({id:c.id,workflow_name:c.workflow_name,current_state:c.current_state,terminal_state:c.terminal_state,started_at:c.started_at,ended_at:c.ended_at})),context_source:r}}function iX(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 aX(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 lX(t,e,r){return t.db.prepare(`
|
|
2754
2770
|
SELECT r.*, w.name AS workflow_name
|
|
2755
2771
|
FROM run r
|
|
2756
2772
|
JOIN job j ON j.id = r.job_id
|
|
@@ -2758,13 +2774,13 @@ If project create omits --local-path, project.docroot must be configured.
|
|
|
2758
2774
|
WHERE j.project_id = ?
|
|
2759
2775
|
ORDER BY r.id DESC
|
|
2760
2776
|
LIMIT ?
|
|
2761
|
-
`).all(e,r)}function
|
|
2762
|
-
`)}var
|
|
2777
|
+
`).all(e,r)}function cX(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 rI(o,100)}}}catch{}return rI(t,100)}function rI(t,e){return t.length<=e?t:`${t.slice(0,e-1)}\u2026`}function uX(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(""),e.join(`
|
|
2778
|
+
`)}var eX,tX,rX,iI=b(()=>{"use strict";ge();Em();eX=5,tX=10,rX=`usage: lmctl status [--project NAME|--web] [--json]
|
|
2763
2779
|
|
|
2764
2780
|
Show the current project context, active run, unacked attentions, and recent
|
|
2765
2781
|
runs. Defaults to resolving the project from the current working directory;
|
|
2766
2782
|
--project selects a project by name, and --web uses the web UI focus.
|
|
2767
|
-
`});Ve();zn();ve();import{pathToFileURL as
|
|
2783
|
+
`});Ve();zn();ve();import{pathToFileURL as dX}from"node:url";Cl();zn();import{mkdirSync as QI,readFileSync as eN,renameSync as tN,writeFileSync as rN}from"node:fs";import{homedir as nN}from"node:os";import{dirname as sN,join as oN}from"node:path";var iN="https://registry.npmjs.org/@lmctl-ai/lmctl/latest",aN=60*60*1e3,lN=1500;function cN(){let t=process.env.HOME??nN();return oN(t,".lmctl",".update-check.json")}function uN(t){return t.isTTY===!0}function dN(t,e){let r=o=>{let i=/^(\d+)\.(\d+)\.(\d+)(?:$|[-+])/.exec(o.trim());if(i===null)return null;let a=i.slice(1).map(l=>Number(l));return a.some(l=>!Number.isSafeInteger(l)||l<0)?null:a},n=r(t),s=r(e);if(n===null||s===null)return 0;for(let o=0;o<3;o+=1){if(n[o]>s[o])return 1;if(n[o]<s[o])return-1}return 0}function Ml(t,e){return!!(process.env.LMCTL_NO_UPDATE_NOTIFIER==="1"||!uN(e.stderr)||t.includes("--json")||t.includes("--help")||t.includes("-h")||t[0]==="help"||t[0]==="mcp")}function fN(t,e){try{let r=JSON.parse(eN(t,"utf8"));if(typeof r.checkedAt=="number"&&Number.isFinite(r.checkedAt)&&typeof r.latest=="string"&&e-r.checkedAt<aN)return r.latest}catch{}return null}function mN(t,e){QI(sN(t),{recursive:!0});let r=`${t}.tmp-${process.pid}-${Math.random().toString(16).slice(2)}`;rN(r,`${JSON.stringify(e)}
|
|
2768
2784
|
`,"utf8"),tN(r,t)}async function pN(){let t=await So(iN,{description:"lmctl npm metadata",timeoutMs:lN}),e=JSON.parse(t.toString("utf8"));if(typeof e.version!="string"||e.version.trim()==="")throw new Error("registry response missing version");return e.version}async function lp(t,e=[],r={}){try{if(Ml(e,t))return;let n=r.now?.()??Date.now(),s=r.cachePath??cN();if(fN(s,n)!==null)return;let i=await(r.fetchLatest??pN)();try{mN(s,{checkedAt:n,latest:i})}catch{return}let a=r.currentVersion?.()??Tt();dN(i,a)>0&&t.stderr.write(`update available: ${a} \u2192 ${i} run: npm i -g @lmctl-ai/lmctl@latest
|
|
2769
2785
|
`)}catch{}}var Kr=`usage: lmctl [--db PATH] [--workspace NAME] [--debug] <command> [args]
|
|
2770
2786
|
`,Fm=`${Kr}
|
|
@@ -2827,14 +2843,14 @@ ${Kr}Run 'lmctl help' for usage.
|
|
|
2827
2843
|
${Kr}Run 'lmctl help' for usage.
|
|
2828
2844
|
`),1):(t.stderr.write(`error: unknown command: ${e}
|
|
2829
2845
|
${Kr}Run 'lmctl help' for usage.
|
|
2830
|
-
`),1)}async function
|
|
2831
|
-
`),0;if(n==="--help"||n==="-h"||n===void 0)return e.stdout.write(Fm),0;if(n==="help"){let[a,...l]=r.slice(1);return a===void 0||a==="--help"||a==="-h"?(e.stdout.write(Fm),0):aI.has(a)?lI(a,[...l,"--help"],e):cI(e,a)}Jm(le(),e.stderr),Gm(e.stderr);let[s,...o]=r;if(s===void 0)return e.stdout.write(Fm),0;let i=Date.now();Wm(s,o,{phase:"start",started_at:new Date(i).toISOString()});try{let a=await lI(s,o,e);return Wm(s,o,{phase:"finish",outcome:a===0?"ok":"error",exit_code:a,duration_ms:Date.now()-i}),aI.has(s)&&!Ml(r,e)&&await lp(e,r),a}catch(a){let l=a instanceof Error?a:new Error(String(a));return Wm(s,o,{phase:"fatal",outcome:"fatal",exit_code:1,duration_ms:Date.now()-i,error_class:l.name,error_message:l.message,error_stack:l.stack??null,causes:
|
|
2846
|
+
`),1)}async function fX(t,e={stdout:process.stdout,stderr:process.stderr}){let r=sp();try{return await mX(t,e)}finally{op(r)}}async function mX(t,e={stdout:process.stdout,stderr:process.stderr}){let r=[];for(let a=0;a<t.length;a+=1){let l=t[a];if(l==="--db"){let c=t[++a];if(c===void 0||c.startsWith("--"))return Um(e,"missing value for --db");process.env.LMCTL_DB=c;continue}if(l==="--workspace"){let c=t[++a];if(c===void 0||c.startsWith("--"))return Um(e,"missing value for --workspace");if(!Ke(c))return Um(e,`invalid workspace name: ${c}`);process.env.LMCTL_WORKSPACE=c;continue}if(l==="--debug"){np();continue}r.push(l)}let n=r[0];if(n==="--version"||n==="-v"||n==="-V")return e.stdout.write(`lmctl ${Tt()}
|
|
2847
|
+
`),0;if(n==="--help"||n==="-h"||n===void 0)return e.stdout.write(Fm),0;if(n==="help"){let[a,...l]=r.slice(1);return a===void 0||a==="--help"||a==="-h"?(e.stdout.write(Fm),0):aI.has(a)?lI(a,[...l,"--help"],e):cI(e,a)}Jm(le(),e.stderr),Gm(e.stderr);let[s,...o]=r;if(s===void 0)return e.stdout.write(Fm),0;let i=Date.now();Wm(s,o,{phase:"start",started_at:new Date(i).toISOString()});try{let a=await lI(s,o,e);return Wm(s,o,{phase:"finish",outcome:a===0?"ok":"error",exit_code:a,duration_ms:Date.now()-i}),aI.has(s)&&!Ml(r,e)&&await lp(e,r),a}catch(a){let l=a instanceof Error?a:new Error(String(a));return Wm(s,o,{phase:"fatal",outcome:"fatal",exit_code:1,duration_ms:Date.now()-i,error_class:l.name,error_message:l.message,error_stack:l.stack??null,causes:_X(l)}),pX(a,s,o,e)}}function Wm(t,e,r){Oe({event:t,record_kind:"cli_action",command:t,argv:e,cwd:process.cwd(),db_path:le(),workspace:process.env.LMCTL_WORKSPACE??null,lmctl_version:Tt(),node_version:process.version,...r})}function pX(t,e,r,n){let s=t instanceof Error?t:new Error(String(t));return n.stderr.write(`error: ${s.message}
|
|
2832
2848
|
`),ip()?(n.stderr.write(`(debug details written to ~/.lmctl/debug-*.log)
|
|
2833
2849
|
`),1):(n.stderr.write(`(re-run with --debug for the full stack trace and context in ~/.lmctl/debug-*.log)
|
|
2834
|
-
`),1)}function
|
|
2850
|
+
`),1)}function _X(t){let e=[],r=t.cause,n=0;for(;r!=null&&n<8;){let s=r instanceof Error?r:new Error(String(r));e.push({error_class:s.name,error_message:s.message,error_stack:s.stack??null}),r=s.cause,n+=1}return e}async function lI(t,e,r){switch(t){case"__deliver-lane":{let{runDeliveryWorker:n}=await Promise.resolve().then(()=>(mu(),fu));return n(e,r)}case"api":{let{runApi:n}=await Promise.resolve().then(()=>(xu(),Eg));return n(e,r)}case"code":{let{runCode:n}=await Promise.resolve().then(()=>(Vu(),uy));return n(e,r)}case"serve":{let{runServe:n}=await Promise.resolve().then(()=>(pS(),mS));return n(e,r)}case"intake":{let{runIntake:n}=await Promise.resolve().then(()=>(hS(),_S));return n(e,r)}case"chat":{let{runChat:n}=await Promise.resolve().then(()=>(DS(),MS));return n(e,r)}case"notify_me":{let{runNotifyMe:n}=await Promise.resolve().then(()=>(mu(),fu));return n(e,r)}case"exec":{let{runExec:n}=await Promise.resolve().then(()=>(US(),FS));return n(e,r)}case"recover":{let{runRecover:n}=await Promise.resolve().then(()=>(XS(),JS));return n(e,r)}case"mcp":{let{runMcp:n}=await Promise.resolve().then(()=>(QS(),ZS));return n(e,r)}case"monitor":{let{runMonitor:n}=await Promise.resolve().then(()=>(av(),iv));return n(e,r)}case"device":{let{runDevice:n}=await Promise.resolve().then(()=>(cv(),lv));return n(e,r)}case"team":{let{runTeam:n}=await Promise.resolve().then(()=>(fv(),dv));return n(e,r)}case"tail":{let{runTail:n}=await Promise.resolve().then(()=>(Ev(),wv));return n(e,r)}case"health":{let{runInfo:n}=await Promise.resolve().then(()=>(Av(),Nv));return n(e,r)}case"ls":{let{runLs:n}=await Promise.resolve().then(()=>(Lv(),Rv));return n(e,r)}case"lint":{let{runLint:n}=await Promise.resolve().then(()=>(po(),mo));return n(e,r)}case"seed":{let{runSeed:n}=await Promise.resolve().then(()=>(po(),mo));return n(e,r)}case"hire":{let{runHire:n}=await Promise.resolve().then(()=>(po(),mo));return n(e,r)}case"refresh":{let{runRefresh:n}=await Promise.resolve().then(()=>(po(),mo));return n(e,r)}case"clone":{let{runClone:n}=await Promise.resolve().then(()=>(Zv(),zv));return n(e,r)}case"plan":{let{runPlan:n}=await Promise.resolve().then(()=>(rk(),tk));return n(e,r)}case"terminal":{let{runTerminal:n}=await Promise.resolve().then(()=>(ik(),ok));return n(e,r)}case"workflow":{let{runWorkflow:n}=await Promise.resolve().then(()=>(Nm(),Im));return n(e,r)}case"run":{let{runWorkflow:n}=await Promise.resolve().then(()=>(Nm(),Im));return n(["run",...e],r)}case"workspace":{let{runWorkspace:n}=await Promise.resolve().then(()=>(Rk(),xk));return n(e,r)}case"project":{let{runProject:n}=await Promise.resolve().then(()=>(jk(),Ok));return n(e,r)}case"diagnose":{let{runDiagnose:n}=await Promise.resolve().then(()=>(Kk(),Gk));return n(e,r)}case"diagnose-prompt":{let{runDiagnosePrompt:n}=await Promise.resolve().then(()=>(tI(),eI));return n(e,r)}case"status":{let{runStatus:n}=await Promise.resolve().then(()=>(iI(),oI));return n(e,r)}case"db":return hX(e,r);default:return cI(r,t)}}function hX(t,e){let[r,...n]=t;return r==="--help"||r==="-h"||r==="help"?(e.stdout.write(`usage: lmctl db downgrade --to <version> --confirm
|
|
2835
2851
|
|
|
2836
2852
|
Database utilities. The downgrade command is currently a documented stub;
|
|
2837
2853
|
restore from backup for rollback and use normal migrations for forward changes.
|
|
2838
2854
|
`),0):r==="downgrade"?(e.stderr.write(`not yet implemented; restore from backup, or run lmctl migrate (forward-migrates ok)
|
|
2839
2855
|
`),1):(e.stderr.write(`usage: lmctl db downgrade --to <version> --confirm
|
|
2840
|
-
`),1)}if(process.argv[1]!==void 0&&import.meta.url===
|
|
2856
|
+
`),1)}if(process.argv[1]!==void 0&&import.meta.url===dX(process.argv[1]).href){let t=await fX(process.argv.slice(2));process.exitCode=t}export{fX as runCli};
|