@lmctl-ai/lmctl 0.1.58 → 0.1.59
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 +204 -200
- package/package.json +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
var ck=Object.defineProperty;var b=(t,e)=>()=>(t&&(e=t(t=0)),e);var le=(t,e)=>{for(var r in e)ck(t,r,{get:e[r],enumerable:!0})};import{existsSync as Br,readdirSync as uk,readFileSync as dk}from"node:fs";import{homedir as fk,platform as Df}from"node:os";import{join as Nt}from"node:path";function gr(){let t=process.env.LMCTL_HOME;return t!==void 0&&t.length>0?t:Nt(fk(),mk)}function On(){return Nt(gr(),Pf)}function
|
|
2
|
-
`)}function Qa(){return Nt(gr(),_k)}function Wf(){return Nt(gr(),gk)}function
|
|
3
|
-
`)}var mk,Pf,pk,hk,Ff,_k,gk,
|
|
1
|
+
var ck=Object.defineProperty;var b=(t,e)=>()=>(t&&(e=t(t=0)),e);var le=(t,e)=>{for(var r in e)ck(t,r,{get:e[r],enumerable:!0})};import{existsSync as Br,readdirSync as uk,readFileSync as dk}from"node:fs";import{homedir as fk,platform as Df}from"node:os";import{join as Nt}from"node:path";function gr(){let t=process.env.LMCTL_HOME;return t!==void 0&&t.length>0?t:Nt(fk(),mk)}function On(){return Nt(gr(),Pf)}function wr(){return Nt(gr(),pk)}function $t(t){return Nt(wr(),t)}function Jt(t){return Nt($t(t),Pf)}function za(){let t=[],e=new Set,r=o=>{Br(o.db_path)&&(e.has(o.db_path)||(e.add(o.db_path),t.push(o)))};r({workspace_name:null,db_path:On(),kind:"legacy"});let n=wr();if(!Br(n))return t;let s;try{s=uk(n)}catch{return t}for(let o of s.sort())He(o)&&r({workspace_name:o,db_path:Jt(o),kind:"workspace"});return t}function Za(t){return Nt($t(t),"projects")}function Xs(){return Nt(gr(),hk)}function He(t){return!(t.length===0||t.length>64||!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(t)||t==="."||t==="..")}function Gs(){let t=Xs();if(!Br(t))return null;try{let e=dk(t,"utf8").trim();return e.length===0||!He(e)?null:e}catch{return null}}function Ln(){let t=process.env.LMCTL_WORKSPACE;return t!==void 0&&t.length>0&&He(t)?t:Gs()}function ue(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=Ln();if(e!==null)return Jt(e);let r=On();return Br(r)||!Br(wr())?r:Jt(Ff)}function wk(t,e=Df()){return e!=="linux"?!1:t.startsWith("/mnt/c/")||t==="/mnt/c"}function Uf(t,e=process.stderr,r=Df()){wk(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 Qa(){return Nt(gr(),_k)}function Wf(){return Nt(gr(),gk)}function yk(){try{return Br(Qa())}catch{return!1}}function Bf(t=process.stderr){yk()&&t.write(`note: legacy ~/.lmctl/profiles/ detected \u2014 run 'lmctl workspace migrate' to move it to ~/.lmctl/workspaces/
|
|
3
|
+
`)}var mk,Pf,pk,hk,Ff,_k,gk,yr,Ye=b(()=>{"use strict";mk=".lmctl",Pf="state.db",pk="workspaces",hk="active-workspace",Ff="default",_k="profiles",gk="active-profile";yr={default:Ff}});function Sk(t){for(let e of Tk)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 kk(t){let e=t.toLowerCase();return!!(e==="::1"||e==="::"||e.startsWith("fe80:")||e.startsWith("fe80::"))}function Nk(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 Cn(t){let e=t;for(let{re:r,replacement:n}of bk)e=e.replace(r,n);return e=e.replace(vk,r=>!Nk(r)||Sk(r)?r:qf),e=e.replace(Ik,r=>kk(r)?r:qf),e}function Mn(t){return t.split(`
|
|
4
4
|
`).map(e=>Cn(e)).join(`
|
|
5
5
|
`)}function Jf(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:ot}:{key:t,value:Cn(e)}}function Xt(t){if(typeof t=="string")return Cn(t);if(Array.isArray(t))return t.map(e=>Xt(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"?ot:Xt(n):e[r]=Xt(n)}return e}return t}function Xf(t,e){for(let{name:r,re:n}of $k){let s=e.match(n);if(s!==null&&!s[0].includes(ot))throw new Er(t,r)}}var ot,Ek,qf,Hf,bk,Tk,vk,Ik,$k,Er,Ks=b(()=>{"use strict";ot="[REDACTED]",Ek="[REDACTED_EMAIL]",qf="[REDACTED_IP]",Hf="[USER]",bk=[{re:/(authorization\s*[:=]\s*)(bearer\s+[^\s,;"']+)/gi,replacement:`$1Bearer ${ot}`},{re:/(authorization\s*[:=]\s*)(basic\s+[^\s,;"']+)/gi,replacement:`$1Basic ${ot}`},{re:/\b(Bearer\s+)[A-Za-z0-9_\-./+=]{8,}/g,replacement:`$1${ot}`},{re:/\bsk-ant-[A-Za-z0-9_\-]{8,}/g,replacement:ot},{re:/\bsk-[A-Za-z0-9_\-]{16,}/g,replacement:ot},{re:/\bgh[pousr]_[A-Za-z0-9]{30,}/g,replacement:ot},{re:/\bAKIA[0-9A-Z]{16}\b/g,replacement:ot},{re:/\b(api[_-]?key|token|secret|password|passwd)(\s*[:=]\s*"?)([A-Za-z0-9_\-./+=]{8,})("?)/gi,replacement:`$1$2${ot}$4`},{re:/(\/home\/)[^/\s"'`]+/g,replacement:`$1${Hf}`},{re:/(\/Users\/)[^/\s"'`]+/g,replacement:`$1${Hf}`},{re:/\b[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}\b/g,replacement:Ek}],Tk=["127.","10.","192.168.","0.0.0.0"];vk=/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/g,Ik=/\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;$k=[{name:"sk-ant",re:/\bsk-ant-[A-Za-z0-9_\-]{8,}/},{name:"sk-openai",re:/\bsk-[A-Za-z0-9_\-]{16,}/},{name:"github-pat",re:/\bgh[pousr]_[A-Za-z0-9]{30,}/},{name:"aws-akid",re:/\bAKIA[0-9A-Z]{16}\b/},{name:"bearer",re:/\bBearer\s+[A-Za-z0-9_\-./+=]{8,}/},{name:"email",re:/\b[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}\b/},{name:"home-path",re:/\/home\/(?!\[USER\])[^/\s"'`]+/},{name:"users-path",re:/\/Users\/(?!\[USER\])[^/\s"'`]+/}],Er=class extends Error{bundlePath;patternName;constructor(e,r){super(`sanitization failed: ${r} pattern matched in ${e}`),this.bundlePath=e,this.patternName=r,this.name="SanitizationError"}}});import{spawnSync as el}from"node:child_process";import{readFileSync as xk}from"node:fs";import{readFile as rl,stat as Gf}from"node:fs/promises";import{homedir as jk}from"node:os";import{join as Ak}from"node:path";import{fileURLToPath as Rk}from"node:url";function it(){try{let t=new URL("../../package.json",import.meta.url),e=JSON.parse(xk(Rk(t),"utf8"));if(typeof e.version=="string")return e.version}catch{}return"0.0.0"}async function Kf(t){let e=new Set(t.include??Vs),r={};return e.has("serve")&&(r.serve=await Lk(t)),e.has("db")&&(r.db=Ck(t)),e.has("runs")&&(r.runs=Mk(t)),e.has("jobs")&&(r.jobs=Dk(t)),e.has("attentions")&&(r.attentions=Pk(t)),e.has("env")&&(r.env=await Fk(t)),e.has("intents")&&(r.intents=await Wk(t)),r}async function Lk(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 rl(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 rl(r,"utf8")).split(`
|
|
6
6
|
`),f=d.slice(Math.max(0,d.length-n));c=f.length,a=Mn(f.join(`
|
|
@@ -12,9 +12,9 @@ var ck=Object.defineProperty;var b=(t,e)=>()=>(t&&(e=t(t=0)),e);var le=(t,e)=>{f
|
|
|
12
12
|
FROM attention WHERE acknowledged_at IS NULL ORDER BY created_at DESC LIMIT 100`);return{unacked:Xt(r)}}async function Fk(t){let e=it(),r=process.version,n=el("uname",["-a"],{encoding:"utf8"}),s=Mn((n.stdout??"").trim()),o=[],i=t.dbPath??process.env.LMCTL_DB;if(i!==void 0)try{await Gf(i);let u=el("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 Gf(a);let u=el("du",["-sh",a],{encoding:"utf8"});u.status===0&&o.push(u.stdout.trim())}catch{}let l=o.length===0?"(no paths configured)":Mn(o.join(`
|
|
13
13
|
`)),c=[];for(let u of Ok){let d=process.env[u];if(d===void 0){c.push({key:u,value:"(unset)"});continue}c.push(Jf(u,d))}return{lmctl_next_version:e,node_version:r,os_info:s,disk_usage:l,env_keys_present:c}}function Uk(){return process.env.LMCTL_INTENT_LOG??Ak(jk(),".lmctl","recent-intents.log")}async function Wk(t){let e=t.intentLog??Uk(),r=t.intentLogTailLines??500;try{let s=(await rl(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:Mn(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 Vs,Ok,tl,Dn=b(()=>{"use strict";Ks();Vs=["serve","db","runs","jobs","attentions","env","intents"];Ok=["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"];tl=["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 zf,appendFileSync as Bk,mkdirSync as qk,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 Vs,Ok,tl,Dn=b(()=>{"use strict";Ks();Vs=["serve","db","runs","jobs","attentions","env","intents"];Ok=["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"];tl=["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 zf,appendFileSync as Bk,mkdirSync as qk,existsSync as eq,readdirSync as tq,unlinkSync as rq}from"node:fs";import{join as zs,dirname as Hk}from"node:path";import{homedir as Jk}from"node:os";function nl(){return zs(Jk(),".lmctl")}function Zf(){qr=!0,process.env.LMCTL_DEBUG="1"}function Qf(){return{cliDebug:qr,lmctlDebugEnv:process.env.LMCTL_DEBUG}}function em(t){qr=t.cliDebug,t.lmctlDebugEnv===void 0?delete process.env.LMCTL_DEBUG:process.env.LMCTL_DEBUG=t.lmctlDebugEnv}function we(){if(qr)return!0;let t=Date.now();return t-Yf>=Xk&&(Vf=Vk(),Yf=t),Vf}function sl(){return qr||process.env.LMCTL_DEBUG==="1"}function Gk(){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 xt(t,e){if(e?.verbose){if(!qr)return}else if(!e?.always&&!we())return;try{Kk();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};Bk(Ys,JSON.stringify(r)+`
|
|
16
16
|
`)}catch{}}function Kk(){if(!Ys){let e=Gk().slice(0,13).replace("T","-");Ys=zs(nl(),`debug-${e}.log`)}qk(Hk(Ys),{recursive:!0})}function Je(...t){xt({event:"legacy",msg:t.join(" ")})}function ht(...t){xt({event:"legacy",msg:t.join(" ")},{verbose:!0})}function Z(t){xt(t,{always:!0})}function Vk(){return Yk()||zk()}function Yk(){try{let t=zf(zs(nl(),"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 zk(){try{let t=zf(zs(nl(),"config.json"),"utf-8"),e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)&&e.debug===!0}catch{}return!1}var qr,Vf,Yf,Xk,Ys,Ne=b(()=>{"use strict";qr=!1,Vf=!1,Yf=0,Xk=5e3;Ys=null});function _t(t){try{return new URL(t).protocol==="https:"}catch{return!1}}function Gt(t){return/^[A-Za-z]:[\\/]/.test(t)?!1:/^[A-Za-z][A-Za-z0-9+.-]*:/.test(t)}function Pn(t,e){return!Gt(t)||_t(t)?null:`${e} must use https://: ${t}`}async function br(t,e){let r=Pn(t,e.description);if(r!==null||!_t(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 tm(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 tm(t,e.description,n,a)}}finally{clearTimeout(o)}}function tm(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 Zs=b(()=>{"use strict"});import{existsSync as pv}from"node:fs";import{createRequire as hv}from"node:module";function _v(){return il===null&&(il=hv(import.meta.url)("node:sqlite").DatabaseSync),il}function al(t){return t.length===1&&gv(t[0])?[t[0]]:t}function gv(t){if(!ul(t))return!1;let e=Object.getPrototypeOf(t);return e===Object.prototype||e===null}function ul(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var il,ll,Qs,cl,dl=b(()=>{"use strict";il=null;ll=class{name;handle;transactionDepth=0;savepointId=0;constructor(e,r={}){if(r.fileMustExist===!0&&e!==":memory:"&&!pv(e))throw new Error("unable to open database file");this.name=e,this.handle=new(_v())(e,{readOnly:r.readonly===!0}),this.exec("PRAGMA busy_timeout = 5000")}prepare(e){return new cl(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)}}},Qs=ll,cl=class{handle;rawMode=!1;constructor(e){this.handle=e,this.handle.setAllowBareNamedParameters(!0)}get(...e){let r=this.handle.get(...al(e));return this.normalizeRow(r)}all(...e){return this.handle.all(...al(e)).map(r=>this.normalizeRow(r))}run(...e){let r=this.handle.run(...al(e));return{changes:Number(r.changes),lastInsertRowid:Number(r.lastInsertRowid)}}raw(){return this.rawMode=!0,this}normalizeRow(e){return e==null?e:this.rawMode&&ul(e)?Object.values(e):ul(e)?{...e}:e}}});import{existsSync 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 zk(){try{let t=zf(zs(nl(),"config.json"),"utf-8"),e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)&&e.debug===!0}catch{}return!1}var qr,Vf,Yf,Xk,Ys,Ne=b(()=>{"use strict";qr=!1,Vf=!1,Yf=0,Xk=5e3;Ys=null});function _t(t){try{return new URL(t).protocol==="https:"}catch{return!1}}function Gt(t){return/^[A-Za-z]:[\\/]/.test(t)?!1:/^[A-Za-z][A-Za-z0-9+.-]*:/.test(t)}function Pn(t,e){return!Gt(t)||_t(t)?null:`${e} must use https://: ${t}`}async function br(t,e){let r=Pn(t,e.description);if(r!==null||!_t(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 tm(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 tm(t,e.description,n,a)}}finally{clearTimeout(o)}}function tm(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 Zs=b(()=>{"use strict"});import{existsSync as pv}from"node:fs";import{createRequire as hv}from"node:module";function _v(){return il===null&&(il=hv(import.meta.url)("node:sqlite").DatabaseSync),il}function al(t){return t.length===1&&gv(t[0])?[t[0]]:t}function gv(t){if(!ul(t))return!1;let e=Object.getPrototypeOf(t);return e===Object.prototype||e===null}function ul(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var il,ll,Qs,cl,dl=b(()=>{"use strict";il=null;ll=class{name;handle;transactionDepth=0;savepointId=0;constructor(e,r={}){if(r.fileMustExist===!0&&e!==":memory:"&&!pv(e))throw new Error("unable to open database file");this.name=e,this.handle=new(_v())(e,{readOnly:r.readonly===!0}),this.exec("PRAGMA busy_timeout = 5000")}prepare(e){return new cl(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)}}},Qs=ll,cl=class{handle;rawMode=!1;constructor(e){this.handle=e,this.handle.setAllowBareNamedParameters(!0)}get(...e){let r=this.handle.get(...al(e));return this.normalizeRow(r)}all(...e){return this.handle.all(...al(e)).map(r=>this.normalizeRow(r))}run(...e){let r=this.handle.run(...al(e));return{changes:Number(r.changes),lastInsertRowid:Number(r.lastInsertRowid)}}raw(){return this.rawMode=!0,this}normalizeRow(e){return e==null?e:this.rawMode&&ul(e)?Object.values(e):ul(e)?{...e}:e}}});import{existsSync as wv,mkdirSync as yv,readFileSync as Ev}from"node:fs";import{homedir as bv}from"node:os";import{dirname as nm,join as Tv,resolve as sm}from"node:path";import{fileURLToPath as Sv,pathToFileURL as kv}from"node:url";function ml(t){t.dbPath!==":memory:"&&yv(nm(t.dbPath),{recursive:!0});let e=new Qs(t.dbPath);e.pragma("journal_mode = WAL"),e.pragma("synchronous = NORMAL"),e.pragma("foreign_keys = ON");let r=im(e);return r===0&&(e.exec(Ev(vv,"utf8")),e.pragma(`user_version = ${fl}`)),Nv(e,r),e}function Nv(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,
|
|
@@ -490,7 +490,7 @@ var ck=Object.defineProperty;var b=(t,e)=>()=>(t&&(e=t(t=0)),e);var le=(t,e)=>{f
|
|
|
490
490
|
);
|
|
491
491
|
CREATE INDEX IF NOT EXISTS idx_delegation_event_job_id
|
|
492
492
|
ON delegation_event(delegation_job_id, id);
|
|
493
|
-
`),t.pragma("user_version = 40"),r=40),r<41&&r!==0){let n=ke(t,"delegation_job");n.has("permission_mode")||t.exec("ALTER TABLE delegation_job ADD COLUMN permission_mode TEXT;"),n.has("idle_timeout_ms")||t.exec("ALTER TABLE delegation_job ADD COLUMN idle_timeout_ms INTEGER;"),t.pragma("user_version = 41"),r=41}
|
|
493
|
+
`),t.pragma("user_version = 40"),r=40),r<41&&r!==0){let n=ke(t,"delegation_job");n.has("permission_mode")||t.exec("ALTER TABLE delegation_job ADD COLUMN permission_mode TEXT;"),n.has("idle_timeout_ms")||t.exec("ALTER TABLE delegation_job ADD COLUMN idle_timeout_ms INTEGER;"),t.pragma("user_version = 41"),r=41}wv(Iv)}function ke(t,e){let r=t.prepare(`PRAGMA table_info(${e})`).all();return new Set(r.map(n=>n.name))}function $v(t,e){return t.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?").get(e)!==void 0}function im(t){let e=t.pragma("user_version",{simple:!0});return typeof e=="number"?e:0}function xv(){return process.env.LMCTL_DB??Tv(bv(),".lmctl","state.db")}var om,vv,Iv,fl,pl=b(()=>{"use strict";dl();om=nm(Sv(import.meta.url)),vv=sm(om,"schema.sql"),Iv=sm(om,"migrations"),fl=41;if(process.argv[1]&&import.meta.url===kv(process.argv[1]).href){let t=ml({dbPath:process.argv[2]??xv()});try{process.stdout.write(`migrated user_version=${im(t)}
|
|
494
494
|
`)}finally{t.close()}}});function Hr(t){return typeof t=="string"&&jv.has(t)}function cm(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: ${eo[0]}`,` STANCE: ${eo[1]}`,` STANCE: ${eo[2]}`,` STANCE: ${am}: <one short sentence: why no declared outcome fits>`,"Never invent a different outcome; never leave the STANCE line out."].join(`
|
|
495
495
|
`)}var am,eo,jv,Fn,lm,hl,to,Un=b(()=>{"use strict";am="other",eo=["not_enough_information","dont_know","other_work"],jv=new Set([am,...eo]),Fn="@abort",lm="invalid_decision",hl="escalation_aborted",to="workflow_escalation"});import{randomUUID as Av}from"node:crypto";function $e(t){return t.provider_resolved??t.provider}function C(){return new Date().toISOString()}function pe(t){return new _l(ml({dbPath:t.path}))}function fm(t,e,r){let n=mm(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 mm(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 mm(t){let e=Rv(t),r=e===null?null:Ov(e,"states");if(r===null)return[];let n=[];for(let s of Object.values(r))gl(s)&&s.type==="Subflow"&&typeof s.workflow_name=="string"&&s.workflow_name.length>0&&n.push(s.workflow_name);return n}function Rv(t){try{let e=JSON.parse(t);return gl(e)?e:null}catch{return null}}function Ov(t,e){let r=t[e];return gl(r)?r:null}function gl(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Lv(t){return{insertWorkflow:t.prepare(`
|
|
496
496
|
INSERT INTO workflow (name, version, definition_schema_version, definition, created_at)
|
|
@@ -1037,9 +1037,9 @@ var ck=Object.defineProperty;var b=(t,e)=>()=>(t&&(e=t(t=0)),e);var le=(t,e)=>{f
|
|
|
1037
1037
|
AND id > ?
|
|
1038
1038
|
ORDER BY id ASC
|
|
1039
1039
|
`)}}function Cv(t,e){return t.status==="pending"?!0:t.status!=="running"?!1:t.locked_until!==null&&t.locked_until<e||t.worker_pid!==null&&!Mv(t.worker_pid)}function Mv(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 pm(t){if(Buffer.byteLength(t,"utf8")<=um)return t;let r=Buffer.byteLength(dm,"utf8"),n=Math.max(0,um-r),s=Buffer.from(t,"utf8"),o=n;for(;o>0&&(s[o]&192)===128;)o-=1;return`${s.subarray(0,o).toString("utf8")}${dm}`}function Dv(t,e){return e===void 0?{resumed:!1,reason:t}:{resumed:!1,reason:t,valid:e}}var um,dm,_l,Ue=b(()=>{"use strict";pl();Un();um=256*1024,dm=`
|
|
1040
|
-
...[truncated]`;_l=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;claimDelegationJobTxn;finalizeDelegationJobTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=Lv(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)=>Dv("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!==to)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!==Fn&&!a.includes(n))return{resumed:!1,reason:lm};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.claimDelegationJobTxn=e.transaction(r=>{let n=r.id===void 0?this.stmts.listClaimableDelegationJobCandidates.all():(()=>{let s=this.getDelegationJob(r.id);return s===null?[]:[s]})();for(let s of n){if(!Cv(s,r.now))continue;if(this.stmts.claimDelegationJob.run(r.worker_id,r.worker_pid,r.locked_until,r.now,s.id,s.status,s.locked_by,s.locked_by,s.worker_pid,s.worker_pid,s.locked_until,s.locked_until).changes===1)return this.getDelegationJob(s.id)}return null}),this.finalizeDelegationJobTxn=e.transaction((r,n,s,o)=>this.stmts.setDelegationJobTerminal.run(n,s.result_text??null,s.error??null,s.team_chat_log_id??null,o,r).changes!==1?null:(this.stmts.insertDelegationEvent.run(r,o,s.event_kind,pm(s.event_payload)),this.getDelegationJob(r)))}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){fm(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){fm(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=Av(),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.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)}enqueueDelegationJob(e){let r=this.stmts.insertDelegationJob.run(e.teamfile,e.alias,e.from_identity,e.root_teamfile,e.prompt,e.permission_mode??null,e.idle_timeout_ms??null,e.created_at??C());return this.getDelegationJob(Number(r.lastInsertRowid))}getDelegationJob(e){return this.stmts.getDelegationJob.get(e)??null}listDelegationJobs(e={}){let r=[],n=[];e.teamfile!==void 0&&(r.push("teamfile = ?"),n.push(e.teamfile)),e.from!==void 0&&(r.push("from_identity = ?"),n.push(e.from)),e.status!==void 0&&(r.push("status = ?"),n.push(e.status));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 delegation_job${o} ORDER BY created_at DESC, id DESC LIMIT ?`).all(...n)}claimDelegationJob(e){let r=C(),n=Math.max(0,Math.trunc(e.lease_ms)),s=new Date(Date.now()+n).toISOString();return this.claimDelegationJobTxn({id:e.id,worker_id:e.worker_id,worker_pid:e.worker_pid,locked_until:s,now:r})}setDelegationJobTerminal(e,r,n={}){return this.stmts.setDelegationJobTerminal.run(r,n.result_text??null,n.error??null,n.team_chat_log_id??null,C(),e).changes!==1?null:this.getDelegationJob(e)}finalizeDelegationJob(e,r,n){return this.finalizeDelegationJobTxn(e,r,n,C())}cancelDelegationJob(e){return this.stmts.cancelDelegationJob.run(C(),e),this.getDelegationJob(e)}insertDelegationEvent(e,r,n){let s=this.stmts.insertDelegationEvent.run(e,C(),r,pm(n));return this.stmts.getDelegationEvent.get(s.lastInsertRowid)}listDelegationEvents(e,r){return this.stmts.listDelegationEvents.all(e,r===void 0?0:Math.max(0,Math.trunc(r)))}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)}releaseAgentInflight(e){this.db.exec("BEGIN IMMEDIATE");try{let r=this.getAgentInflight(e.receiver_teamfile,e.receiver_alias);if(r===null||r.sender_teamfile!==e.sender_teamfile||r.sender_alias!==e.sender_alias)return this.db.exec("COMMIT"),!1;if(r.active_count<=1)return this.stmts.clearAgentInflightIfSender.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias),this.db.exec("COMMIT"),!0;let n=this.stmts.decrementAgentInflight.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias);return this.db.exec("COMMIT"),n.changes===1}catch(r){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),r}}clearAgentInflightOlderThan(e){return this.stmts.clearAgentInflightOlderThan.run(e).changes}getRun(e){return this.stmts.getRun.get(e)??null}setRunCurrentState(e,r){return this.stmts.setRunCurrentState.run(r,e),this.stmts.getRun.get(e)??null}setRunPausedState(e,r,n){return this.stmts.setRunPausedState.run(r,n,e),this.stmts.getRun.get(e)??null}setRunPendingEscalationDecision(e,r){return this.stmts.setRunPendingEscalationDecision.run(r,e),this.stmts.getRun.get(e)??null}setRunTerminalState(e,r){return this.stmts.setRunTerminalState.run(r,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())}}});import{realpathSync as Pv}from"node:fs";import{resolve as Fv}from"node:path";function yl(t){let e=Fv(t);try{return Pv(e)}catch{return e}}var hm=b(()=>{"use strict"});import{platform as _m}from"node:os";function gt(t){let e=new Wn;for(let r of t)e.registerAdapter(r);return e}var Wn,wl=b(()=>{"use strict";hm();Wn=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=yl(e.workspace);o=o.filter(a=>yl(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=_m()==="darwin"||_m()==="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 gm}from"node:fs";import{createInterface as ym}from"node:readline";import{stat as Uv}from"node:fs/promises";import{homedir as Wv}from"node:os";async function*We(t){let e=gm(t,{encoding:"utf-8"}),r=ym({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 Me(t,e){let r=[],n=gm(t,{encoding:"utf-8"}),s=ym({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 xe(t){let e=await Uv(t);return{createdAt:e.birthtime,modifiedAt:e.mtime}}function de(t){return t.replace(/\\n/g,`
|
|
1041
|
-
`).replace(/\\t/g," ").replace(/\\r/g,"\r")}function K(t,e){return t.length<=e?t:t.slice(0,e-3)+"..."}var ve,Kt=b(()=>{"use strict";ve=Wv()});import{readdir as ro,stat as wm,unlink as Bv}from"node:fs/promises";import{join as Jr,basename as Em}from"node:path";function qv(t){return t==="file-history-snapshot"||t==="progress"||t==="system"||t==="queue-operation"}function Hv(t){if(t.type==="system"){let e=t.message?.content;if(typeof e=="string"&&e.trim())return de(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 bm(t){let e=0,r=0,n=0,s=0,o=0,i=0,a;for await(let l of We(t))if(!l.isSidechain){if(l.type==="user"&&!l.isMeta&&l.message){let c=l.message.content;if(typeof c=="string"){if(c.includes("<command-name>")||c.includes("<local-command-"))continue;e++}}else if(l.type==="assistant"&&l.message){let c=l.message.content;if(Array.isArray(c))for(let d of c)d.type==="text"&&e++;let u=l.message.usage;if(u){let d=u.input_tokens||0,f=u.cache_creation_input_tokens||0,m=u.cache_read_input_tokens||0,p=u.output_tokens||0;r+=d+f+m,n+=m,s+=f,o+=p;let h=d+f+m;h&&(i=h),a={inputTokens:d,cacheWriteInputTokens:f,cachedInputTokens:m,outputTokens:p}}}}return{messageCount:e,totalInputTokens:r,totalCacheReadInputTokens:n,totalCacheWriteInputTokens:s,totalOutputTokens:o,lastInputTokens:i,lastTokenUsage:a}}var no,Tm=b(()=>{"use strict";Kt();no=class{name="claude";claudeDir;projectsDir;constructor(e={}){this.claudeDir=e.claudeDir||Jr(ve,".claude"),this.projectsDir=Jr(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await ro(this.projectsDir)}catch{return e}for(let n of r){let s=Jr(this.projectsDir,n);if(!(await wm(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await ro(s)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=Em(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=Jr(s,a);try{let u=await this.extractSummary(c,l);u&&e.push(u)}catch{}}}return e}async extractSummary(e,r){let n=await Me(e,50),s=await xe(e),o="",i,a,l,c,u,d;for(let m of n)if(!qv(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 bm(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 xe(r),s=[],o="",i,a,l,c,u,d,f,m=e;for await(let h of We(r))if(h.type!=="file-history-snapshot"&&!h.isSidechain){if(!o&&h.cwd&&(o=h.cwd),!i&&h.slug&&(i=h.slug),!a&&h.version&&(a=h.version),!c&&h.gitBranch&&(c=h.gitBranch),!f&&h.timestamp&&(f=new Date(h.timestamp)),h.sessionId&&(m=h.sessionId),h.type==="system"||h.type==="progress"||h.type==="queue-operation"){s.push({role:"system",timestamp:new Date(h.timestamp||0),content:Hv(h)});continue}if(h.type==="user"&&h.message){if(h.isMeta)continue;let g=new Date(h.timestamp||0),_=h.message.content;if(typeof _=="string"){if(_.includes("<command-name>")||_.includes("<local-command-"))continue;u||(u=K(_.trim(),80)),d=K(_.trim(),80),s.push({role:"user",timestamp:g,content:de(_.trim())})}else if(Array.isArray(_)){for(let S of _)if(S.type==="tool_result"){let E=typeof S.content=="string"?de(S.content):JSON.stringify(S.content);s.push({role:"tool_result",timestamp:g,content:E,toolCallId:S.tool_use_id})}}}if(h.type==="assistant"&&h.message){h.message.model&&(l=h.message.model);let g=new Date(h.timestamp||0),_=h.message.content;if(Array.isArray(_))for(let S of _)S.type==="text"&&S.text?s.push({role:"assistant",timestamp:g,content:de(S.text),model:h.message.model}):S.type==="tool_use"?s.push({role:"tool_use",timestamp:g,content:S.name||"unknown tool",toolName:S.name,toolInput:JSON.stringify(S.input,null,2),toolCallId:S.id,model:h.message.model}):S.type==="thinking"&&S.thinking&&s.push({role:"thinking",timestamp:g,content:S.thinking})}}if(!o)return null;let p=await bm(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 Bv(r),!0):!1}async resolveSessionFile(e){let r;try{r=await ro(this.projectsDir)}catch{return null}let n=[];for(let i of r){let a=Jr(this.projectsDir,i);if(!(await wm(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await ro(a)}catch{continue}for(let u of c){if(!u.endsWith(".jsonl"))continue;let d=Em(u,".jsonl");/^[0-9a-f]{8}-/.test(d)&&n.push({filePath:Jr(a,u),fileSessionId:d})}}let s=n.find(i=>i.fileSessionId===e);if(s)return s.filePath;let o=n.filter(i=>i.fileSessionId.startsWith(e));if(o.length===1)return o[0].filePath;for(let i of n){let a=await Me(i.filePath,20);for(let l of a)if(l.slug&&l.slug===e)return i.filePath}return null}}});function so(t){return"'"+t.replace(/'/g,"'\\''")+"'"}function Xv(t,e,r){if(!r)return"";let n=t.tools[e]??El[e],s=n?.profiles?.[r]?.flags??El[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 Sm(t,e){return!!t.tools[e]}function km(t,e,r,n,s){let o=t.tools[e]??El[e],i;if(o?.agent){let l=so(n);i=o.agent.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,l)}else{let l=Jv[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(so).join(" ");i=`printf '%s\\n' ${so(n)} | ${u}`}else i=c.map(so).join(" ")}let a=Xv(t,e,s);return a&&(i+=" "+a),i}var El,Jv,vm=b(()=>{"use strict";El={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:""}}}},Jv={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 Im(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 Nm=b(()=>{"use strict"});var Gv,je,oo,jt=b(()=>{"use strict";Gv="ACK: waiting for explicit lmctl task.",je=`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: ${Gv}`,oo=`send this exact lmctl seed instruction: "${je}"`});function ze(t,e){return e===void 0||e.length===0?t:{...t??process.env,[Bn]:e}}var Bn,At=b(()=>{"use strict";Bn="LMCTL_SELF_SESSIONID"});import{spawn as $m}from"node:child_process";import{mkdirSync as Kv}from"node:fs";var bl,Ce,Vt=b(()=>{"use strict";vm();Nm();jt();At();bl=class t extends Error{cancelReason;constructor(e,r){super(e),this.name="TurnAbortError",this.cancelReason=r,Object.setPrototypeOf(this,t.prototype)}},Ce=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===je?r:n)}seed(e,r){return Kv(e,{recursive:!0}),new Promise(n=>{let s;try{s=$m(this.binary,this.seedArgsFor(r),{cwd:e,stdio:["pipe","pipe","pipe"],timeout:6e4})}catch(a){return n({success:!1,error:a instanceof Error?a.message:String(a)})}let o="";s.stderr?.on("data",a=>{o+=a.toString()});let i=r?.prompt!==void 0&&this.seedStdin!==void 0?`${r.prompt}
|
|
1042
|
-
`: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:oo,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${e}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(e,r){if(r.userConfig&&Sm(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 bl("Turn cancelled","external"):p}),m=new Promise(p=>{l=p});return Promise.race([f,m])}runOneShotAgent(e,r,n){let s=km(r.userConfig,this.name,r.sessionId,e,r.profile),o=Date.now();return new Promise((i,a)=>{let l=Im(r.env),c=$m(s,{shell:!0,cwd:r.cwd,env:ze(r.env,r.sessionId),stdio:["pipe","pipe","pipe"]}),u=!1,d=!1,f=setTimeout(()=>{d=!0,c.kill()},l),m="",p="";if(c.stdout?.on("data",h=>{let g=h.toString();m+=g,r.onDelta?.(g)}),c.stderr?.on("data",h=>{p+=h.toString()}),r.signal){if(r.signal.aborted)return clearTimeout(f),c.kill(),a(new Error("Aborted"));r.signal.addEventListener("abort",()=>c.kill(),{once:!0})}c.on("exit",h=>{if(u)return;u=!0,clearTimeout(f);let g=Date.now()-o;d?a(new Error(`Agent command timed out after ${l}ms`)):h===0||h===null?i({text:m.trim(),sessionId:r.sessionId,durationMs:g}):a(new Error(p.trim().slice(0,200)||`Agent command exited with code ${h}`))}),c.on("error",h=>{u||(u=!0,clearTimeout(f),a(h))})})}}});function ao(t,e){let r;if(e&&typeof e=="object"){let n=e.code;typeof n=="number"&&(r=n)}return new Ot(t,r,e)}var Ze,Ee,Rt,io,Ot,Xr=b(()=>{"use strict";Ze=class extends Error{constructor(e,r){super(e,r),this.name=this.constructor.name}},Ee=class extends Ze{},Rt=class extends Ze{exitCode;signal;stderr;constructor(e,r,n=null,s){super(e),this.exitCode=r,this.signal=n,this.stderr=s}},io=class extends Ze{line;constructor(e,r,n){super(e,{cause:n}),this.line=r}},Ot=class extends Ze{rpcCode;rpcData;constructor(e,r,n){super(e),r!==void 0&&(this.rpcCode=r),n!==void 0&&(this.rpcData=n)}}});import*as Sl from"node:child_process";function Yv(t){if(typeof Sl.spawnSync=="function")try{Sl.spawnSync("taskkill",["/T","/F","/PID",String(t)],{windowsHide:!0})}catch{}}function xm(t){return t.exitCode!==null||t.signalCode!==null}function Tl(t,e){return xm(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 at(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??Yv;if(xm(t))return{signal:"natural",elapsedMs:Date.now()-r};if(n&&t.stdin&&!t.stdin.destroyed)try{t.stdin.end()}catch{}if(await Tl(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 Tl(t,o))return{signal:"SIGTERM",elapsedMs:Date.now()-r};if(i!=="win32")try{t.kill("SIGKILL")}catch{}return await Tl(t,Vv)?{signal:"SIGKILL",elapsedMs:Date.now()-r}:{signal:"abandoned",elapsedMs:Date.now()-r}}var Vv,lo=b(()=>{"use strict";Vv=1e3});function jm(t){
|
|
1040
|
+
...[truncated]`;_l=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;claimDelegationJobTxn;finalizeDelegationJobTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=Lv(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)=>Dv("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!==to)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!==Fn&&!a.includes(n))return{resumed:!1,reason:lm};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.claimDelegationJobTxn=e.transaction(r=>{let n=r.id===void 0?this.stmts.listClaimableDelegationJobCandidates.all():(()=>{let s=this.getDelegationJob(r.id);return s===null?[]:[s]})();for(let s of n){if(!Cv(s,r.now))continue;if(this.stmts.claimDelegationJob.run(r.worker_id,r.worker_pid,r.locked_until,r.now,s.id,s.status,s.locked_by,s.locked_by,s.worker_pid,s.worker_pid,s.locked_until,s.locked_until).changes===1)return this.getDelegationJob(s.id)}return null}),this.finalizeDelegationJobTxn=e.transaction((r,n,s,o)=>this.stmts.setDelegationJobTerminal.run(n,s.result_text??null,s.error??null,s.team_chat_log_id??null,o,r).changes!==1?null:(this.stmts.insertDelegationEvent.run(r,o,s.event_kind,pm(s.event_payload)),this.getDelegationJob(r)))}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){fm(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){fm(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=Av(),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.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)}enqueueDelegationJob(e){let r=this.stmts.insertDelegationJob.run(e.teamfile,e.alias,e.from_identity,e.root_teamfile,e.prompt,e.permission_mode??null,e.idle_timeout_ms??null,e.created_at??C());return this.getDelegationJob(Number(r.lastInsertRowid))}getDelegationJob(e){return this.stmts.getDelegationJob.get(e)??null}listDelegationJobs(e={}){let r=[],n=[];e.teamfile!==void 0&&(r.push("teamfile = ?"),n.push(e.teamfile)),e.from!==void 0&&(r.push("from_identity = ?"),n.push(e.from)),e.status!==void 0&&(r.push("status = ?"),n.push(e.status));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 delegation_job${o} ORDER BY created_at DESC, id DESC LIMIT ?`).all(...n)}claimDelegationJob(e){let r=C(),n=Math.max(0,Math.trunc(e.lease_ms)),s=new Date(Date.now()+n).toISOString();return this.claimDelegationJobTxn({id:e.id,worker_id:e.worker_id,worker_pid:e.worker_pid,locked_until:s,now:r})}setDelegationJobTerminal(e,r,n={}){return this.stmts.setDelegationJobTerminal.run(r,n.result_text??null,n.error??null,n.team_chat_log_id??null,C(),e).changes!==1?null:this.getDelegationJob(e)}finalizeDelegationJob(e,r,n){return this.finalizeDelegationJobTxn(e,r,n,C())}cancelDelegationJob(e){return this.stmts.cancelDelegationJob.run(C(),e),this.getDelegationJob(e)}insertDelegationEvent(e,r,n){let s=this.stmts.insertDelegationEvent.run(e,C(),r,pm(n));return this.stmts.getDelegationEvent.get(s.lastInsertRowid)}listDelegationEvents(e,r){return this.stmts.listDelegationEvents.all(e,r===void 0?0:Math.max(0,Math.trunc(r)))}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)}releaseAgentInflight(e){this.db.exec("BEGIN IMMEDIATE");try{let r=this.getAgentInflight(e.receiver_teamfile,e.receiver_alias);if(r===null||r.sender_teamfile!==e.sender_teamfile||r.sender_alias!==e.sender_alias)return this.db.exec("COMMIT"),!1;if(r.active_count<=1)return this.stmts.clearAgentInflightIfSender.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias),this.db.exec("COMMIT"),!0;let n=this.stmts.decrementAgentInflight.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias);return this.db.exec("COMMIT"),n.changes===1}catch(r){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),r}}clearAgentInflightOlderThan(e){return this.stmts.clearAgentInflightOlderThan.run(e).changes}getRun(e){return this.stmts.getRun.get(e)??null}setRunCurrentState(e,r){return this.stmts.setRunCurrentState.run(r,e),this.stmts.getRun.get(e)??null}setRunPausedState(e,r,n){return this.stmts.setRunPausedState.run(r,n,e),this.stmts.getRun.get(e)??null}setRunPendingEscalationDecision(e,r){return this.stmts.setRunPendingEscalationDecision.run(r,e),this.stmts.getRun.get(e)??null}setRunTerminalState(e,r){return this.stmts.setRunTerminalState.run(r,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())}}});import{realpathSync as Pv}from"node:fs";import{resolve as Fv}from"node:path";function wl(t){let e=Fv(t);try{return Pv(e)}catch{return e}}var hm=b(()=>{"use strict"});import{platform as _m}from"node:os";function gt(t){let e=new Wn;for(let r of t)e.registerAdapter(r);return e}var Wn,yl=b(()=>{"use strict";hm();Wn=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=wl(e.workspace);o=o.filter(a=>wl(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=_m()==="darwin"||_m()==="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 gm}from"node:fs";import{createInterface as wm}from"node:readline";import{stat as Uv}from"node:fs/promises";import{homedir as Wv}from"node:os";async function*We(t){let e=gm(t,{encoding:"utf-8"}),r=wm({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 Me(t,e){let r=[],n=gm(t,{encoding:"utf-8"}),s=wm({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 xe(t){let e=await Uv(t);return{createdAt:e.birthtime,modifiedAt:e.mtime}}function de(t){return t.replace(/\\n/g,`
|
|
1041
|
+
`).replace(/\\t/g," ").replace(/\\r/g,"\r")}function K(t,e){return t.length<=e?t:t.slice(0,e-3)+"..."}var ve,Kt=b(()=>{"use strict";ve=Wv()});import{readdir as ro,stat as ym,unlink as Bv}from"node:fs/promises";import{join as Jr,basename as Em}from"node:path";function qv(t){return t==="file-history-snapshot"||t==="progress"||t==="system"||t==="queue-operation"}function Hv(t){if(t.type==="system"){let e=t.message?.content;if(typeof e=="string"&&e.trim())return de(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 bm(t){let e=0,r=0,n=0,s=0,o=0,i=0,a;for await(let l of We(t))if(!l.isSidechain){if(l.type==="user"&&!l.isMeta&&l.message){let c=l.message.content;if(typeof c=="string"){if(c.includes("<command-name>")||c.includes("<local-command-"))continue;e++}}else if(l.type==="assistant"&&l.message){let c=l.message.content;if(Array.isArray(c))for(let d of c)d.type==="text"&&e++;let u=l.message.usage;if(u){let d=u.input_tokens||0,f=u.cache_creation_input_tokens||0,m=u.cache_read_input_tokens||0,p=u.output_tokens||0;r+=d+f+m,n+=m,s+=f,o+=p;let h=d+f+m;h&&(i=h),a={inputTokens:d,cacheWriteInputTokens:f,cachedInputTokens:m,outputTokens:p}}}}return{messageCount:e,totalInputTokens:r,totalCacheReadInputTokens:n,totalCacheWriteInputTokens:s,totalOutputTokens:o,lastInputTokens:i,lastTokenUsage:a}}var no,Tm=b(()=>{"use strict";Kt();no=class{name="claude";claudeDir;projectsDir;constructor(e={}){this.claudeDir=e.claudeDir||Jr(ve,".claude"),this.projectsDir=Jr(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await ro(this.projectsDir)}catch{return e}for(let n of r){let s=Jr(this.projectsDir,n);if(!(await ym(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await ro(s)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=Em(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=Jr(s,a);try{let u=await this.extractSummary(c,l);u&&e.push(u)}catch{}}}return e}async extractSummary(e,r){let n=await Me(e,50),s=await xe(e),o="",i,a,l,c,u,d;for(let m of n)if(!qv(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 bm(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 xe(r),s=[],o="",i,a,l,c,u,d,f,m=e;for await(let h of We(r))if(h.type!=="file-history-snapshot"&&!h.isSidechain){if(!o&&h.cwd&&(o=h.cwd),!i&&h.slug&&(i=h.slug),!a&&h.version&&(a=h.version),!c&&h.gitBranch&&(c=h.gitBranch),!f&&h.timestamp&&(f=new Date(h.timestamp)),h.sessionId&&(m=h.sessionId),h.type==="system"||h.type==="progress"||h.type==="queue-operation"){s.push({role:"system",timestamp:new Date(h.timestamp||0),content:Hv(h)});continue}if(h.type==="user"&&h.message){if(h.isMeta)continue;let g=new Date(h.timestamp||0),_=h.message.content;if(typeof _=="string"){if(_.includes("<command-name>")||_.includes("<local-command-"))continue;u||(u=K(_.trim(),80)),d=K(_.trim(),80),s.push({role:"user",timestamp:g,content:de(_.trim())})}else if(Array.isArray(_)){for(let S of _)if(S.type==="tool_result"){let E=typeof S.content=="string"?de(S.content):JSON.stringify(S.content);s.push({role:"tool_result",timestamp:g,content:E,toolCallId:S.tool_use_id})}}}if(h.type==="assistant"&&h.message){h.message.model&&(l=h.message.model);let g=new Date(h.timestamp||0),_=h.message.content;if(Array.isArray(_))for(let S of _)S.type==="text"&&S.text?s.push({role:"assistant",timestamp:g,content:de(S.text),model:h.message.model}):S.type==="tool_use"?s.push({role:"tool_use",timestamp:g,content:S.name||"unknown tool",toolName:S.name,toolInput:JSON.stringify(S.input,null,2),toolCallId:S.id,model:h.message.model}):S.type==="thinking"&&S.thinking&&s.push({role:"thinking",timestamp:g,content:S.thinking})}}if(!o)return null;let p=await bm(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 Bv(r),!0):!1}async resolveSessionFile(e){let r;try{r=await ro(this.projectsDir)}catch{return null}let n=[];for(let i of r){let a=Jr(this.projectsDir,i);if(!(await ym(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await ro(a)}catch{continue}for(let u of c){if(!u.endsWith(".jsonl"))continue;let d=Em(u,".jsonl");/^[0-9a-f]{8}-/.test(d)&&n.push({filePath:Jr(a,u),fileSessionId:d})}}let s=n.find(i=>i.fileSessionId===e);if(s)return s.filePath;let o=n.filter(i=>i.fileSessionId.startsWith(e));if(o.length===1)return o[0].filePath;for(let i of n){let a=await Me(i.filePath,20);for(let l of a)if(l.slug&&l.slug===e)return i.filePath}return null}}});function so(t){return"'"+t.replace(/'/g,"'\\''")+"'"}function Xv(t,e,r){if(!r)return"";let n=t.tools[e]??El[e],s=n?.profiles?.[r]?.flags??El[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 Sm(t,e){return!!t.tools[e]}function km(t,e,r,n,s){let o=t.tools[e]??El[e],i;if(o?.agent){let l=so(n);i=o.agent.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,l)}else{let l=Jv[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(so).join(" ");i=`printf '%s\\n' ${so(n)} | ${u}`}else i=c.map(so).join(" ")}let a=Xv(t,e,s);return a&&(i+=" "+a),i}var El,Jv,vm=b(()=>{"use strict";El={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:""}}}},Jv={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 Im(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 Nm=b(()=>{"use strict"});var Gv,je,oo,jt=b(()=>{"use strict";Gv="ACK: waiting for explicit lmctl task.",je=`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: ${Gv}`,oo=`send this exact lmctl seed instruction: "${je}"`});function ze(t,e){return e===void 0||e.length===0?t:{...t??process.env,[Bn]:e}}var Bn,At=b(()=>{"use strict";Bn="LMCTL_SELF_SESSIONID"});import{spawn as $m}from"node:child_process";import{mkdirSync as Kv}from"node:fs";var bl,Ce,Vt=b(()=>{"use strict";vm();Nm();jt();At();bl=class t extends Error{cancelReason;constructor(e,r){super(e),this.name="TurnAbortError",this.cancelReason=r,Object.setPrototypeOf(this,t.prototype)}},Ce=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===je?r:n)}seed(e,r){return Kv(e,{recursive:!0}),new Promise(n=>{let s;try{s=$m(this.binary,this.seedArgsFor(r),{cwd:e,stdio:["pipe","pipe","pipe"],timeout:6e4})}catch(a){return n({success:!1,error:a instanceof Error?a.message:String(a)})}let o="";s.stderr?.on("data",a=>{o+=a.toString()});let i=r?.prompt!==void 0&&this.seedStdin!==void 0?`${r.prompt}
|
|
1042
|
+
`: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:oo,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${e}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(e,r){if(r.userConfig&&Sm(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 bl("Turn cancelled","external"):p}),m=new Promise(p=>{l=p});return Promise.race([f,m])}runOneShotAgent(e,r,n){let s=km(r.userConfig,this.name,r.sessionId,e,r.profile),o=Date.now();return new Promise((i,a)=>{let l=Im(r.env),c=$m(s,{shell:!0,cwd:r.cwd,env:ze(r.env,r.sessionId),stdio:["pipe","pipe","pipe"]}),u=!1,d=!1,f=setTimeout(()=>{d=!0,c.kill()},l),m="",p="";if(c.stdout?.on("data",h=>{let g=h.toString();m+=g,r.onDelta?.(g)}),c.stderr?.on("data",h=>{p+=h.toString()}),r.signal){if(r.signal.aborted)return clearTimeout(f),c.kill(),a(new Error("Aborted"));r.signal.addEventListener("abort",()=>c.kill(),{once:!0})}c.on("exit",h=>{if(u)return;u=!0,clearTimeout(f);let g=Date.now()-o;d?a(new Error(`Agent command timed out after ${l}ms`)):h===0||h===null?i({text:m.trim(),sessionId:r.sessionId,durationMs:g}):a(new Error(p.trim().slice(0,200)||`Agent command exited with code ${h}`))}),c.on("error",h=>{u||(u=!0,clearTimeout(f),a(h))})})}}});function ao(t,e){let r;if(e&&typeof e=="object"){let n=e.code;typeof n=="number"&&(r=n)}return new Ot(t,r,e)}var Ze,Ee,Rt,io,Ot,Xr=b(()=>{"use strict";Ze=class extends Error{constructor(e,r){super(e,r),this.name=this.constructor.name}},Ee=class extends Ze{},Rt=class extends Ze{exitCode;signal;stderr;constructor(e,r,n=null,s){super(e),this.exitCode=r,this.signal=n,this.stderr=s}},io=class extends Ze{line;constructor(e,r,n){super(e,{cause:n}),this.line=r}},Ot=class extends Ze{rpcCode;rpcData;constructor(e,r,n){super(e),r!==void 0&&(this.rpcCode=r),n!==void 0&&(this.rpcData=n)}}});import*as Sl from"node:child_process";function Yv(t){if(typeof Sl.spawnSync=="function")try{Sl.spawnSync("taskkill",["/T","/F","/PID",String(t)],{windowsHide:!0})}catch{}}function xm(t){return t.exitCode!==null||t.signalCode!==null}function Tl(t,e){return xm(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 at(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??Yv;if(xm(t))return{signal:"natural",elapsedMs:Date.now()-r};if(n&&t.stdin&&!t.stdin.destroyed)try{t.stdin.end()}catch{}if(await Tl(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 Tl(t,o))return{signal:"SIGTERM",elapsedMs:Date.now()-r};if(i!=="win32")try{t.kill("SIGKILL")}catch{}return await Tl(t,Vv)?{signal:"SIGKILL",elapsedMs:Date.now()-r}:{signal:"abandoned",elapsedMs:Date.now()-r}}var Vv,lo=b(()=>{"use strict";Vv=1e3});function jm(t){we()&&process.stderr.write(`[debug] ${t}
|
|
1043
1043
|
`)}function Gr(t,e){let r=Zv[t];if(r)return r[e]??r.yolo}function e0(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 Yt(t,e,r="yolo"){if(Qv.has(t)){jm(`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"?Gr(t,"plan"):zv[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 Ee(s)}if(!e0(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 Ee(o)}jm(`YOLO ${t} [mode=${r}]: argv flag '${n.join(" ")}'`)}var zv,Zv,Qv,qn=b(()=>{"use strict";Xr();Ne();zv={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"]},Zv={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"]}};Qv=new Set(["codex","opencode"])});import{spawn as t0}from"node:child_process";import{existsSync as r0}from"node:fs";function s0(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(`
|
|
1044
1044
|
|
|
1045
1045
|
--- additional response (turn ${r+1} of ${t.length}; likely an injected mid-call notification) ---
|
|
@@ -1050,13 +1050,13 @@ ${e}
|
|
|
1050
1050
|
|
|
1051
1051
|
${r}`:r}function Am(t,e){return new Promise((r,n)=>{let s=e.tool||"claude",o=e.binaryPath||n0[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=Gr(s,a)??l0[s]??["--dangerously-skip-permissions"];i.push(...l);try{Yt(s,i,a)}catch(g){return n(g)}if(e.cwd&&!r0(e.cwd))return Z({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),n(new Ee(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=t0(o,i,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:ze(e.env,e.sessionId)}),u=!1;if(e.signal){if(e.signal.aborted)return u=!0,Z({event:"transport_abort",provider:s,phase:"pre_spawn"}),at(c).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{u=!0,Z({event:"transport_abort",provider:s}),at(c).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let d=o0({onEvent:e.onEvent,onText:e.onText}),f="";function m(g){let _=d.sawResult();d.processLine(g),!_&&d.sawResult()&&c.stdin?.end()}c.stdout?.on("data",g=>{f+=g.toString();let _=f.split(`
|
|
1052
1052
|
`);f=_.pop()||"";for(let S of _)m(S)});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 Ee(`Failed to spawn ${o}: ${g.message}`,{cause:g}))}),c.on("exit",g=>{if(u)return;f.trim()&&m(f);let _=d.finalize();_?(ht(`stream-json: result ${_.result.slice(0,80)}${_.result.length>80?"...":""} (${_.durationMs}ms)`),r({..._,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(a0({tool:s,exitCode:g,stderr:p}))))});let h=JSON.stringify({type:"user",message:{role:"user",content:t}});c.stdin?.write(h+`
|
|
1053
|
-
`),ht(`stream-json: prompt sent (${t.length} chars)`)})}var n0,l0,Rm=b(()=>{"use strict";Xr();lo();qn();Ne();At();n0={claude:"claude",qwen:"qwen"};l0={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"]}});import{accessSync as c0,constants as u0}from"node:fs";import{delimiter as d0,join as f0}from"node:path";function m0(t,e=process.env){let r=e.PATH??"";for(let n of r.split(d0))if(n)try{return c0(f0(n,t),u0.X_OK),!0}catch{}return!1}function p0(t,e){return` MCP warning: ${e} is configured to run \`${t} mcp\`, but \`${t}\` was not found on PATH. Provider MCP calls may fail until PATH is fixed.`}function Kr(t,e,r={}){if(m0(t,r.env))return;(r.warn??console.warn)(p0(t,e))}var co=b(()=>{"use strict"});function uo(t={}){return Kr("lmctl","lmctl_chat",t),["-c",'mcp_servers.lmctl.command="lmctl"',"-c",'mcp_servers.lmctl.args=["mcp"]',"-c",`mcp_servers.lmctl.tool_timeout_sec=${_0}`]}var h0,_0,kl=b(()=>{"use strict";co();h0=864e5,_0=h0/1e3});import{spawn as g0}from"node:child_process";import{createInterface as
|
|
1053
|
+
`),ht(`stream-json: prompt sent (${t.length} chars)`)})}var n0,l0,Rm=b(()=>{"use strict";Xr();lo();qn();Ne();At();n0={claude:"claude",qwen:"qwen"};l0={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"]}});import{accessSync as c0,constants as u0}from"node:fs";import{delimiter as d0,join as f0}from"node:path";function m0(t,e=process.env){let r=e.PATH??"";for(let n of r.split(d0))if(n)try{return c0(f0(n,t),u0.X_OK),!0}catch{}return!1}function p0(t,e){return` MCP warning: ${e} is configured to run \`${t} mcp\`, but \`${t}\` was not found on PATH. Provider MCP calls may fail until PATH is fixed.`}function Kr(t,e,r={}){if(m0(t,r.env))return;(r.warn??console.warn)(p0(t,e))}var co=b(()=>{"use strict"});function uo(t={}){return Kr("lmctl","lmctl_chat",t),["-c",'mcp_servers.lmctl.command="lmctl"',"-c",'mcp_servers.lmctl.args=["mcp"]',"-c",`mcp_servers.lmctl.tool_timeout_sec=${_0}`]}var h0,_0,kl=b(()=>{"use strict";co();h0=864e5,_0=h0/1e3});import{spawn as g0}from"node:child_process";import{createInterface as w0}from"node:readline";import{existsSync as y0,readFileSync as E0}from"node:fs";import{fileURLToPath as b0}from"node:url";function T0(t){return t==="plan"?"read-only":"danger-full-access"}function k0(){return{clientInfo:{name:"lmctl",title:"lmctl",version:S0},capabilities:{experimentalApi:!1}}}function zt(t,e){ht(`[codex:${t}] ${JSON.stringify(e)}`)}function v0(){return{agentItems:new Map,resultText:""}}function Om(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 I0(t){for(let[,e]of t.agentItems.entries())e.phase!=="commentary"&&e.buffer&&(t.resultText+=e.buffer);t.agentItems.clear()}function N0(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 $0(){return{pendingCodexError:null}}function x0(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: codex app-server exited with code ${t.exitCode} before completing the turn.
|
|
1054
1054
|
One possible cause: Codex stopped before delivering a terminal turn/completed event.`;return e?`Original provider error:
|
|
1055
1055
|
${e}
|
|
1056
1056
|
|
|
1057
|
-
${r}`:r}function j0(t,e){let r=N0(t);return r.willRetry||(e.pendingCodexError=r.turnError),r}function A0(t,e){if(e.pendingCodexError){let o=e.pendingCodexError;return e.pendingCodexError=null,{shouldReject:!0,turnError:o}}let n=t.params?.turn;if((typeof n?.status=="string"?n.status:void 0)==="failed"){let o=n?.error,i=typeof o?.message=="string"?o.message:void 0,a=i&&i.length>0?i:"(no message)";return{shouldReject:!0,turnError:new Error(`Turn errored: ${a}`)}}return{shouldReject:!1}}function Lm(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";i&&o.push(...uo()),
|
|
1057
|
+
${r}`:r}function j0(t,e){let r=N0(t);return r.willRetry||(e.pendingCodexError=r.turnError),r}function A0(t,e){if(e.pendingCodexError){let o=e.pendingCodexError;return e.pendingCodexError=null,{shouldReject:!0,turnError:o}}let n=t.params?.turn;if((typeof n?.status=="string"?n.status:void 0)==="failed"){let o=n?.error,i=typeof o?.message=="string"?o.message:void 0,a=i&&i.length>0?i:"(no message)";return{shouldReject:!0,turnError:new Error(`Turn errored: ${a}`)}}return{shouldReject:!1}}function Lm(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";i&&o.push(...uo()),we()&&Je(JSON.stringify({event:"codex_mcp_inject",alias:e.alias??null,isLead:i,injected:i}));let a=e.permissionMode??"yolo",l=T0(a);try{Yt("codex",o,a)}catch(U){return n(U)}if(e.cwd&&!y0(e.cwd))return Z({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`}),n(new Ee(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=g0(s,o,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:ze(e.env,e.threadId)}),u=!1;if(e.signal){if(e.signal.aborted)return u=!0,Z({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),at(c).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{u=!0,Z({event:"transport_abort",provider:"codex"}),at(c).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let d=w0({input:c.stdout}),f=new Map,m=1,p=e.threadId||"",h="",g=!1,_=!1,S=Date.now(),E=v0(),k=$0();function x(U,F={}){return new Promise((J,R)=>{let W=m++;f.set(W,{resolve:J,reject:R});let z=JSON.stringify({jsonrpc:"2.0",id:W,method:U,params:F});c.stdin?.write(z+`
|
|
1058
1058
|
`)})}function N(U,F={}){let J=JSON.stringify({jsonrpc:"2.0",method:U,params:F});c.stdin?.write(J+`
|
|
1059
|
-
`)}d.on("line",U=>{let F;try{F=JSON.parse(U)}catch{return}if(typeof F.id=="number"&&f.has(F.id)){let W=f.get(F.id);if(f.delete(F.id),F.error){let z=F.error,v=typeof z?.message=="string"&&z.message.length>0?z.message:JSON.stringify(F.error);W.reject(ao(`codex app-server error: ${v}`,z))}else W.resolve(F);e.onEvent?.(F);return}let J=F.method;if(!J){e.onEvent?.(F);return}if(J==="thread/started"){let z=F.params?.thread;z?.id&&(p=z.id)}let R=
|
|
1059
|
+
`)}d.on("line",U=>{let F;try{F=JSON.parse(U)}catch{return}if(typeof F.id=="number"&&f.has(F.id)){let W=f.get(F.id);if(f.delete(F.id),F.error){let z=F.error,v=typeof z?.message=="string"&&z.message.length>0?z.message:JSON.stringify(F.error);W.reject(ao(`codex app-server error: ${v}`,z))}else W.resolve(F);e.onEvent?.(F);return}let J=F.method;if(!J){e.onEvent?.(F);return}if(J==="thread/started"){let z=F.params?.thread;z?.id&&(p=z.id)}let R=we()?W=>{zt("item.text/buffer-mismatch",{itemId:W.itemId,threadId:W.threadId??null,turnId:W.turnId??null,expectedFromItemText:W.expectedFromItemText,gotFromBuffer:W.gotFromBuffer,expectedLen:W.expectedFromItemText.length,gotLen:W.gotFromBuffer.length})}:void 0;if(J==="turn/started"){let W=F.params,z=W?.turn;z?.id&&(h=z.id),Om(F,E,e.onDelta,R),we()&&zt("turn/started",{params:W??null})}if(we()&&(J==="item/started"||J==="item/completed")){let W=F.params;W?.item?.type==="agentMessage"&&zt(J,{params:W??null})}if(J==="item/started"||J==="item/agentMessage/delta"||J==="item/completed"){if(J==="item/agentMessage/delta"){let W=F.params;we()&&zt("agentMessage/delta",{params:W??null})}Om(F,E,e.onDelta,R)}if(J==="turn/completed"){let W=F.params;if(we())for(let[v,I]of E.agentItems.entries())I.buffer&&zt("turn/completed/unflushed-item",{itemId:v,phase:I.phase,bufferLen:I.buffer.length});I0(E),we()&&zt("turn/completed",{params:W??null});let z=A0(F,k);z.shouldReject?(we()&&zt("turn/completed/terminal-reject",{message:z.turnError.message}),_=!0,g=!0,c.stdin?.end(),n(z.turnError)):(g=!0,c.stdin?.end())}if(J==="error"){let W=j0(F,k);if(we()){let z=F.params,v=z?.error,I=typeof v?.message=="string"?v.message:"(no message)";zt(W.willRetry?"error/retry":"error/terminal-deferred",{message:I,willRetry:W.willRetry,params:z??null})}}e.onEvent?.(F)});let A="";c.stderr?.on("data",U=>{A+=U.toString()}),c.on("error",U=>{Z({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:U.message}),n(new Ee(`Failed to spawn codex app-server: ${U.message}`,{cause:U}))}),c.on("exit",U=>{if(!u&&!_){if(g){r({result:E.resultText,threadId:p,turnId:h,durationMs:Date.now()-S,exitCode:U});return}if(k.pendingCodexError){n(k.pendingCodexError);return}Z({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:U,stderr_tail:A.slice(0,500)}),n(new Error(x0({exitCode:U,stderr:A})))}}),(async()=>{try{if(await x("initialize",k0()),N("initialized",{}),e.threadId)try{let U=x("thread/resume",{threadId:e.threadId,sandbox:l,approvalPolicy:"never",...e.model?{model:e.model}:{}}),F=new Promise((J,R)=>setTimeout(()=>R(new Error("resume timeout")),5e3));await Promise.race([U,F]),p=e.threadId}catch{process.stderr.write(`[codex] thread/resume failed, creating new thread
|
|
1060
1060
|
`);let F=(await x("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:l,...e.model?{model:e.model}:{}})).result?.thread;F?.id&&(p=F.id)}else{let F=(await x("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:l,...e.model?{model:e.model}:{}})).result?.thread;F?.id&&(p=F.id)}await x("turn/start",{threadId:p,input:[{type:"text",text:t}],...e.model?{model:e.model}:{}})}catch(U){at(c).catch(()=>{}),n(U instanceof Error?U:new Error(String(U)))}})()})}var S0,Cm=b(()=>{"use strict";Ne();Ne();Xr();lo();qn();kl();Ne();At();S0=(()=>{try{let t=new URL("../../../package.json",import.meta.url),e=JSON.parse(E0(b0(t),"utf8"));return typeof e.version=="string"?e.version:"0.0.0"}catch{return"0.0.0"}})()});function Zt(t,e=["high","xhigh"]){return{name:t,reasoning:!0,provider:{npm:"@ai-sdk/github-copilot"},variants:Object.fromEntries(e.map(r=>[r,{reasoningEffort:r,reasoningSummary:"auto",include:["reasoning.encrypted_content"]}]))}}function vl(){return structuredClone({"github-copilot":{npm:"@ai-sdk/openai-compatible",name:"GitHub Copilot",options:{baseURL:"https://api.githubcopilot.com"},models:Mm},deepseek:{npm:"@ai-sdk/openai-compatible",name:"DeepSeek",options:{baseURL:"https://api.deepseek.com/v1",apiKey:"{env:DEEPSEEK_API_KEY}"},models:Object.fromEntries(Dm.map(t=>[t,{name:t}]))},openrouter:{npm:"@ai-sdk/openai-compatible",name:"OpenRouter",options:{baseURL:"https://openrouter.ai/api/v1",apiKey:"{env:OPENROUTER_API_KEY}"},models:Object.fromEntries(Pm.map(t=>[t,{name:t}]))}})}function Fm(){return[...Object.keys(Mm).map(t=>`github-copilot/${t}`),...Dm.map(t=>`deepseek/${t}`),...Pm.map(t=>`openrouter/${t}`)].sort()}var Mm,Dm,Pm,Il=b(()=>{"use strict";Mm={"gpt-4.1":{name:"GPT-4.1"},"gpt-4.1-2025-04-14":{name:"GPT-4.1 (2025-04-14)"},"gpt-4o-mini":{name:"GPT-4o mini"},"gpt-4o-mini-2024-07-18":{name:"GPT-4o mini (2024-07-18)"},"gpt-5-mini":Zt("GPT-5 mini",["high"]),"gpt-5.2":Zt("GPT-5.2"),"gpt-5.2-codex":Zt("GPT-5.2 Codex"),"gpt-5.3-codex":Zt("GPT-5.3 Codex"),"gpt-5.4":Zt("GPT-5.4"),"gpt-5.4-mini":Zt("GPT-5.4 mini"),"gpt-5.4-nano":Zt("GPT-5.4 nano"),"gpt-5.5":Zt("GPT-5.5")},Dm=["deepseek-chat","deepseek-reasoner","deepseek-v4-flash","deepseek-v4-pro"],Pm=["qwen/qwen3-coder","qwen/qwen3-coder-plus","qwen/qwen3-coder-flash","qwen/qwen3.5-9b","qwen/qwen3.5-397b-a17b","qwen/qwen3.5-plus-20260420","qwen/qwen3.6-flash","qwen/qwen3.6-plus","qwen/qwen3.6-max-preview","qwen/qwen3.7-plus"]});import{existsSync as qm,mkdirSync as R0,readFileSync as Hm,writeFileSync as Um}from"node:fs";import{join as Hn,resolve as O0}from"node:path";function Bm(){return{type:"local",command:["lmctl","mcp"],enabled:!0,timeout:L0}}function C0(t,e){return JSON.stringify(t)===JSON.stringify(e)}function fo(t){return structuredClone(t)}function Jm(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 Nl(t,e,r={existsSync:qm,readFileSync:Hm}){let n=[];for(let s of t){if(s.provider.trim().toLowerCase()!=="opencode")continue;let o=O0(e,s.sessiondir??e);for(let i of M0(o)){let a=D0(i,r);a!==void 0&&Object.prototype.hasOwnProperty.call(a,"permission")&&(Jm(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 M0(t){return[Hn(t,".opencode","opencode.jsonc"),Hn(t,"opencode.jsonc"),Hn(t,"opencode.json")]}function D0(t,e){try{if(!e.existsSync(t))return;let r=e.readFileSync(t,"utf-8"),n=JSON.parse(P0(r));return n===null||typeof n!="object"||Array.isArray(n)?void 0:n}catch{return}}function P0(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]!==`
|
|
1061
1061
|
`;)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 mo(t,e={}){let r=Hn(t,".opencode"),n=Hn(r,"opencode.json");if(Kr("lmctl","lmctl_chat",e),!qm(n)){R0(r,{recursive:!0});let l=JSON.stringify({permission:"allow",provider:vl(),mcp:{lmctl:Bm()}},null,2);return Um(n,l+`
|
|
1062
1062
|
`,"utf-8"),!0}let s;try{s=JSON.parse(Hm(n,"utf-8"))}catch{return console.log(Wm.yellow(` .opencode/opencode.json at ${n} is malformed \u2014 skipping opencode config install.`)),!1}if(typeof s!="object"||s===null)return console.log(Wm.yellow(` .opencode/opencode.json at ${n} is not an object \u2014 skipping opencode config install.`)),!1;let o=!1;s.permission===void 0&&(s.permission="allow",o=!0),Jm(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.`}),F0(s)&&(o=!0);let i=s.mcp&&typeof s.mcp=="object"&&!Array.isArray(s.mcp)?{...s.mcp}:{},a=Bm();return C0(i.lmctl,a)||(i.lmctl=a,s.mcp=i,o=!0),o&&Um(n,JSON.stringify(s,null,2)+`
|
|
@@ -1079,12 +1079,12 @@ ${r}`:r}function z0(t){let e=[...t.matchAll(X0)];if(e.length>0){let r=e[e.length
|
|
|
1079
1079
|
`).filter(l=>l.length>0),i=o[o.length-1]||"",a=o.length>1?`${o.length} lines: ${he(i,60)}`:he(s,80);e({kind:"other",summary:`running\u2026 ${a}`})}else e({kind:"other",summary:"running\u2026"});return}if(r.startsWith("item/")){e({kind:"other",summary:r.slice(5)});return}}async function Zm(t,e){let r=await Lm(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=>sI(n,e.onProgress):void 0,signal:e.signal});return{text:r.result,sessionId:r.threadId,durationMs:r.durationMs}}var Q0,Tr=b(()=>{"use strict";Rm();Cm();Ym();Ne();Q0=256});function xl(t){return new $l(t)}var $l,jl=b(()=>{"use strict";Tm();Vt();Tr();jt();$l=class extends Ce{constructor(e){super({provider:new no(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"claude",seedArgs:["-p",je,"--dangerously-skip-permissions"],resumeTemplate:"claude --resume {{session_id}}",startTemplate:"claude",transport:ho})}}});import{readdir as oI,stat as Qm,unlink as iI}from"node:fs/promises";import{join as Jn,basename as aI}from"node:path";function lI(t,e,r){return`${t}|${e.toISOString()}|${r}`}function Xn(t,e,r){let n=lI(r.role,r.timestamp,r.content);e.has(n)||(e.add(n),t.push(r))}function ep(t,e){return e==="exec"||t==="codex_exec"?"codex exec":"codex"}function cI(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 _o(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 _o(r)}).filter(r=>r.length>0).join(`
|
|
1080
1080
|
`);try{return JSON.stringify(t)}catch{return String(t)}}async function tp(t){let e=0,r=0,n=0,s=0,o=0,i,a;for await(let l of We(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=cI(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,rp=b(()=>{"use strict";Kt();go=class{name="codex";codexDirs;constructor(e={}){let r=[Jn(ve,".codex"),Jn(ve,".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:Jn(e,"sessions"),filePattern:/\.jsonl$/}))}async getSessionsDirs(){let e=[];for(let r of this.codexDirs){let n=Jn(r,"sessions");try{await Qm(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 oI(e)}catch{return r}for(let s of n){let o=Jn(e,s),i=await Qm(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=aI(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 Me(e,30),n=await xe(e),s=this.extractSessionIdFromFilename(e),o="",i,a,l,c,u,d,f;for(let p of r){if(p.type==="session_meta"&&p.payload&&(p.payload.id&&(s=p.payload.id),p.payload.cwd&&(o=p.payload.cwd),p.payload.cli_version&&(i=p.payload.cli_version),p.payload.timestamp&&(l=new Date(p.payload.timestamp)),p.payload.originator&&(d=p.payload.originator),p.payload.source&&(f=p.payload.source)),p.type==="turn_context"&&p.payload&&(p.payload.model&&(a=p.payload.model),!o&&p.payload.cwd&&(o=p.payload.cwd)),p.type==="event_msg"&&p.payload?.type==="user_message"){let h=p.payload.message||p.payload.text;h&&(c||(c=K(h.trim(),80)),u=K(h.trim(),80))}if(p.type==="response_item"&&p.payload?.type==="message"&&p.payload.role==="user"&&p.payload.content){let h=p.payload.content.find(g=>g.type==="input_text"&&typeof g.text=="string"&&g.text);typeof h?.text=="string"&&(c||(c=K(h.text.trim(),80)),u=K(h.text.trim(),80))}}if(!o)return null;let m=await tp(e);return{provider:"codex",sessionId:s,cwd:o,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:i,startCommand:ep(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 xe(r),s=[],o="",i,a,l,c,u,d=e,f,m=new Set;for await(let h of We(r)){let g=h.timestamp?new Date(h.timestamp):new Date;if(h.type==="session_meta"&&h.payload){h.payload.id&&(d=h.payload.id),h.payload.cwd&&(o=h.payload.cwd),h.payload.cli_version&&(i=h.payload.cli_version),h.payload.timestamp&&(l=new Date(h.payload.timestamp)),f=ep(h.payload.originator,h.payload.source);continue}if(h.type==="turn_context"&&h.payload){h.payload.model&&(a=h.payload.model),!o&&h.payload.cwd&&(o=h.payload.cwd);continue}if(h.type==="response_item"&&h.payload){let _=h.payload;if(_.type==="message"){if(_.role==="user"&&_.content){for(let S of _.content)if(S.type==="input_text"&&typeof S.text=="string"&&S.text){let E=S.text.trim();c||(c=K(E,80)),u=K(E,80),Xn(s,m,{role:"user",timestamp:g,content:de(E)})}continue}if(_.role==="assistant"&&_.content){for(let S of _.content)S.type==="output_text"&&typeof S.text=="string"&&S.text&&Xn(s,m,{role:"assistant",timestamp:g,content:de(S.text),model:a});continue}if(_.role!=="user"&&_.role!=="assistant"&&_.content){for(let S of _.content)(S.type==="input_text"||S.type==="output_text")&&typeof S.text=="string"&&S.text&&Xn(s,m,{role:"system",timestamp:g,content:de(S.text.trim())});continue}}if(_.type==="function_call"){s.push({role:"tool_use",timestamp:g,content:_.name||"unknown tool",toolName:_.name,toolInput:_.arguments!==void 0?de(_o(_.arguments)):void 0,toolCallId:_.call_id});continue}if(_.type==="function_call_output"){s.push({role:"tool_result",timestamp:g,content:de(_o(_.output)),toolCallId:_.call_id});continue}if(_.type==="reasoning"&&_.summary){let S=_.summary.map(E=>_o(E.text)).join(`
|
|
1081
1081
|
`);S.trim()&&Xn(s,m,{role:"thinking",timestamp:g,content:de(S)});continue}}if(h.type==="event_msg"&&h.payload&&h.payload.type==="agent_reasoning"){let _=h.payload.message||h.payload.text;_&&Xn(s,m,{role:"thinking",timestamp:g,content:de(_)})}}if(!o)return null;let p=await tp(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 iI(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 Me(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 Rl(t){return new Al(t)}var Al,Ol=b(()=>{"use strict";rp();Vt();Tr();jt();Al=class extends Ce{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:`${je}
|
|
1082
|
-
`,resumeTemplate:"codex resume {{session_id}}",startTemplate:"codex",transport:Zm})}seedArgsFor(e){let r=super.seedArgsFor(e);return e?.model?[...r.slice(0,-1),"--model",e.model,r[r.length-1]]:r}}});function Gn(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
|
|
1082
|
+
`,resumeTemplate:"codex resume {{session_id}}",startTemplate:"codex",transport:Zm})}seedArgsFor(e){let r=super.seedArgsFor(e);return e?.model?[...r.slice(0,-1),"--model",e.model,r[r.length-1]]:r}}});function Gn(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 wo(t){let e=Gn(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(`
|
|
1083
1083
|
`).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?uI(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 uI(t,e){for(let[r,n]of Object.entries(e))if(n!==void 0){if(r==="tokens"&&np(t.tokens)&&np(n)){t.tokens={...t.tokens,...n};continue}t[r]=n}}function np(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function sp(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(`
|
|
1084
1084
|
`)+`
|
|
1085
|
-
`}var Ll=b(()=>{"use strict"});import{createHash as dI}from"node:crypto";import{readdir as Kn,readFile as op,stat as
|
|
1086
|
-
`).trim();N&&o.push({role:"thinking",timestamp:Sr(x.timestamp,_),content:de(N)})}o.push({role:"assistant",timestamp:_,content:E,model:g.model});continue}let k=S?`[${S}] `:"";o.push({role:"system",timestamp:_,content:`${k}${E}`.trim()})}let m=Sr(n.startTime,s.createdAt),p=Sr(n.lastUpdated,s.modifiedAt),h=lp(i);return{provider:"gemini",sessionId:a,cwd:c,createdAt:m,modifiedAt:p,model:f,startCommand:"gemini",firstUserMessage:u,lastUserMessage:d,messageCount:o.filter(g=>g.role==="user"||g.role==="assistant").length,filePath:r,totalInputTokens:h.totalInputTokens||void 0,totalCachedInputTokens:h.totalCachedInputTokens||void 0,totalOutputTokens:h.totalOutputTokens||void 0,totalReasoningOutputTokens:h.totalReasoningOutputTokens||void 0,lastInputTokens:h.lastInputTokens||void 0,lastTokenUsage:h.lastTokenUsage,messages:o}}async extractSummary(e){let r=await this.readSessionFile(e);if(!r)return null;let n=await xe(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(ap(m.type)){d++;let p=ip(m.content).trim();p&&(l||(l=K(de(p),80)),c=K(de(p),80))}else Cl(m.type)&&(d++,m.model&&(u=m.model));let f=lp(s);return{provider:"gemini",sessionId:o,cwd:a,createdAt:Sr(r.startTime,n.createdAt),modifiedAt:Sr(r.lastUpdated,n.modifiedAt),model:u,startCommand:"gemini",firstUserMessage:l,lastUserMessage:c,messageCount:d,filePath:e,totalInputTokens:f.totalInputTokens||void 0,totalCachedInputTokens:f.totalCachedInputTokens||void 0,totalOutputTokens:f.totalOutputTokens||void 0,totalReasoningOutputTokens:f.totalReasoningOutputTokens||void 0,lastInputTokens:f.lastInputTokens||void 0,lastTokenUsage:f.lastTokenUsage}}async readSessionFile(e){let r=await op(e,"utf-8");if(Gn(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
|
|
1087
|
-
`)}manualSeedHint(e){return{launchCommand:`cd ${e} && gemini --skip-trust`,postLaunchNote:oo,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=
|
|
1085
|
+
`}var Ll=b(()=>{"use strict"});import{createHash as dI}from"node:crypto";import{readdir as Kn,readFile as op,stat as yo,unlink as fI}from"node:fs/promises";import{join as Xe,basename as mI,dirname as pI}from"node:path";import{cwd as hI}from"node:process";function ip(t){return t?typeof t=="string"?t:Array.isArray(t)?t.map(e=>e.text||"").join(""):"":""}function ap(t){return t==="user"}function Cl(t){return t==="gemini"||t==="assistant"}function Sr(t,e=new Date(0)){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function _I(t){return`${t.sessionId}\0${t.cwd}`}function gI(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 Eo(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function lp(t){let e=0,r=0,n=0,s=0,o=0,i;for(let a of t){if(!Cl(a.type)||!a.tokens)continue;let l=Eo(a.tokens.input),c=Eo(a.tokens.cached),u=Math.max(l-c,0),d=Eo(a.tokens.output),f=Eo(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 wI(t){return dI("sha256").update(t).digest("hex")}function Vn(t,e){let r=e;for(;r&&!t.has(r);){t.add(r);let n=pI(r);if(n===r)break;r=n}}var bo,cp=b(()=>{"use strict";Kt();Ll();Ne();bo=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(e={}){let r=e.geminiDir||Xe(ve,".gemini");this.geminiProjectsFile=Xe(r,"projects.json"),this.geminiTmpDir=Xe(r,"tmp");let n=e.claudeDir||Xe(ve,".claude");this.claudeProjectsDir=Xe(n,"projects");let s=[Xe(ve,".codex"),Xe(ve,".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=>Xe(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=_I(s),i=r.get(o);r.set(o,i?gI(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 xe(r),o=[],i=n.messages||[],a=n.sessionId||this.extractSessionIdFromFilename(r),l=n.projectHash||"",c=await this.resolveWorkspace(l),u,d,f;for(let g of i){let _=Sr(g.timestamp),S=g.type,E=de(ip(g.content));if(ap(S)){let x=E.trim();x&&(u||(u=K(x,80)),d=K(x,80)),o.push({role:"user",timestamp:_,content:x||E});continue}if(Cl(S)){g.model&&(f=g.model);for(let x of g.thoughts||[]){let N=[x.subject,x.description].filter(Boolean).join(`
|
|
1086
|
+
`).trim();N&&o.push({role:"thinking",timestamp:Sr(x.timestamp,_),content:de(N)})}o.push({role:"assistant",timestamp:_,content:E,model:g.model});continue}let k=S?`[${S}] `:"";o.push({role:"system",timestamp:_,content:`${k}${E}`.trim()})}let m=Sr(n.startTime,s.createdAt),p=Sr(n.lastUpdated,s.modifiedAt),h=lp(i);return{provider:"gemini",sessionId:a,cwd:c,createdAt:m,modifiedAt:p,model:f,startCommand:"gemini",firstUserMessage:u,lastUserMessage:d,messageCount:o.filter(g=>g.role==="user"||g.role==="assistant").length,filePath:r,totalInputTokens:h.totalInputTokens||void 0,totalCachedInputTokens:h.totalCachedInputTokens||void 0,totalOutputTokens:h.totalOutputTokens||void 0,totalReasoningOutputTokens:h.totalReasoningOutputTokens||void 0,lastInputTokens:h.lastInputTokens||void 0,lastTokenUsage:h.lastTokenUsage,messages:o}}async extractSummary(e){let r=await this.readSessionFile(e);if(!r)return null;let n=await xe(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(ap(m.type)){d++;let p=ip(m.content).trim();p&&(l||(l=K(de(p),80)),c=K(de(p),80))}else Cl(m.type)&&(d++,m.model&&(u=m.model));let f=lp(s);return{provider:"gemini",sessionId:o,cwd:a,createdAt:Sr(r.startTime,n.createdAt),modifiedAt:Sr(r.lastUpdated,n.modifiedAt),model:u,startCommand:"gemini",firstUserMessage:l,lastUserMessage:c,messageCount:d,filePath:e,totalInputTokens:f.totalInputTokens||void 0,totalCachedInputTokens:f.totalCachedInputTokens||void 0,totalOutputTokens:f.totalOutputTokens||void 0,totalReasoningOutputTokens:f.totalReasoningOutputTokens||void 0,lastInputTokens:f.lastInputTokens||void 0,lastTokenUsage:f.lastTokenUsage}}async readSessionFile(e){let r=await op(e,"utf-8");if(Gn(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 wo(r)}catch{return null}}extractSessionIdFromFilename(e){let r=mI(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 Kn(this.geminiTmpDir)}catch{return e}for(let n of r){let s=Xe(this.geminiTmpDir,n,"chats");if(!(await yo(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await Kn(s)}catch{continue}for(let a of i)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||e.push(Xe(s,a)))}return e}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await fI(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 xe(s).catch(()=>({createdAt:new Date(0),modifiedAt:new Date(0)}));n.push({filePath:s,modifiedAt:Sr(o?.lastUpdated,u.modifiedAt)})}return n.sort((s,o)=>{let i=o.modifiedAt.getTime()-s.modifiedAt.getTime();return i!==0?i:o.filePath.localeCompare(s.filePath)}),n[0]?.filePath??null}async resolveWorkspace(e){return e?(await this.getWorkspaceHashMap()).get(e)||`[hash:${e.slice(0,16)}]`:"(unknown workspace)"}async getWorkspaceHashMap(){if(this.workspaceHashMap)return this.workspaceHashMap;let e=new Set;Vn(e,hI());for(let n of this.extraWorkspacePaths)Vn(e,n);for(let n of await this.collectGeminiProjectPaths())Vn(e,n);for(let n of await this.collectCodexCwds())Vn(e,n);for(let n of await this.collectClaudeCwds())Vn(e,n);let r=new Map;for(let n of e)r.set(wI(n),n);return this.workspaceHashMap=r,r}async collectGeminiProjectPaths(){let e;try{e=await op(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 Me(s,1).catch(()=>[]))[0]?.payload?.cwd;i&&e.add(i)}}return[...e]}async collectClaudeCwds(){let e=new Set,r;try{r=await Kn(this.claudeProjectsDir)}catch{return[]}for(let n of r){let s=Xe(this.claudeProjectsDir,n);if(!(await yo(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await Kn(s)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=Xe(s,a),u=(await Me(l,1).catch(()=>[]))[0]?.cwd;u&&e.add(u)}}return[...e]}async findJsonlFiles(e){let r=[];if(!(await yo(e).catch(()=>null))?.isDirectory())return r;let s;try{s=await Kn(e)}catch{return r}for(let o of s){let i=Xe(e,o),a=await yo(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 yI,writeFileSync as EI,mkdirSync as bI}from"node:fs";import{join as TI,dirname as SI}from"node:path";import{randomUUID as kI}from"node:crypto";function Dl(t){return new Ml(t)}var Ml,Pl=b(()=>{"use strict";cp();Vt();Tr();jt();Ll();Ml=class extends Ce{constructor(e){super({provider:new bo(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",je,"-y","--skip-trust"],resumeTemplate:"gemini --resume {{session_id}} --skip-trust",startTemplate:"gemini --skip-trust",transport:(r,n)=>Vr(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(`
|
|
1087
|
+
`)}manualSeedHint(e){return{launchCommand:`cd ${e} && gemini --skip-trust`,postLaunchNote:oo,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=yI(n,"utf-8"),o=Gn(s),i=wo(s),a=kI();i.sessionId=a,i.kind="main";let l=SI(n),c=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),u=o==="jsonl"?".jsonl":".json",d=`session-${c}-${a.slice(0,8)}${u}`,f=TI(l,d);return bI(l,{recursive:!0}),EI(f,sp(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 up,readFile as vI,rm as II,stat as Yr}from"node:fs/promises";import{basename as NI,join as lt}from"node:path";function $I(t){let e={};for(let r of t.split(`
|
|
1088
1088
|
`)){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 kr(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}async function xI(t){let e=0;for await(let r of We(t))(r.type==="user.message"||r.type==="assistant.message"&&(r.data?.content||"").trim())&&e++;return e}var To,dp=b(()=>{"use strict";Kt();To=class{name="copilot";sessionStateDir;constructor(e={}){let r=e.copilotDir||lt(ve,".copilot");this.sessionStateDir=lt(r,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await up(this.sessionStateDir)}catch{return e}for(let n of r){let s=lt(this.sessionStateDir,n);if((await Yr(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=lt(r,"events.jsonl"),o=await Yr(s).catch(()=>null),i=o?s:lt(r,"workspace.yaml"),a=await xe(o?s:r),l=[],c=n?.cwd||"(unknown workspace)",u,d,f,m,p,h,g=n?.id||NI(r)||e;if(o)for await(let _ of We(s)){let S=kr(_.timestamp)||a.modifiedAt;if(_.type==="session.start"&&_.data){_.data.sessionId&&(g=_.data.sessionId),_.data.copilotVersion&&(d=_.data.copilotVersion),_.data.startTime&&(h=kr(_.data.startTime)),_.data.selectedModel&&(u=_.data.selectedModel),_.data.context&&(_.data.context.cwd&&(c=_.data.context.cwd),_.data.context.branch&&(f=_.data.context.branch));continue}if(_.type==="session.model_change"&&_.data?.newModel){u=_.data.newModel;continue}if(_.type==="user.message"&&_.data){let E=_.data.content||"",k=E.trim();k&&(m||(m=K(k,80)),p=K(k,80)),l.push({role:"user",timestamp:S,content:de(k||E)});continue}if(_.type==="assistant.message"&&_.data){let E=(_.data.content||"").trim();if(E&&l.push({role:"assistant",timestamp:S,content:de(E),model:u}),_.data.toolRequests)for(let k of _.data.toolRequests)l.push({role:"tool_use",timestamp:S,content:k.name||"unknown tool",toolName:k.name,toolInput:k.arguments?JSON.stringify(k.arguments,null,2):void 0,toolCallId:k.toolCallId});continue}if(_.type==="tool.execution_complete"&&_.data){let E=_.data.result?.content||"",k=_.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:S,content:de(E),toolDetailedContent:k?de(k):void 0,toolCallId:_.data.toolCallId});continue}if(_.type==="assistant.reasoning"&&_.data?.content){l.push({role:"thinking",timestamp:S,content:de(_.data.content)});continue}if(_.type==="session.error"||_.type==="session.warning"||_.type==="session.info"||_.type==="system.message"){let E=_.data?.message||"";E.trim()&&l.push({role:"system",timestamp:S,content:de(E)});continue}}if(!m){let _=(n?.summary||"").trim();_&&(m=K(_,80))}return{provider:"copilot",sessionId:g,cwd:c,createdAt:h??kr(n?.created_at)??a.createdAt,modifiedAt:kr(n?.updated_at)??a.modifiedAt,model:u,cliVersion:d,startCommand:"copilot",gitBranch:f,firstUserMessage:m,lastUserMessage:p,messageCount:l.filter(_=>_.role==="user"||_.role==="assistant").length,filePath:i,messages:l}}async extractSummary(e,r){let n=await this.readWorkspaceYaml(e),s=lt(e,"events.jsonl"),o=await Yr(s).catch(()=>null),i=o?s:lt(e,"workspace.yaml"),a=await xe(o?s:e),l=o?await Me(s,20):[],c=n?.id||r,u=n?.cwd||"(unknown workspace)",d,f,m,p,h;for(let _ of l)if(_.type==="session.start"&&_.data&&(_.data.sessionId&&(c=_.data.sessionId),_.data.copilotVersion&&(f=_.data.copilotVersion),_.data.startTime&&(m=kr(_.data.startTime)),_.data.selectedModel&&(d=_.data.selectedModel),_.data.context?.cwd&&(u=_.data.context.cwd)),_.type==="session.model_change"&&_.data?.newModel&&(d||(d=_.data.newModel)),_.type==="user.message"&&_.data){let S=(_.data.content||"").trim();S&&(p||(p=K(S,80)),h=K(S,80))}if(!p){let _=(n?.summary||"").trim();_&&(p=K(_,80))}let g=o?await xI(s):0;return{provider:"copilot",sessionId:c,cwd:u,createdAt:m??kr(n?.created_at)??a.createdAt,modifiedAt:kr(n?.updated_at)??a.modifiedAt,model:d,cliVersion:f,startCommand:"copilot",firstUserMessage:p,lastUserMessage:h,messageCount:g,filePath:i}}async readWorkspaceYaml(e){let r=lt(e,"workspace.yaml");try{let n=await vI(r,"utf-8");return $I(n)}catch{return null}}async resolveSessionPath(e){return this.resolveSessionDir(e)}async deleteSession(e){let r=await this.resolveSessionDir(e);return r?(await II(r,{recursive:!0}),!0):!1}async resolveSessionDir(e){let r;try{r=await up(this.sessionStateDir)}catch{return null}if(r.includes(e)){let s=lt(this.sessionStateDir,e);if((await Yr(s).catch(()=>null))?.isDirectory())return s}let n=[];for(let s of r)if(s.startsWith(e)){let o=lt(this.sessionStateDir,s);(await Yr(o).catch(()=>null))?.isDirectory()&&n.push(o)}if(n.length===1)return n[0];for(let s of r){let o=lt(this.sessionStateDir,s);if(!(await Yr(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 Fl(t){return new Ce({provider:new To(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"copilot",seedArgs:["-p",je,"--yolo"],resumeTemplate:"copilot --resume={{session_id}}",startTemplate:"copilot",transport:(e,r)=>Vr(e,{...r,acpTool:"copilot"})})}var Ul=b(()=>{"use strict";dp();Vt();Tr();jt()});import{existsSync as fp}from"node:fs";import{join as So}from"node:path";import{createRequire as jI}from"node:module";function mp(){return Wl===null&&(Wl=jI(import.meta.url)("node:sqlite").DatabaseSync),Wl}function AI(){let t=process.env.XDG_DATA_HOME||So(ve,".local","share"),e=process.env.XDG_CONFIG_HOME||So(ve,".config");return[So(t,"opencode","opencode.db"),So(e,"opencode","opencode.db")]}var Wl,ko,pp=b(()=>{"use strict";Kt();Wl=null;ko=class{name="opencode";dbPath;constructor(e){e?.dbPath?this.dbPath=e.dbPath:this.dbPath=AI().find(r=>fp(r))??null}openDb(){return!this.dbPath||!fp(this.dbPath)?null:new(mp())(this.dbPath,{open:!0,readOnly:!0})}async discoverSessions(){let e=this.openDb();if(!e)return[];try{let r=new Map,n=e.prepare("SELECT id, worktree, name FROM project").all();for(let i of n)r.set(i.id,i);let s=e.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
|
|
1089
1089
|
s.time_created, s.time_updated
|
|
1090
1090
|
FROM session s
|
|
@@ -1098,9 +1098,9 @@ ${r}`:r}function z0(t){let e=[...t.matchAll(X0)];if(e.length>0){let r=e[e.length
|
|
|
1098
1098
|
FROM session s
|
|
1099
1099
|
WHERE s.id LIKE ?
|
|
1100
1100
|
ORDER BY s.time_updated DESC
|
|
1101
|
-
LIMIT 2`).all(`${r}%`);return s.length!==1?null:s[0]}}});function ql(){return new Bl}var Bl,Hl=b(()=>{"use strict";pp();Vt();Tr();jt();Bl=class extends Ce{constructor(){super({provider:new ko,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",je],resumeTemplate:"opencode --session {{session_id}}",startTemplate:"opencode",transport:(e,r)=>Vr(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??je),r}}});import{readdir as vo,readFile as RI,rm as OI}from"node:fs/promises";import{basename as hp,join as Qt}from"node:path";function _p(t){return t.type==="user"||t.message?.role==="user"}function gp(t){return t.type==="assistant"||t.message?.role==="assistant"||t.message?.role==="model"}function
|
|
1101
|
+
LIMIT 2`).all(`${r}%`);return s.length!==1?null:s[0]}}});function ql(){return new Bl}var Bl,Hl=b(()=>{"use strict";pp();Vt();Tr();jt();Bl=class extends Ce{constructor(){super({provider:new ko,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",je],resumeTemplate:"opencode --session {{session_id}}",startTemplate:"opencode",transport:(e,r)=>Vr(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??je),r}}});import{readdir as vo,readFile as RI,rm as OI}from"node:fs/promises";import{basename as hp,join as Qt}from"node:path";function _p(t){return t.type==="user"||t.message?.role==="user"}function gp(t){return t.type==="assistant"||t.message?.role==="assistant"||t.message?.role==="model"}function wp(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(`
|
|
1102
1102
|
`):Array.isArray(e.parts)?e.parts.filter(r=>!r.thought&&r.type!=="thinking").map(r=>r.text||"").join(`
|
|
1103
|
-
`):"":""}function wp(t){return t.model||t.message?.model}var Io,Ep=b(()=>{"use strict";Kt();Io=class{name="qwen";baseDir;constructor(e){this.baseDir=e?.qwenDir||Qt(ve,".qwen")}async discoverSessions(){let e=Qt(this.baseDir,"projects"),r;try{r=await vo(e)}catch{return[]}let n=[];for(let s of r){let o=Qt(e,s,"chats"),i;try{i=await vo(o)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=Qt(o,a);try{let u=await this.extractSummary(c,l);u&&n.push(u)}catch{}}}return n}async extractSummary(e,r){let n=await Me(e,30);if(n.length===0)return null;let s=await xe(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)),_p(d)){let f=yp(d).trim();f&&(l||(l=K(f,80)),c=K(f,80)),u++}if(gp(d)){let f=wp(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=hp(r,".jsonl");return this.loadFromFile(r,n)}async loadFromFile(e,r){let n=await xe(e),s="(unknown)",o,i,a,l,c,u,d=[];for await(let f of We(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(_p(f)){let h=yp(f);h.trim()&&(c||(c=K(h.trim(),80)),u=K(h.trim(),80)),d.push({role:"user",timestamp:p,content:h})}else if(gp(f)){let h=wp(f);if(h&&(o=h),Array.isArray(m.content))for(let g of m.content)g.type==="text"&&g.text?d.push({role:"assistant",timestamp:p,content:g.text,model:h}):g.type==="thinking"&&g.thinking&&d.push({role:"thinking",timestamp:p,content:g.thinking});else if(typeof m.content=="string")d.push({role:"assistant",timestamp:p,content:m.content,model:h});else if(Array.isArray(m.parts))for(let g of m.parts)if(g.thought||g.type==="thinking"){let _=g.thinking||g.text;_&&d.push({role:"thinking",timestamp:p,content:_})}else g.text&&d.push({role:"assistant",timestamp:p,content:g.text,model:h})}}return{provider:"qwen",sessionId:r,slug:l,cwd:s,createdAt:n.createdAt,modifiedAt:n.modifiedAt,model:o,cliVersion:i,gitBranch:a,startCommand:"qwen",firstUserMessage:c,lastUserMessage:u,messageCount:d.length,filePath:e,messages:d}}async resolveSessionPath(e){let r=Qt(this.baseDir,"projects");try{let n=await vo(r),s=[];for(let o of n){let i=Qt(r,o,"chats",`${e}.jsonl`);try{return await RI(i,{flag:"r"}),i}catch{continue}}for(let o of n){let i=Qt(r,o,"chats"),a;try{a=await vo(i)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;hp(l,".jsonl").startsWith(e)&&s.push(Qt(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 OI(r),!0}catch{return!1}}}});function Xl(){return new Jl}var Jl,Gl=b(()=>{"use strict";Ep();Vt();Tr();jt();Jl=class extends Ce{constructor(){super({provider:new Io,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",je,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:ho})}}});import{readdir as bp,readFile as LI,rm as Tp,stat as Sp}from"node:fs/promises";import{basename as Kl,join as Ct}from"node:path";async function CI(t){let e=await Promise.all(t.map(r=>xe(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 MI(t,e){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function kp(t){return t.type==="USER_INPUT"}function vp(t){return t.source==="MODEL"&&t.type==="PLANNER_RESPONSE"}function DI(t){return t.source==="MODEL"&&t.type!=="PLANNER_RESPONSE"}function Ip(t){if(!t)return"";let e=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(t);return e?e[1]:t}function Np(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 PI(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}async function FI(t){for await(let e of We(t)){let r=e.tool_calls?.map(s=>s.args)??[];for(let s of r){let o=UI(s);if(o)return o}let n=WI(e.content);if(n)return n}return null}function UI(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 WI(t){return t?/"Cwd":"([^"]+)"/.exec(t)?.[1]??null:null}function $p(t){if(t.endsWith(".db"))return Kl(t,".db");let e="/brain/",r=t.indexOf(e);return r===-1?null:t.slice(r+e.length).split("/")[0]||null}var No,xp=b(()=>{"use strict";Kt();No=class{name="agy";baseDir;constructor(e={}){this.baseDir=e.agyDir||Ct(ve,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:Ct(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let e=Ct(this.baseDir,"conversations"),r;try{r=await bp(e)}catch{return[]}let n=[];for(let s of r){if(!s.endsWith(".db"))continue;let o=Kl(s,".db");try{let i=await this.extractSummary(o);i&&n.push(i)}catch{}}return n}conversationPath(e){return Ct(this.baseDir,"conversations",`${e}.db`)}transcriptPath(e){return Ct(this.baseDir,"brain",e,".system_generated","logs","transcript.jsonl")}async existingTranscriptPath(e){let r=this.transcriptPath(e);try{return await Sp(r),r}catch{return null}}async extractSummary(e){let r=this.conversationPath(e),n=await this.existingTranscriptPath(e),s=n??r,o=await CI([r,n].filter(Boolean)),i=await this.resolveCwd(e,n),a,l,c,u=0;if(n){let d=await Me(n,80);for(let f of d){let m=Np(f.content);if(m&&(a=m),kp(f)){let p=Ip(f.content).trim();p&&(l||(l=K(p,80)),c=K(p,80)),u++}else vp(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=$p(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 We(o)){let d=MI(u.created_at,s.modifiedAt),f=Np(u.content);if(f&&(a=f),kp(u)){let m=Ip(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:PI(m.args),toolName:m.name||"tool"});vp(u)&&u.content?i.push({role:"assistant",timestamp:d,content:u.content,model:a}):DI(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 Sp(r),r}catch{}let n=Ct(this.baseDir,"conversations");try{let s=[];for(let o of await bp(n)){if(!o.endsWith(".db"))continue;Kl(o,".db").startsWith(e)&&s.push(Ct(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=$p(r);return n?(await Tp(this.conversationPath(n),{force:!0}),await Tp(Ct(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 FI(r);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(e){let r=Ct(this.baseDir,"cache","last_conversations.json");try{let n=JSON.parse(await LI(r,"utf8"));for(let[s,o]of Object.entries(n))if(o===e)return s}catch{}return null}}});import{spawn as BI}from"node:child_process";function Yl(t){return new Vl(t)}async function qI(t,e){let r=Date.now(),n=["--conversation",e.sessionId,"-p",t,"--dangerously-skip-permissions","--print-timeout",JI(e.timeoutMs)];e.model&&n.push("--model",e.model),Yt("agy",n,e.permissionMode??"yolo"),e.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await HI(e.binary,n,{cwd:e.cwd,env:ze(e.env,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 HI(t,e,r){return new Promise((n,s)=>{let o;try{o=BI(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 JI(t){return!t||t<=0?"8h":`${Math.max(1,Math.ceil(t/1e3))}s`}var Vl,zl=b(()=>{"use strict";xp();Vt();jt();At();qn();Vl=class extends Ce{constructor(e){super({provider:new No(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",je,"--dangerously-skip-permissions","--print-timeout","2m"],resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:qI})}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 XI}from"node:crypto";import{join as GI}from"node:path";function KI(t){return XI("sha256").update(t).digest("hex").slice(0,8)}function VI(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"session"}function YI(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 zI(t){return t.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function $o(t){return Math.max(1,Math.ceil(t.length/4))}function jp(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 ec(){return new Ql}var vr,Zl,Ql,tc=b(()=>{"use strict";vr=new Map;Zl=class{name="ClaudeMock";async discoverSessions(){return[...vr.values()].map(jp)}async loadSession(e){let r=vr.get(e);return r===void 0?null:{...jp(r),messages:r.messages.slice()}}async resolveSessionPath(e){return vr.get(e)?.filePath??null}async deleteSession(e){return vr.delete(e)}},Ql=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new Zl;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=VI(YI(e,r)),s=`mock-${n}-${KI(`${e}:${n}`)}`,o=new Date,i=vr.get(s),a=r?.prompt??"ClaudeMock seed",l=$o(a),c={sessionId:s,cwd:e,filePath:GI(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+=$o("ACK: ClaudeMock seeded"),vr.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=vr.get(r.sessionId);if(s===void 0)throw new Error(`ClaudeMock session not found: ${r.sessionId}`);let o=new Date,i=`ClaudeMock ack: ${zI(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+=$o(e),s.totalOutputTokens+=$o(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 yt(t){let e=[xl({claudeDir:t?.claudeDir}),Rl({codexDir:t?.codexDir,codeDir:t?.codeDir}),Dl({geminiDir:t?.geminiDir,claudeDir:t?.claudeDir,codexDir:t?.codexDir,codeDir:t?.codeDir}),Fl({copilotDir:t?.copilotDir}),ql(),Xl(),Yl({agyDir:t?.agyDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&e.push(ec()),e}var rc=b(()=>{"use strict";jl();Ol();Pl();Ul();Hl();Gl();zl();tc();jl();Ol();Pl();Ul();Hl();Gl();zl();tc()});var ic={};le(ic,{ProviderRegistry:()=>Wn,TransportConnectionError:()=>Ee,TransportError:()=>Ze,TransportJsonError:()=>io,TransportProcessError:()=>Rt,TransportRpcError:()=>Ot,_resetDefaultRegistryForTests:()=>ZI,chat:()=>Mt,countTokens:()=>oc,createAdapterRegistry:()=>gt,createAllAdapters:()=>yt,listSessions:()=>sc,seed:()=>nc});function jo(){return xo===null&&(xo=gt(yt())),xo}function ZI(){xo=null}function Rp(t,e){let r=t.getAdapter(e);if(!r)throw new Error(`provider "${e}" is not registered in this registry`);return r}async function Mt(t){let e=t.registry??jo(),r=Rp(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 nc(t){let e=t.registry??jo(),r=Rp(e,t.provider),n=await Ap(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};let o=await Ap(e,t.provider,t.cwd),i=QI(n,o);return i?{success:!0,sessionId:i}:{success:!0}}async function Ap(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 QI(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 sc(t={}){return(t.registry??jo()).listAll({provider:t.provider,workspace:t.workspace,limit:t.limit,from:t.from,to:t.to})}async function oc(t){let r=await(t.registry??jo()).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 xo,wt=b(()=>{"use strict";wl();rc();wl();rc();Xr();xo=null});function eN(){return ac===null&&(ac=gt(yt())),ac}async function Zr(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 rN(t)}catch(i){throw s=!0,o=i,i}finally{if(n)if(!s)zr.delete(r),e.setMemberState(r,"idle");else{let i=tN(o,r);e.setMemberState(r,i!==null?"attention_needed":"idle",i)}}}function tN(t,e){if(!(t instanceof be))return zr.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=(zr.get(e)??0)+1;return r>=3?(zr.delete(e),"consecutive_timeouts"):(zr.set(e,r),null)}return zr.delete(e),null}async function rN(t){let e=t.timeoutMs,r=typeof e=="number"&&e>0,n=eN(),s;try{let u=await n.resolveSession(t.sessionid);if(!u)return Promise.reject(new be("other",null,`library: sessionid "${t.sessionid}" matched no registered provider`,lc(t.sessionid,t.sessiondir,"unresolved")));s=u.provider.name}catch(u){return Promise.reject(new be("other",null,`library: session resolution failed: ${Op(u)}`,lc(t.sessionid,t.sessiondir,"unresolved")))}let o=lc(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 Mt({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 be("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 be("timeout",null,`library: wall-clock timeout after ${e??0}ms`,o):nN(u,o)}finally{a!==null&&clearTimeout(a)}}function lc(t,e,r){return["<library>","chat",t,e,"--provider",r]}function Op(t){return t instanceof Error?t.message:String(t)}function nN(t,e){if(t instanceof be)return t;if(t instanceof Ee){let r=t.cause;return r?.code==="ENOENT_CWD"?new be("sessiondir_missing",null,t.message,e):r?.code==="ENOENT"?new be("enoent",null,t.message,e):new be("other",null,t.message,e)}return t instanceof Rt?new be("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof Ot?new be("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof Ze?new be("other",null,t.message,e):new be("other",null,Op(t),e)}var be,ac,zr,Yn=b(()=>{"use strict";wt();be=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"}},ac=null;zr=new Map});function Lp(){return cc===null&&(cc=gt(yt())),cc}function oN(t,e){if(!sN.test(t))return t;let r=e.getConfig(`workspace.${t}`);if(r===null||r.length===0)throw new Ie("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 Qr(t){let e=oN(t.member.provider,t.dal),r=e===t.member.provider?t.member:{...t.member,provider:e},n=await iN({member:r});return t.dal.setMemberProviderResolved(t.member.id,e),{sessionid:n.sessionid,provider_resolved:e}}async function iN(t){let e=t.member.provider,r=t.member.sessiondir,n=uc("seed",r,e);try{let s=await nc({provider:e,cwd:r,registry:Lp()});if(!s.success)throw lN(s.error,n);if(!s.sessionId)throw new Ie("parse",0,"",n);return{sessionid:s.sessionId}}catch(s){throw s instanceof Ie?s:dc(s,n)}}async function Cp(t){return aN(t)}async function aN(t){let e=Lp(),r=uc("tokens",t.sessionid,"unresolved"),n;try{let o=await e.resolveSession(t.sessionid);if(!o)throw new Ie("parse",0,`library: sessionid "${t.sessionid}" matched no registered provider`,r);n=o.provider.name}catch(o){throw o instanceof Ie?o:dc(o,r)}let s=uc("tokens",t.sessionid,n);try{let o=await oc({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 Ie?o:dc(o,s)}}function uc(t,e,r){return["<library>",t,e,"--provider",r]}function lN(t,e){let r=t??"";if(/\bENOENT\b/i.test(r))return new Ie("enoent",null,r,e);if(/timed?\s*out/i.test(r))return new Ie("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 Ie("nonzero_exit",Number(n[1]),r,e)}return new Ie("other",null,r,e)}function dc(t,e){return t instanceof Ie?t:t instanceof Ee?t.cause?.code==="ENOENT"?new Ie("enoent",null,t.message,e):new Ie("other",null,t.message,e):t instanceof Rt?new Ie("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof Ot?new Ie("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof Ze?new Ie("other",null,t.message,e):new Ie("other",null,t instanceof Error?t.message:String(t),e)}var Ie,cc,sN,Ao=b(()=>{"use strict";wt();Ie=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"}},cc=null;sN=/^provider[123]$/});function Ro(t){return Buffer.from(t,"utf8").toString("base64url")}function Zn(t){return Buffer.from(t,"base64url").toString("utf8")}async function Mp(t,e=r=>Cp({sessionid:r})){if(process.env.LMCTL_SESSION_SIZE_DISABLED==="1")return{recorded:0,failed:0};let r=0,n=0;for(let s of cN(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 Dp(t,e,r){let n=Pp(t,e,r);if(n===null||n.member.sessionid===null)throw new Error("session member not found");if(n.member.state!=="idle")throw new zn(r,n.member.state);t.setMemberState(n.member.id,"in_chat","compacting");try{return await Zr({sessionid:n.member.sessionid,sessiondir:n.member.sessiondir,prompt:"/compact"}),t.setMemberState(n.member.id,"idle",null),{ok:!0,row:Fp(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 fc(t,e,r){let n=Pp(t,e,r);if(n===null)throw new Error("session member not found");let s=await Qr({member:n.member,dal:t});return t.updateTeamMemberSession(n.member.id,s.sessionid),{ok:!0,sessionid:s.sessionid,row:Fp(t,e,r)}}function cN(t){return t.listTeams().flatMap(e=>t.listTeamMembers(e.id).filter(r=>r.sessionid!==null).map(r=>({team_name:e.name,member:r})))}function Pp(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 Fp(t,e,r){return t.sessionSizeHistory(e,r,1)[0]??null}var zn,Oo=b(()=>{"use strict";Yn();Ao();zn=class extends Error{constructor(e,r){super(`member ${e} is currently ${r}; cannot compact while busy`),this.name="MemberBusyError"}}});async function mc(t){let e=t.dal,r=t.nowMs??Date.now(),n=t.thresholdMs??dN(e),s=r-n,o=e.query(`
|
|
1103
|
+
`):"":""}function yp(t){return t.model||t.message?.model}var Io,Ep=b(()=>{"use strict";Kt();Io=class{name="qwen";baseDir;constructor(e){this.baseDir=e?.qwenDir||Qt(ve,".qwen")}async discoverSessions(){let e=Qt(this.baseDir,"projects"),r;try{r=await vo(e)}catch{return[]}let n=[];for(let s of r){let o=Qt(e,s,"chats"),i;try{i=await vo(o)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=Qt(o,a);try{let u=await this.extractSummary(c,l);u&&n.push(u)}catch{}}}return n}async extractSummary(e,r){let n=await Me(e,30);if(n.length===0)return null;let s=await xe(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)),_p(d)){let f=wp(d).trim();f&&(l||(l=K(f,80)),c=K(f,80)),u++}if(gp(d)){let f=yp(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=hp(r,".jsonl");return this.loadFromFile(r,n)}async loadFromFile(e,r){let n=await xe(e),s="(unknown)",o,i,a,l,c,u,d=[];for await(let f of We(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(_p(f)){let h=wp(f);h.trim()&&(c||(c=K(h.trim(),80)),u=K(h.trim(),80)),d.push({role:"user",timestamp:p,content:h})}else if(gp(f)){let h=yp(f);if(h&&(o=h),Array.isArray(m.content))for(let g of m.content)g.type==="text"&&g.text?d.push({role:"assistant",timestamp:p,content:g.text,model:h}):g.type==="thinking"&&g.thinking&&d.push({role:"thinking",timestamp:p,content:g.thinking});else if(typeof m.content=="string")d.push({role:"assistant",timestamp:p,content:m.content,model:h});else if(Array.isArray(m.parts))for(let g of m.parts)if(g.thought||g.type==="thinking"){let _=g.thinking||g.text;_&&d.push({role:"thinking",timestamp:p,content:_})}else g.text&&d.push({role:"assistant",timestamp:p,content:g.text,model:h})}}return{provider:"qwen",sessionId:r,slug:l,cwd:s,createdAt:n.createdAt,modifiedAt:n.modifiedAt,model:o,cliVersion:i,gitBranch:a,startCommand:"qwen",firstUserMessage:c,lastUserMessage:u,messageCount:d.length,filePath:e,messages:d}}async resolveSessionPath(e){let r=Qt(this.baseDir,"projects");try{let n=await vo(r),s=[];for(let o of n){let i=Qt(r,o,"chats",`${e}.jsonl`);try{return await RI(i,{flag:"r"}),i}catch{continue}}for(let o of n){let i=Qt(r,o,"chats"),a;try{a=await vo(i)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;hp(l,".jsonl").startsWith(e)&&s.push(Qt(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 OI(r),!0}catch{return!1}}}});function Xl(){return new Jl}var Jl,Gl=b(()=>{"use strict";Ep();Vt();Tr();jt();Jl=class extends Ce{constructor(){super({provider:new Io,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",je,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:ho})}}});import{readdir as bp,readFile as LI,rm as Tp,stat as Sp}from"node:fs/promises";import{basename as Kl,join as Ct}from"node:path";async function CI(t){let e=await Promise.all(t.map(r=>xe(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 MI(t,e){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function kp(t){return t.type==="USER_INPUT"}function vp(t){return t.source==="MODEL"&&t.type==="PLANNER_RESPONSE"}function DI(t){return t.source==="MODEL"&&t.type!=="PLANNER_RESPONSE"}function Ip(t){if(!t)return"";let e=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(t);return e?e[1]:t}function Np(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 PI(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}async function FI(t){for await(let e of We(t)){let r=e.tool_calls?.map(s=>s.args)??[];for(let s of r){let o=UI(s);if(o)return o}let n=WI(e.content);if(n)return n}return null}function UI(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 WI(t){return t?/"Cwd":"([^"]+)"/.exec(t)?.[1]??null:null}function $p(t){if(t.endsWith(".db"))return Kl(t,".db");let e="/brain/",r=t.indexOf(e);return r===-1?null:t.slice(r+e.length).split("/")[0]||null}var No,xp=b(()=>{"use strict";Kt();No=class{name="agy";baseDir;constructor(e={}){this.baseDir=e.agyDir||Ct(ve,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:Ct(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let e=Ct(this.baseDir,"conversations"),r;try{r=await bp(e)}catch{return[]}let n=[];for(let s of r){if(!s.endsWith(".db"))continue;let o=Kl(s,".db");try{let i=await this.extractSummary(o);i&&n.push(i)}catch{}}return n}conversationPath(e){return Ct(this.baseDir,"conversations",`${e}.db`)}transcriptPath(e){return Ct(this.baseDir,"brain",e,".system_generated","logs","transcript.jsonl")}async existingTranscriptPath(e){let r=this.transcriptPath(e);try{return await Sp(r),r}catch{return null}}async extractSummary(e){let r=this.conversationPath(e),n=await this.existingTranscriptPath(e),s=n??r,o=await CI([r,n].filter(Boolean)),i=await this.resolveCwd(e,n),a,l,c,u=0;if(n){let d=await Me(n,80);for(let f of d){let m=Np(f.content);if(m&&(a=m),kp(f)){let p=Ip(f.content).trim();p&&(l||(l=K(p,80)),c=K(p,80)),u++}else vp(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=$p(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 We(o)){let d=MI(u.created_at,s.modifiedAt),f=Np(u.content);if(f&&(a=f),kp(u)){let m=Ip(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:PI(m.args),toolName:m.name||"tool"});vp(u)&&u.content?i.push({role:"assistant",timestamp:d,content:u.content,model:a}):DI(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 Sp(r),r}catch{}let n=Ct(this.baseDir,"conversations");try{let s=[];for(let o of await bp(n)){if(!o.endsWith(".db"))continue;Kl(o,".db").startsWith(e)&&s.push(Ct(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=$p(r);return n?(await Tp(this.conversationPath(n),{force:!0}),await Tp(Ct(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 FI(r);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(e){let r=Ct(this.baseDir,"cache","last_conversations.json");try{let n=JSON.parse(await LI(r,"utf8"));for(let[s,o]of Object.entries(n))if(o===e)return s}catch{}return null}}});import{spawn as BI}from"node:child_process";function Yl(t){return new Vl(t)}async function qI(t,e){let r=Date.now(),n=["--conversation",e.sessionId,"-p",t,"--dangerously-skip-permissions","--print-timeout",JI(e.timeoutMs)];e.model&&n.push("--model",e.model),Yt("agy",n,e.permissionMode??"yolo"),e.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await HI(e.binary,n,{cwd:e.cwd,env:ze(e.env,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 HI(t,e,r){return new Promise((n,s)=>{let o;try{o=BI(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 JI(t){return!t||t<=0?"8h":`${Math.max(1,Math.ceil(t/1e3))}s`}var Vl,zl=b(()=>{"use strict";xp();Vt();jt();At();qn();Vl=class extends Ce{constructor(e){super({provider:new No(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",je,"--dangerously-skip-permissions","--print-timeout","2m"],resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:qI})}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 XI}from"node:crypto";import{join as GI}from"node:path";function KI(t){return XI("sha256").update(t).digest("hex").slice(0,8)}function VI(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"session"}function YI(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 zI(t){return t.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function $o(t){return Math.max(1,Math.ceil(t.length/4))}function jp(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 ec(){return new Ql}var vr,Zl,Ql,tc=b(()=>{"use strict";vr=new Map;Zl=class{name="ClaudeMock";async discoverSessions(){return[...vr.values()].map(jp)}async loadSession(e){let r=vr.get(e);return r===void 0?null:{...jp(r),messages:r.messages.slice()}}async resolveSessionPath(e){return vr.get(e)?.filePath??null}async deleteSession(e){return vr.delete(e)}},Ql=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new Zl;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=VI(YI(e,r)),s=`mock-${n}-${KI(`${e}:${n}`)}`,o=new Date,i=vr.get(s),a=r?.prompt??"ClaudeMock seed",l=$o(a),c={sessionId:s,cwd:e,filePath:GI(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+=$o("ACK: ClaudeMock seeded"),vr.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=vr.get(r.sessionId);if(s===void 0)throw new Error(`ClaudeMock session not found: ${r.sessionId}`);let o=new Date,i=`ClaudeMock ack: ${zI(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+=$o(e),s.totalOutputTokens+=$o(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 wt(t){let e=[xl({claudeDir:t?.claudeDir}),Rl({codexDir:t?.codexDir,codeDir:t?.codeDir}),Dl({geminiDir:t?.geminiDir,claudeDir:t?.claudeDir,codexDir:t?.codexDir,codeDir:t?.codeDir}),Fl({copilotDir:t?.copilotDir}),ql(),Xl(),Yl({agyDir:t?.agyDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&e.push(ec()),e}var rc=b(()=>{"use strict";jl();Ol();Pl();Ul();Hl();Gl();zl();tc();jl();Ol();Pl();Ul();Hl();Gl();zl();tc()});var ic={};le(ic,{ProviderRegistry:()=>Wn,TransportConnectionError:()=>Ee,TransportError:()=>Ze,TransportJsonError:()=>io,TransportProcessError:()=>Rt,TransportRpcError:()=>Ot,_resetDefaultRegistryForTests:()=>ZI,chat:()=>Mt,countTokens:()=>oc,createAdapterRegistry:()=>gt,createAllAdapters:()=>wt,listSessions:()=>sc,seed:()=>nc});function jo(){return xo===null&&(xo=gt(wt())),xo}function ZI(){xo=null}function Rp(t,e){let r=t.getAdapter(e);if(!r)throw new Error(`provider "${e}" is not registered in this registry`);return r}async function Mt(t){let e=t.registry??jo(),r=Rp(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 nc(t){let e=t.registry??jo(),r=Rp(e,t.provider),n=await Ap(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};let o=await Ap(e,t.provider,t.cwd),i=QI(n,o);return i?{success:!0,sessionId:i}:{success:!0}}async function Ap(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 QI(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 sc(t={}){return(t.registry??jo()).listAll({provider:t.provider,workspace:t.workspace,limit:t.limit,from:t.from,to:t.to})}async function oc(t){let r=await(t.registry??jo()).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 xo,yt=b(()=>{"use strict";yl();rc();yl();rc();Xr();xo=null});function eN(){return ac===null&&(ac=gt(wt())),ac}async function Zr(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 rN(t)}catch(i){throw s=!0,o=i,i}finally{if(n)if(!s)zr.delete(r),e.setMemberState(r,"idle");else{let i=tN(o,r);e.setMemberState(r,i!==null?"attention_needed":"idle",i)}}}function tN(t,e){if(!(t instanceof be))return zr.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=(zr.get(e)??0)+1;return r>=3?(zr.delete(e),"consecutive_timeouts"):(zr.set(e,r),null)}return zr.delete(e),null}async function rN(t){let e=t.timeoutMs,r=typeof e=="number"&&e>0,n=eN(),s;try{let u=await n.resolveSession(t.sessionid);if(!u)return Promise.reject(new be("other",null,`library: sessionid "${t.sessionid}" matched no registered provider`,lc(t.sessionid,t.sessiondir,"unresolved")));s=u.provider.name}catch(u){return Promise.reject(new be("other",null,`library: session resolution failed: ${Op(u)}`,lc(t.sessionid,t.sessiondir,"unresolved")))}let o=lc(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 Mt({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 be("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 be("timeout",null,`library: wall-clock timeout after ${e??0}ms`,o):nN(u,o)}finally{a!==null&&clearTimeout(a)}}function lc(t,e,r){return["<library>","chat",t,e,"--provider",r]}function Op(t){return t instanceof Error?t.message:String(t)}function nN(t,e){if(t instanceof be)return t;if(t instanceof Ee){let r=t.cause;return r?.code==="ENOENT_CWD"?new be("sessiondir_missing",null,t.message,e):r?.code==="ENOENT"?new be("enoent",null,t.message,e):new be("other",null,t.message,e)}return t instanceof Rt?new be("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof Ot?new be("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof Ze?new be("other",null,t.message,e):new be("other",null,Op(t),e)}var be,ac,zr,Yn=b(()=>{"use strict";yt();be=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"}},ac=null;zr=new Map});function Lp(){return cc===null&&(cc=gt(wt())),cc}function oN(t,e){if(!sN.test(t))return t;let r=e.getConfig(`workspace.${t}`);if(r===null||r.length===0)throw new Ie("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 Qr(t){let e=oN(t.member.provider,t.dal),r=e===t.member.provider?t.member:{...t.member,provider:e},n=await iN({member:r});return t.dal.setMemberProviderResolved(t.member.id,e),{sessionid:n.sessionid,provider_resolved:e}}async function iN(t){let e=t.member.provider,r=t.member.sessiondir,n=uc("seed",r,e);try{let s=await nc({provider:e,cwd:r,registry:Lp()});if(!s.success)throw lN(s.error,n);if(!s.sessionId)throw new Ie("parse",0,"",n);return{sessionid:s.sessionId}}catch(s){throw s instanceof Ie?s:dc(s,n)}}async function Cp(t){return aN(t)}async function aN(t){let e=Lp(),r=uc("tokens",t.sessionid,"unresolved"),n;try{let o=await e.resolveSession(t.sessionid);if(!o)throw new Ie("parse",0,`library: sessionid "${t.sessionid}" matched no registered provider`,r);n=o.provider.name}catch(o){throw o instanceof Ie?o:dc(o,r)}let s=uc("tokens",t.sessionid,n);try{let o=await oc({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 Ie?o:dc(o,s)}}function uc(t,e,r){return["<library>",t,e,"--provider",r]}function lN(t,e){let r=t??"";if(/\bENOENT\b/i.test(r))return new Ie("enoent",null,r,e);if(/timed?\s*out/i.test(r))return new Ie("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 Ie("nonzero_exit",Number(n[1]),r,e)}return new Ie("other",null,r,e)}function dc(t,e){return t instanceof Ie?t:t instanceof Ee?t.cause?.code==="ENOENT"?new Ie("enoent",null,t.message,e):new Ie("other",null,t.message,e):t instanceof Rt?new Ie("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof Ot?new Ie("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof Ze?new Ie("other",null,t.message,e):new Ie("other",null,t instanceof Error?t.message:String(t),e)}var Ie,cc,sN,Ao=b(()=>{"use strict";yt();Ie=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"}},cc=null;sN=/^provider[123]$/});function Ro(t){return Buffer.from(t,"utf8").toString("base64url")}function Zn(t){return Buffer.from(t,"base64url").toString("utf8")}async function Mp(t,e=r=>Cp({sessionid:r})){if(process.env.LMCTL_SESSION_SIZE_DISABLED==="1")return{recorded:0,failed:0};let r=0,n=0;for(let s of cN(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 Dp(t,e,r){let n=Pp(t,e,r);if(n===null||n.member.sessionid===null)throw new Error("session member not found");if(n.member.state!=="idle")throw new zn(r,n.member.state);t.setMemberState(n.member.id,"in_chat","compacting");try{return await Zr({sessionid:n.member.sessionid,sessiondir:n.member.sessiondir,prompt:"/compact"}),t.setMemberState(n.member.id,"idle",null),{ok:!0,row:Fp(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 fc(t,e,r){let n=Pp(t,e,r);if(n===null)throw new Error("session member not found");let s=await Qr({member:n.member,dal:t});return t.updateTeamMemberSession(n.member.id,s.sessionid),{ok:!0,sessionid:s.sessionid,row:Fp(t,e,r)}}function cN(t){return t.listTeams().flatMap(e=>t.listTeamMembers(e.id).filter(r=>r.sessionid!==null).map(r=>({team_name:e.name,member:r})))}function Pp(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 Fp(t,e,r){return t.sessionSizeHistory(e,r,1)[0]??null}var zn,Oo=b(()=>{"use strict";Yn();Ao();zn=class extends Error{constructor(e,r){super(`member ${e} is currently ${r}; cannot compact while busy`),this.name="MemberBusyError"}}});async function mc(t){let e=t.dal,r=t.nowMs??Date.now(),n=t.thresholdMs??dN(e),s=r-n,o=e.query(`
|
|
1104
1104
|
SELECT
|
|
1105
1105
|
isess.id AS interactive_session_id,
|
|
1106
1106
|
isess.run_id,
|
|
@@ -1144,7 +1144,7 @@ ${r}`:r}function z0(t){let e=[...t.matchAll(X0)];if(e.length>0){let r=e[e.length
|
|
|
1144
1144
|
GROUP BY name
|
|
1145
1145
|
) latest ON latest.name = w.name AND latest.version = w.version
|
|
1146
1146
|
ORDER BY w.name ASC
|
|
1147
|
-
`)}function Jp(t,e={}){return e.status!==void 0?t.query("SELECT * FROM job WHERE status = ? ORDER BY priority DESC, id ASC",e.status):t.query("SELECT * FROM job ORDER BY priority DESC, id ASC LIMIT 100")}function Xp(t,e={}){if(e.pr_url!==void 0){let r=t.findSubmittedPrByUrl(e.pr_url);return r===null?[]:[r]}return t.listSubmittedPrs({status:e.status})}function Gp(t,e){return t.getSubmittedPr(e)}function Uo(t,e){return t.query("SELECT * FROM job WHERE id = ?",e)[0]??null}function en(t,e={}){return t.query("SELECT * FROM run ORDER BY id DESC LIMIT ?",e.limit??100)}function Nr(t,e){let r=t.query("SELECT * FROM run WHERE id = ?",e)[0];return r===void 0?null:{...r,job:Uo(t,r.job_id),workflow:t.query("SELECT * FROM workflow WHERE id = ?",r.workflow_id)[0]??null,team:t.getTeam(r.team_id),steps:
|
|
1147
|
+
`)}function Jp(t,e={}){return e.status!==void 0?t.query("SELECT * FROM job WHERE status = ? ORDER BY priority DESC, id ASC",e.status):t.query("SELECT * FROM job ORDER BY priority DESC, id ASC LIMIT 100")}function Xp(t,e={}){if(e.pr_url!==void 0){let r=t.findSubmittedPrByUrl(e.pr_url);return r===null?[]:[r]}return t.listSubmittedPrs({status:e.status})}function Gp(t,e){return t.getSubmittedPr(e)}function Uo(t,e){return t.query("SELECT * FROM job WHERE id = ?",e)[0]??null}function en(t,e={}){return t.query("SELECT * FROM run ORDER BY id DESC LIMIT ?",e.limit??100)}function Nr(t,e){let r=t.query("SELECT * FROM run WHERE id = ?",e)[0];return r===void 0?null:{...r,job:Uo(t,r.job_id),workflow:t.query("SELECT * FROM workflow WHERE id = ?",r.workflow_id)[0]??null,team:t.getTeam(r.team_id),steps:wN(t,r.id)}}function wN(t,e){return t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e).map(r=>({...r,artifacts:Kp(t,r.id)}))}function wc(t,e,r){let n=t.query("SELECT * FROM step WHERE run_id = ? AND id = ?",e,r)[0];return n===void 0?null:{...n,artifacts:Kp(t,n.id)}}function Kp(t,e){return t.query("SELECT * FROM step_artifact WHERE step_id = ? ORDER BY id ASC",e)}function $r(t,e,r){let n=r===void 0?"SELECT sa.*, s.state_name FROM step_artifact sa JOIN step s ON sa.step_id = s.id WHERE s.run_id = ? ORDER BY sa.id ASC":"SELECT sa.*, s.state_name FROM step_artifact sa JOIN step s ON sa.step_id = s.id WHERE s.run_id = ? AND sa.kind = ? ORDER BY sa.id ASC";return r===void 0?t.query(n,e):t.query(n,e,r)}function Vp(t,e,r){let n=wc(t,e,r);return n===null?null:(n.artifacts.find(o=>o.kind===`${n.state_name}_transcript`)??n.artifacts.find(o=>o.content!==null))?.content??null}function Yp(t,e={}){return e.type!==void 0?t.query("SELECT * FROM external_object WHERE type = ? ORDER BY id DESC",e.type):t.query("SELECT * FROM external_object ORDER BY id DESC LIMIT 100")}function zp(t,e={}){return e.unhandled===!0?t.query("SELECT * FROM external_signal WHERE handled_at IS NULL ORDER BY id DESC"):t.query("SELECT * FROM external_signal ORDER BY id DESC LIMIT 100")}function tr(t,e={}){return e.unacked===!0?t.query("SELECT * FROM attention WHERE acknowledged_at IS NULL ORDER BY id DESC"):t.query("SELECT * FROM attention ORDER BY id DESC LIMIT 100")}function Wo(t,e={}){let r=[],n="a.kind IN ('interactive_waiting_operator', 'workflow_escalation')";return e.all!==!0&&(n+=" AND a.acknowledged_at IS NULL"),e.project!==void 0&&(n+=" AND p.name = ?",r.push(e.project)),e.since!==void 0&&(n+=" AND a.created_at >= ?",r.push(e.since)),t.query(`${Zp}
|
|
1148
1148
|
WHERE ${n}
|
|
1149
1149
|
ORDER BY a.created_at DESC`,...r).map(Qp)}function Et(t,e){let n=t.query(`${Zp}
|
|
1150
1150
|
WHERE a.id = ?`,e)[0];return n===void 0?null:Qp(n)}function Qp(t){let{payload_json:e,...r}=t,n={...r,node_path:null,expected_response:null,transcript_tail:null,paused_at:null,created_run_inputs:null,workflow_version_id:null,workflow_step:null,escalation_tier:null,escalation_token:null,escalation_reason:null,declared_outcomes:null,agent_output:null};if(e==null)return n;let s;try{s=JSON.parse(e)}catch{return n}if(s===null||typeof s!="object")return n;let o=s;if(Array.isArray(o.node_path)&&o.node_path.every(i=>typeof i=="string")&&(n.node_path=o.node_path),o.expected_response!==null&&typeof o.expected_response=="object"){let i=o.expected_response;if(typeof i.kind=="string"){let a=Array.isArray(i.choices)&&i.choices.every(l=>typeof l=="string")?i.choices:null;n.expected_response={kind:i.kind,choices:a}}}if(Array.isArray(o.transcript_tail)&&o.transcript_tail.every(i=>typeof i=="string")&&(n.transcript_tail=o.transcript_tail),typeof o.paused_at=="string"&&(n.paused_at=o.paused_at),o.created_run_inputs!==null&&typeof o.created_run_inputs=="object"&&!Array.isArray(o.created_run_inputs)&&(n.created_run_inputs=o.created_run_inputs),typeof o.workflow_version_id=="number"?n.workflow_version_id=o.workflow_version_id:o.workflow_version_id===null&&(n.workflow_version_id=null),o.step!==null&&typeof o.step=="object"&&!Array.isArray(o.step)){let i=o.step;typeof i.id=="string"&&i.id.length>0&&(n.workflow_step={id:i.id,name:typeof i.name=="string"?i.name:null,type:typeof i.type=="string"?i.type:null})}return typeof o.tier=="string"&&(n.escalation_tier=o.tier),typeof o.token=="string"&&(n.escalation_token=o.token),typeof o.reason=="string"&&(n.escalation_reason=o.reason),Array.isArray(o.declared_outcomes)&&o.declared_outcomes.every(i=>typeof i=="string")&&(n.declared_outcomes=o.declared_outcomes),typeof o.agent_output=="string"&&(n.agent_output=o.agent_output),n}function eh(t){return t.query(`
|
|
@@ -1153,7 +1153,7 @@ ${r}`:r}function z0(t){let e=[...t.matchAll(X0)];if(e.length>0){let r=e[e.length
|
|
|
1153
1153
|
JOIN workflow w ON w.id = r.workflow_id
|
|
1154
1154
|
GROUP BY w.name, r.terminal_state
|
|
1155
1155
|
ORDER BY w.name ASC, r.terminal_state ASC
|
|
1156
|
-
`)}function _c(t,e){return t.query(`SELECT COUNT(*) AS count FROM ${e}`)[0]?.count??0}function Mo(t,e){return t.find(r=>r.status===e)?.count??0}function gc(t){return t.reduce((e,r)=>e+r.count,0)}function
|
|
1156
|
+
`)}function _c(t,e){return t.query(`SELECT COUNT(*) AS count FROM ${e}`)[0]?.count??0}function Mo(t,e){return t.find(r=>r.status===e)?.count??0}function gc(t){return t.reduce((e,r)=>e+r.count,0)}function yc(t,e,r){let n=r!==void 0?new Date(Date.now()-Math.trunc(r)*864e5).toISOString():null,s=[e];n!==null&&s.push(n);let o=t.query(`SELECT s.state_name, s.outcome
|
|
1157
1157
|
FROM step s
|
|
1158
1158
|
JOIN run r ON r.id = s.run_id
|
|
1159
1159
|
JOIN job j ON j.id = r.job_id
|
|
@@ -1220,9 +1220,9 @@ ${r}`:r}function z0(t){let e=[...t.matchAll(X0)];if(e.length>0){let r=e[e.length
|
|
|
1220
1220
|
json_extract(payload, '$.elapsedMs') ASC`,r),i=new Map;for(let l of o){let c=i.get(l.tool_name)??[];c.push(l.elapsed_ms),i.set(l.tool_name,c)}let a=new Map(s.map(l=>[l.tool_name,l.cnt]));return n.map(l=>{let c=a.get(l.tool_name)??0,u=i.get(l.tool_name)??[],d=u.length>0?u.reduce((p,h)=>p+h,0)/u.length:null,f=u.length>0?u[Math.floor(u.length*.5)]??null:null,m=u.length>0?u[Math.floor(u.length*.95)]??null:null;return{tool_name:l.tool_name,invocations:l.cnt,successes:c,hit_rate_pct:l.cnt>0?`${(c/l.cnt*100).toFixed(1)}%`:"0.0%",avg_latency_ms:d!==null?Math.round(d):null,p50_latency_ms:f,p95_latency_ms:m}})}function th(t){try{let e=JSON.parse(t);if(e.schema_version==="lmctl/v3"&&Array.isArray(e.steps)){let r=[],n=new Map,s=new Map;for(let o of e.steps){let i=typeof o.id=="string"?o.id:null;i!==null&&(r.push(i),typeof o.type=="string"&&s.set(i,o.type),typeof o.name=="string"&&o.name.length>0&&n.set(o.name,i))}return{schema:"v3",nodes:r,nodeTypes:s,nameToId:n}}if(e.states!==null&&typeof e.states=="object"){let r=e.states,n=new Map;for(let[l,c]of Object.entries(r))if(c!==null&&typeof c=="object"){let u=c.type;typeof u=="string"&&n.set(l,u)}let s=typeof e.start_at=="string"?e.start_at:null,o=Object.keys(r),i=s!==null&&o.includes(s)?[s,...o.filter(l=>l!==s)]:o,a=e.terminals!==null&&typeof e.terminals=="object"?Object.keys(e.terminals).map(l=>`@terminal:${l}`):[];for(let l of a)n.set(l,"Terminal");return{schema:"v2",nodes:[...i,...a],nodeTypes:n,nameToId:new Map}}}catch{}return{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map}}function tn(t,e){let r=t.query("SELECT * FROM run WHERE id = ?",e)[0];if(r===void 0)return null;let n=t.query("SELECT * FROM workflow WHERE id = ?",r.workflow_id)[0]??null,s=(()=>{let g=t.query("SELECT * FROM job WHERE id = ?",r.job_id)[0];return g===void 0?null:t.query("SELECT * FROM project WHERE id = ?",g.project_id)[0]?.name??null})(),o=n!==null?th(n.definition):{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map},i=t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e),a=g=>o.schema==="v3"&&o.nameToId.has(g)?o.nameToId.get(g):g,l=new Map;for(let g of i)l.set(a(g.state_name),g);let c=t.query(`SELECT state_name, status, last_agent_output
|
|
1221
1221
|
FROM interactive_session
|
|
1222
1222
|
WHERE run_id = ? AND status = 'waiting_operator'
|
|
1223
|
-
ORDER BY id DESC LIMIT 1`,e)[0],u=c!==void 0?a(c.state_name):null,d=u,f=c?.last_agent_output??null;if(d===null){let g=i.find(_=>_.ended_at===null);g!==void 0?d=a(g.state_name):i.length>0?d=a(i[i.length-1].state_name):d=r.current_state}r.terminal_state!==null&&(d=`@terminal:${r.terminal_state}`,f=null);let m=new Set,p=[...o.nodes];for(let g of i){let _=a(g.state_name);!o.nodes.includes(_)&&!p.includes(_)&&p.push(_)}d!==null&&!p.includes(d)&&p.push(d);let h=[];for(let g of p){if(m.has(g))continue;m.add(g);let _=g===d,S=l.get(g),E="pending",k=null;if(g.startsWith("@terminal:"))E=r.terminal_state===g.slice(10)?"done":"pending";else if(S!==void 0&&(S.ended_at===null?E=_&&u===g?"paused":"running":S.outcome===null?E="failed":E="done",S.ended_at!==null)){let x=Date.parse(S.started_at),N=Date.parse(S.ended_at);!Number.isNaN(x)&&!Number.isNaN(N)&&(k=N-x)}_&&u===g&&(E="paused"),h.push({id:g,status:E,is_current:_,elapsed_ms:k,prompt:_&&E==="paused"?f:null,expected:_&&E==="paused"?"free_text":null})}return{run_id:e,workflow_name:n?.name??null,workflow_version:n?.version??null,workflow_version_id:r.workflow_version_id,project:s,paused:r.paused_at!==null&&r.terminal_state===null,terminal_state:r.terminal_state,current_state:d,nodes:h}}function Bo(t){let e=[],r=t.workflow_name??"?",n=t.workflow_version!==null?`v${t.workflow_version}`:"v?",s=t.terminal_state!==null?`terminal:${t.terminal_state}`:t.paused?"paused":"running";e.push(`run: ${t.run_id} (${r}, ${n}) - ${s}`),t.project!==null&&e.push(`project: ${t.project}`),e.push(""),e.push("workflow tree:");for(let o of t.nodes)e.push(...
|
|
1223
|
+
ORDER BY id DESC LIMIT 1`,e)[0],u=c!==void 0?a(c.state_name):null,d=u,f=c?.last_agent_output??null;if(d===null){let g=i.find(_=>_.ended_at===null);g!==void 0?d=a(g.state_name):i.length>0?d=a(i[i.length-1].state_name):d=r.current_state}r.terminal_state!==null&&(d=`@terminal:${r.terminal_state}`,f=null);let m=new Set,p=[...o.nodes];for(let g of i){let _=a(g.state_name);!o.nodes.includes(_)&&!p.includes(_)&&p.push(_)}d!==null&&!p.includes(d)&&p.push(d);let h=[];for(let g of p){if(m.has(g))continue;m.add(g);let _=g===d,S=l.get(g),E="pending",k=null;if(g.startsWith("@terminal:"))E=r.terminal_state===g.slice(10)?"done":"pending";else if(S!==void 0&&(S.ended_at===null?E=_&&u===g?"paused":"running":S.outcome===null?E="failed":E="done",S.ended_at!==null)){let x=Date.parse(S.started_at),N=Date.parse(S.ended_at);!Number.isNaN(x)&&!Number.isNaN(N)&&(k=N-x)}_&&u===g&&(E="paused"),h.push({id:g,status:E,is_current:_,elapsed_ms:k,prompt:_&&E==="paused"?f:null,expected:_&&E==="paused"?"free_text":null})}return{run_id:e,workflow_name:n?.name??null,workflow_version:n?.version??null,workflow_version_id:r.workflow_version_id,project:s,paused:r.paused_at!==null&&r.terminal_state===null,terminal_state:r.terminal_state,current_state:d,nodes:h}}function Bo(t){let e=[],r=t.workflow_name??"?",n=t.workflow_version!==null?`v${t.workflow_version}`:"v?",s=t.terminal_state!==null?`terminal:${t.terminal_state}`:t.paused?"paused":"running";e.push(`run: ${t.run_id} (${r}, ${n}) - ${s}`),t.project!==null&&e.push(`project: ${t.project}`),e.push(""),e.push("workflow tree:");for(let o of t.nodes)e.push(...yN(o));return`${e.join(`
|
|
1224
1224
|
`)}
|
|
1225
|
-
`}function
|
|
1225
|
+
`}function yN(t){let e=[],r=EN(t.status),n=[];t.status==="done"&&t.elapsed_ms!==null?n.push(`done, ${(t.elapsed_ms/1e3).toFixed(1)}s`):t.status==="failed"?n.push("failed"):t.status==="paused"?n.push("paused, waiting for operator input"):t.status==="running"?n.push("running"):t.status==="pending"&&n.push("pending");let s=n.length>0?`(${n.join(", ")})`:"",o=t.is_current?" <- CURRENT":"",i=t.id.padEnd(28);if(e.push(` ${r} ${i} ${s}${o}`.trimEnd()),t.is_current&&t.status==="paused"&&t.prompt!==null){let a=t.prompt.split(/\r?\n/)[0]??"",l=a.length>80?`${a.slice(0,80)}...`:a;e.push(` \u2514 prompt: "${l}"`),t.expected!==null&&e.push(` \u2514 expected: ${t.expected}`)}return e}function EN(t){switch(t){case"done":return"[x]";case"failed":return"[!]";case"paused":return"[*]";case"running":return"[>]";case"pending":return"[ ]";default:return" "}}function qo(t,e,r={}){let n=r.nowMs??Date.now(),s=t.query("SELECT * FROM run WHERE id = ?",e)[0];if(s===void 0)return null;let o=t.query("SELECT * FROM workflow WHERE id = ?",s.workflow_id)[0]??null,i=s.workflow_version_id===null?null:t.query("SELECT version FROM workflow_version WHERE id = ?",s.workflow_version_id)[0]??null,a=t.query("SELECT * FROM job WHERE id = ?",s.job_id)[0]??null,l=a===null?null:t.query("SELECT * FROM project WHERE id = ?",a.project_id)[0]??null,c=o!==null?th(o.definition):{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map},u=x=>c.schema==="v3"&&c.nameToId.has(x)?c.nameToId.get(x):x,d=t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e),f=new Map;for(let x of d)f.set(u(x.state_name),x);let m=t.query("SELECT * FROM interactive_session WHERE run_id = ? ORDER BY id ASC",e),p=new Map;for(let x of m)p.set(u(x.state_name),x);let h=new Map,g=t.query("SELECT MAX(timestamp_ms) AS timestamp_ms FROM session_event WHERE run_id = ? AND step_id IS NULL",e)[0]?.timestamp_ms??null;for(let x of t.query(`SELECT step_id, MAX(timestamp_ms) AS timestamp_ms
|
|
1226
1226
|
FROM session_event
|
|
1227
1227
|
WHERE run_id = ? AND step_id IS NOT NULL
|
|
1228
1228
|
GROUP BY step_id`,e))x.step_id!==null&&h.set(x.step_id,x.timestamp_ms);let _=bN(c,d,u),S=TN(s.current_state),E=t.query(`SELECT kind, severity, payload
|
|
@@ -1258,7 +1258,7 @@ ${r}`:r}function z0(t){let e=[...t.matchAll(X0)];if(e.length>0){let r=e[e.length
|
|
|
1258
1258
|
`),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
|
|
1259
1259
|
`),2):P$(r.rest.slice(2),e);if(r.rest[0]==="run"&&r.rest[1]==="where"&&Ko(r.rest.slice(2)))return e.stdout.write(`${BN}
|
|
1260
1260
|
`),0;if(r.rest[0]==="run"&&r.rest[1]==="timeline"&&Ko(r.rest.slice(2)))return e.stdout.write(`${qN}
|
|
1261
|
-
`),0;if(r.rest[0]==="run"&&r.rest[1]==="where")return r.present?L$(r.rest.slice(2),e):C$(r.rest.slice(2),e);if(r.rest[0]==="run"&&r.rest[1]==="timeline")return r.present?M$(r.rest.slice(2),e):D$(r.rest.slice(2),e);if(r.present)return
|
|
1261
|
+
`),0;if(r.rest[0]==="run"&&r.rest[1]==="where")return r.present?L$(r.rest.slice(2),e):C$(r.rest.slice(2),e);if(r.rest[0]==="run"&&r.rest[1]==="timeline")return r.present?M$(r.rest.slice(2),e):D$(r.rest.slice(2),e);if(r.present)return y$(r.rest,e);let n=ih(t);if(typeof n=="string")return e.stderr.write(`error: ${n}
|
|
1262
1262
|
`),2;let s=xr(e),o=s.baseUrl,i=rr(n.accept,s.token),a=n.body;if(n.upload!==void 0)try{a=ZN(n.upload.filePath,n.upload.project)}catch(c){return e.stderr.write(`error: upload failed: ${c instanceof Error?c.message:String(c)}
|
|
1263
1263
|
`),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)}
|
|
1264
1264
|
`),2}if(!l.ok)return e.stderr.write(`error: HTTP ${l.status}: ${await l.text()}
|
|
@@ -1269,7 +1269,7 @@ ${r}`:r}function z0(t){let e=[...t.matchAll(X0)];if(e.length>0){let r=e[e.length
|
|
|
1269
1269
|
`):e.stdout.write(`${JSON.stringify(f)}
|
|
1270
1270
|
`)}else n.json?e.stdout.write(`${JSON.stringify(await l.json(),null,2)}
|
|
1271
1271
|
`):(e.stdout.write(await l.text()),e.stdout.write(`
|
|
1272
|
-
`));return 0}function ih(t){let e=ch(t);if(typeof e=="string")return e;let r=e.args,n=e.format!=="text",[s,...o]=r;return s===void 0?"usage: lmctl api <subcommand>":s==="status"?Go(o,"/api/status",n):s==="projects"?Go(o,"/api/projects",n):s==="teams"?Go(o,"/api/teams",n):s==="workflows"?o[0]==="verify"?l$(o.slice(1),e.format):Go(o,"/api/workflows",n):s==="workflow"?a$(o,n):s==="upload"?o$(o,n):s==="submit-job"?i$(o,n):s==="issues"?s$(o,n):s==="jobs"?Qn(o,"--status","/api/jobs","status",n):s==="job"?n$(o,n):s==="project"?c$(o,n):s==="artifact"?f$(o,n):s==="runs"?Qn(o,"--limit","/api/runs","limit",n,!0):s==="external-objects"?Qn(o,"--type","/api/external-objects","type",n):s==="external-signals"?nh(o,"--unhandled","/api/external-signals","unhandled",n):s==="attentions"||s==="attention"?o[0]==="ack"?m$(o,n):nh(o,"--unacked","/api/attentions","unacked",n):s==="stats"?p$(o,n):s==="daemon"?h$(o,n):s==="intake"?_$(o,n):s==="session"?g$(o,n):s==="run"?
|
|
1272
|
+
`));return 0}function ih(t){let e=ch(t);if(typeof e=="string")return e;let r=e.args,n=e.format!=="text",[s,...o]=r;return s===void 0?"usage: lmctl api <subcommand>":s==="status"?Go(o,"/api/status",n):s==="projects"?Go(o,"/api/projects",n):s==="teams"?Go(o,"/api/teams",n):s==="workflows"?o[0]==="verify"?l$(o.slice(1),e.format):Go(o,"/api/workflows",n):s==="workflow"?a$(o,n):s==="upload"?o$(o,n):s==="submit-job"?i$(o,n):s==="issues"?s$(o,n):s==="jobs"?Qn(o,"--status","/api/jobs","status",n):s==="job"?n$(o,n):s==="project"?c$(o,n):s==="artifact"?f$(o,n):s==="runs"?Qn(o,"--limit","/api/runs","limit",n,!0):s==="external-objects"?Qn(o,"--type","/api/external-objects","type",n):s==="external-signals"?nh(o,"--unhandled","/api/external-signals","unhandled",n):s==="attentions"||s==="attention"?o[0]==="ack"?m$(o,n):nh(o,"--unacked","/api/attentions","unacked",n):s==="stats"?p$(o,n):s==="daemon"?h$(o,n):s==="intake"?_$(o,n):s==="session"?g$(o,n):s==="run"?w$(o,e.format):s==="prs"?Qn(o,"--status","/api/submitted-prs","status",n):s==="pr"?t$(o,n):`unknown subcommand: ${s}`}function rr(t,e){let r={Accept:t};return e!==null&&e.length>0&&(r.Authorization=`Bearer ${e}`),r}function xr(t){if(t.dal!==void 0)return es(t.dal,process.env,t);let e=pe({path:ue()});try{return es(e,process.env,t)}finally{e.close()}}function es(t,e,r){let n=[],s=t.getConfig("api.url"),o;s!==null?o=s:e.LMCTL_API_URL!==void 0&&e.LMCTL_API_URL.length>0?(o=e.LMCTL_API_URL,n.push("api.url")):o=CN;let i=t.getConfig("api.token"),a;i!==null?a=i:e.LMCTL_API_TOKEN!==void 0&&e.LMCTL_API_TOKEN.length>0?(a=e.LMCTL_API_TOKEN,n.push("api.token")):a=null;for(let l of n)r.stderr.write(`note: ${PN(l)} env var read; consider \`lmctl api config set ${l} ...\` to make this DB-canonical.
|
|
1273
1273
|
`);return{baseUrl:o,token:a}}function PN(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 FN(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`usage: lmctl api config <get|set|list>
|
|
1274
1274
|
`),2;let s=e.dal===void 0,o=e.dal??pe({path:ue()});try{if(r==="get"){if(n.length!==1)return e.stderr.write(`usage: lmctl api config get <key>
|
|
1275
1275
|
`),2;let i=n[0];if(!Xo.has(i))return e.stderr.write(`error: unsupported config key: ${i} (Phase A keys: ${[...Xo].join(", ")})
|
|
@@ -1312,7 +1312,7 @@ ${r}`:r}function z0(t){let e=[...t.matchAll(X0)];if(e.length>0){let r=e[e.length
|
|
|
1312
1312
|
`),1;if(!u.ok){let f=await u.text();return e.stderr.write(`error: HTTP ${u.status}: ${f}
|
|
1313
1313
|
`),u.status===400?2:1}let d=await u.json();return r?e.stdout.write(`${JSON.stringify(d,null,2)}
|
|
1314
1314
|
`):e.stdout.write(`ok: attention ${o} acknowledged; step ${d.step_id} resumed (session_status=${String(d.session_status)})
|
|
1315
|
-
`),0}function rh(t,e,r){return t!=="api.token"||r?e:e.length<=8?"***":`${e.slice(0,8)}\u2026(masked; use --show-secrets to reveal)`}function zN(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===Lo||t===Co){let r=Number(e);if(!Number.isInteger(r)||r<=0)return`invalid ${t}: ${e}`}return null}function ZN(t,e){let r=RN(t),n=r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength),s=new FormData;return s.append("image",new Blob([n],{type:QN(t)}),ON(t)),e!==void 0&&s.append("project",e),s}function QN(t){switch(LN(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 e$(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 t$(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api pr <id|list|get>";if(r==="list")return Qn(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 ch(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 Go(t,e,r){return t.length>0?ne(t[0]):{method:"GET",path:e,accept:r?"application/json":"text/html",json:r}}function Qn(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 ne(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 nh(t,e,r,n,s){let o=!1;for(let i of t){if(i!==e)return ne(i);o=!0}return{method:"GET",path:`${r}${o?`?${n}=true`:""}`,accept:s?"application/json":"text/html",json:s}}function r$(t,e,r){if(t.length!==1)return`usage: lmctl api ${r} <id>`;let n=se(t[0],"id");return typeof n=="string"?n:{method:"GET",path:`${e}/${n}`,accept:"application/json",json:!0}}function n$(t,e){let[r,...n]=t;if(r!==void 0&&n.length===0&&r!=="enqueue"&&r!=="run")return r$([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 ne(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=bc(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=se(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 s$(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 ne(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=se(n[0],"id");return typeof s=="string"?s:{method:"GET",path:`/api/issues/${s}`,accept:"application/json",json:e}}return r==="create"?uh(n,e):r==="claim"?dh(n,e):r==="claim-next"?fh(n,e):r==="close"?mh(n,e):r==="reopen"?ph(n,e):"usage: lmctl api issues <list|show|create|claim|claim-next|close|reopen>"}function uh(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=bc(l);else if(a==="--ai-test-path")o.ai_test_path=l;else if(a==="--source-run-id"){let c=se(l,"--source-run-id");if(typeof c=="string")return c;o.source_run_id=c}else return ne(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 dh(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api issues claim <id> --assigned-run-id RUN";let s=se(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=se(l,"--assigned-run-id");if(typeof c=="string")return c;o.assigned_run_id=c}else return ne(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 fh(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=se(a,"--assigned-run-id");if(typeof l=="string")return l;s.assigned_run_id=l}else return ne(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 mh(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=se(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=se(l,"--closed-run-id");if(typeof c=="string")return c;o.closed_run_id=c}else return ne(a)}return{method:"POST",path:`/api/issues/${s}/close`,accept:"application/json",json:e,body:JSON.stringify(o)}}function ph(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api issues reopen <id> [--source-run-id RUN]";let s=se(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=se(l,"--source-run-id");if(typeof c=="string")return c;o.source_run_id=c}else return ne(a)}return{method:"POST",path:`/api/issues/${s}/reopen`,accept:"application/json",json:e,body:JSON.stringify(o)}}function o$(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 ne(i);let a=n[++o];if(a===void 0||a.startsWith("--"))return"missing value for --project";s=a}return{method:"POST",path:"/api/uploads",accept:"application/json",json:e,upload:{filePath:r,project:s}}}function i$(t,e){let r,n,s,o;for(let a=0;a<t.length;a+=1){let l=t[a],c=t[++a];if(c===void 0||c.startsWith("--"))return`missing value for ${l}`;if(l==="--workflow")r=c;else if(l==="--workflow-id-override"){let u=Number(c);if(!Number.isInteger(u)||u<=0)return`invalid --workflow-id-override: ${c}`;n=u}else if(l==="--project")s=c;else if(l==="--inputs")try{let u=JSON.parse(c);if(u===null||typeof u!="object"||Array.isArray(u))return"--inputs must be a JSON object";o=u}catch{return"invalid --inputs JSON"}else return ne(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 bc(t){try{return JSON.parse(t)}catch{return t}}function a$(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 l$(t,e){for(let r of t)if(!(r==="--json"||r==="--text"))return ne(r);return{method:"GET",path:"/api/workflows/verify",accept:e==="text"?"text/plain":"application/json",json:e!=="text"}}function c$(t,e){let[r,n,...s]=t;return r==="workflow"?u$([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 u$(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=se(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=se(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=d$(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 d$(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=bc(a);else if(i==="--priority"){let l=Number(a);if(!Number.isInteger(l))return`invalid --priority: ${a}`;s.priority=l}else return ne(i)}return{project:e,body:s}}function f$(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=se(l,"run");if(typeof c=="string")return c;r=c}else if(a==="--kind")n=l;else return ne(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 m$(t,e){if(t[0]!=="ack"||t.length!==2)return"usage: lmctl api attention ack <id>";let r=se(t[1],"id");return typeof r=="string"?r:{method:"POST",path:`/api/attentions/${r}/ack`,accept:e?"application/json":"text/html",json:e}}function p$(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 h$(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 _$(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 g$(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=Ro(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 y$(t,e){let[r,n,s,o]=t;if(r!==void 0&&/^\d+$/.test(r)&&n===void 0){let i=se(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=se(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 ne(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=se(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=se(n,"run_id");if(typeof i=="string")return i;let a=se(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=se(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 ne(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=se(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=se(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 se(t,e){return t===void 0||t.startsWith("--")?`missing value for ${e}`:!/^\d+$/.test(t)||Number(t)<=0?`invalid ${e}: ${t}`:Number(t)}function ne(t){return t.startsWith("--")?`unknown flag: ${t}`:`unknown argument: ${t}`}function hh(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 w$(t,e){let r=ch(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
1315
|
+
`),0}function rh(t,e,r){return t!=="api.token"||r?e:e.length<=8?"***":`${e.slice(0,8)}\u2026(masked; use --show-secrets to reveal)`}function zN(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===Lo||t===Co){let r=Number(e);if(!Number.isInteger(r)||r<=0)return`invalid ${t}: ${e}`}return null}function ZN(t,e){let r=RN(t),n=r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength),s=new FormData;return s.append("image",new Blob([n],{type:QN(t)}),ON(t)),e!==void 0&&s.append("project",e),s}function QN(t){switch(LN(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 e$(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 t$(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api pr <id|list|get>";if(r==="list")return Qn(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 ch(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 Go(t,e,r){return t.length>0?ne(t[0]):{method:"GET",path:e,accept:r?"application/json":"text/html",json:r}}function Qn(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 ne(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 nh(t,e,r,n,s){let o=!1;for(let i of t){if(i!==e)return ne(i);o=!0}return{method:"GET",path:`${r}${o?`?${n}=true`:""}`,accept:s?"application/json":"text/html",json:s}}function r$(t,e,r){if(t.length!==1)return`usage: lmctl api ${r} <id>`;let n=se(t[0],"id");return typeof n=="string"?n:{method:"GET",path:`${e}/${n}`,accept:"application/json",json:!0}}function n$(t,e){let[r,...n]=t;if(r!==void 0&&n.length===0&&r!=="enqueue"&&r!=="run")return r$([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 ne(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=bc(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=se(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 s$(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 ne(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=se(n[0],"id");return typeof s=="string"?s:{method:"GET",path:`/api/issues/${s}`,accept:"application/json",json:e}}return r==="create"?uh(n,e):r==="claim"?dh(n,e):r==="claim-next"?fh(n,e):r==="close"?mh(n,e):r==="reopen"?ph(n,e):"usage: lmctl api issues <list|show|create|claim|claim-next|close|reopen>"}function uh(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=bc(l);else if(a==="--ai-test-path")o.ai_test_path=l;else if(a==="--source-run-id"){let c=se(l,"--source-run-id");if(typeof c=="string")return c;o.source_run_id=c}else return ne(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 dh(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api issues claim <id> --assigned-run-id RUN";let s=se(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=se(l,"--assigned-run-id");if(typeof c=="string")return c;o.assigned_run_id=c}else return ne(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 fh(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=se(a,"--assigned-run-id");if(typeof l=="string")return l;s.assigned_run_id=l}else return ne(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 mh(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=se(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=se(l,"--closed-run-id");if(typeof c=="string")return c;o.closed_run_id=c}else return ne(a)}return{method:"POST",path:`/api/issues/${s}/close`,accept:"application/json",json:e,body:JSON.stringify(o)}}function ph(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api issues reopen <id> [--source-run-id RUN]";let s=se(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=se(l,"--source-run-id");if(typeof c=="string")return c;o.source_run_id=c}else return ne(a)}return{method:"POST",path:`/api/issues/${s}/reopen`,accept:"application/json",json:e,body:JSON.stringify(o)}}function o$(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 ne(i);let a=n[++o];if(a===void 0||a.startsWith("--"))return"missing value for --project";s=a}return{method:"POST",path:"/api/uploads",accept:"application/json",json:e,upload:{filePath:r,project:s}}}function i$(t,e){let r,n,s,o;for(let a=0;a<t.length;a+=1){let l=t[a],c=t[++a];if(c===void 0||c.startsWith("--"))return`missing value for ${l}`;if(l==="--workflow")r=c;else if(l==="--workflow-id-override"){let u=Number(c);if(!Number.isInteger(u)||u<=0)return`invalid --workflow-id-override: ${c}`;n=u}else if(l==="--project")s=c;else if(l==="--inputs")try{let u=JSON.parse(c);if(u===null||typeof u!="object"||Array.isArray(u))return"--inputs must be a JSON object";o=u}catch{return"invalid --inputs JSON"}else return ne(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 bc(t){try{return JSON.parse(t)}catch{return t}}function a$(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 l$(t,e){for(let r of t)if(!(r==="--json"||r==="--text"))return ne(r);return{method:"GET",path:"/api/workflows/verify",accept:e==="text"?"text/plain":"application/json",json:e!=="text"}}function c$(t,e){let[r,n,...s]=t;return r==="workflow"?u$([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 u$(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=se(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=se(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=d$(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 d$(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=bc(a);else if(i==="--priority"){let l=Number(a);if(!Number.isInteger(l))return`invalid --priority: ${a}`;s.priority=l}else return ne(i)}return{project:e,body:s}}function f$(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=se(l,"run");if(typeof c=="string")return c;r=c}else if(a==="--kind")n=l;else return ne(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 m$(t,e){if(t[0]!=="ack"||t.length!==2)return"usage: lmctl api attention ack <id>";let r=se(t[1],"id");return typeof r=="string"?r:{method:"POST",path:`/api/attentions/${r}/ack`,accept:e?"application/json":"text/html",json:e}}function p$(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 h$(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 _$(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 g$(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=Ro(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 w$(t,e){let[r,n,s,o]=t;if(r!==void 0&&/^\d+$/.test(r)&&n===void 0){let i=se(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=se(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 ne(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=se(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=se(n,"run_id");if(typeof i=="string")return i;let a=se(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=se(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 ne(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=se(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=se(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 se(t,e){return t===void 0||t.startsWith("--")?`missing value for ${e}`:!/^\d+$/.test(t)||Number(t)<=0?`invalid ${e}: ${t}`:Number(t)}function ne(t){return t.startsWith("--")?`unknown flag: ${t}`:`unknown argument: ${t}`}function hh(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 y$(t,e){let r=ch(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
1316
1316
|
`),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)
|
|
1317
1317
|
`),2;let a=e.dal===void 0,l=e.dal??pe({path:ue()});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)
|
|
1318
1318
|
`),2):c==="create"?E$(l,u,e,s):c==="claim"?b$(l,u,e,s):c==="claim-next"?T$(l,u,e,s):c==="close"?S$(l,u,e,s):c==="reopen"?k$(l,u,e,s):c==="list"?$$(l,u,e,s):c==="show"?x$(l,u,e,s):(e.stderr.write(`error: --direct does not support: issues ${c} (supported: list, show, create, claim, claim-next, close, reopen)
|
|
@@ -1429,7 +1429,7 @@ without an HTTP round trip.
|
|
|
1429
1429
|
|
|
1430
1430
|
Verify every workflows/*.compound.json file: load/validate the workflow graph
|
|
1431
1431
|
and report the first step that would be started. Default output is the TTY
|
|
1432
|
-
table; --json emits the structured WorkflowVerifyReport payload.`;N$=["open","assigned","closed","reopened"]});import{existsSync as
|
|
1432
|
+
table; --json emits the structured WorkflowVerifyReport payload.`;N$=["open","assigned","closed","reopened"]});import{existsSync as wh,mkdirSync as W$,readdirSync as B$,readFileSync as yh,writeFileSync as q$}from"node:fs";import{join as rn}from"node:path";import{fileURLToPath as H$}from"node:url";function ts(t){try{return J$.some(e=>wh(rn(t,e)))}catch{return!1}}function X$(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(e===null)return null;let r=e[1],n=e[2].trimStart(),s=r.match(/^name:\s*(.+)$/m),o=r.match(/^type:\s*(.+)$/m),i=r.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=o?.[1]?.trim();return!a||!l?null:{name:a,type:l,description:i?.[1]?.trim()??null,body:n}}function Vo(t,e){t.durable_memory_mode!=="db"?G$(t):K$(t,e)}function Eh(t){let e=ts(t),r;try{r=B$(Sc).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 G$(t){let e=t.local_path;if(!e){console.warn("[bootstrap] skipping: project has no local_path");return}let r=rn(e,"durable-memory");try{W$(r,{recursive:!0})}catch(o){console.error("[bootstrap] failed to create durable-memory directory:",o);return}let n=Eh(e),s=[];for(let o of n){let i=o.replace(/\.template$/,""),a=rn(r,i);if(!wh(a))try{let l=yh(rn(Sc,o),"utf8");q$(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 K$(t,e){let r=t.local_path??"",n=Eh(r),s=[];for(let o of n){let i=rn(Sc,o),a;try{a=yh(i,"utf8")}catch(c){console.error(`[bootstrap] failed to read ${o}:`,c);continue}let l=X$(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 Sc,J$,rs=b(()=>{"use strict";Sc=rn(H$(import.meta.url),"../../config/durable_memory_templates"),J$=[".git","package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","composer.json","Pipfile"]});import{existsSync as V$,mkdirSync as Y$,readdirSync as z$,readFileSync as Z$,writeFileSync as Q$}from"node:fs";import{join as Yo}from"node:path";import{fileURLToPath as ex}from"node:url";function zo(t){let e=t.local_path;if(!e){console.warn("[bootstrap] skipping ai-test: project has no local_path");return}if(!ts(e))return;let r=Yo(e,"ai-test");try{Y$(r,{recursive:!0})}catch(s){console.error("[bootstrap] failed to create ai-test directory:",s);return}let n=[];for(let s of tx()){let o=s.replace(/\.template$/,""),i=Yo(r,o);if(!V$(i))try{Q$(i,rx(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 tx(){try{return z$(bh).filter(t=>t.endsWith(".template")).sort()}catch{return["example-test.md.template","index.md.template"]}}function rx(t){try{return Z$(Yo(bh,t),"utf8")}catch{return nx(t)}}function nx(t){let e=t.replace(/\.template$/,"");return e==="index.md"?`# AI Test Suite - index
|
|
1433
1433
|
|
|
1434
1434
|
Add test chapters in this directory.
|
|
1435
1435
|
`:`---
|
|
@@ -1462,8 +1462,8 @@ ON EVERY NEW TASK:
|
|
|
1462
1462
|
2. Pull only the chapters relevant to your current task. Don't load everything.
|
|
1463
1463
|
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.
|
|
1464
1464
|
|
|
1465
|
-
Don't dump all of durable-memory into your context. The pattern is index-first, chapter-on-demand.`});function Zo(t){return sx.has(t)}function Nc(){return Ic===null&&(Ic=gt(
|
|
1466
|
-
`,"utf8"),ax(n,r)}function hx(t,e){if(kh(e)||jc(e)!=="workflows")return null;let r=e.slice(10);if(r.length===0||r.includes("/")||r.includes("\\")||r.includes(".."))return null;let n=an(t,"templates","workflows"),s=an(t,"templates",e),o=dx(n,s);return o.length===0||o.startsWith("..")||kh(o)||o.includes("/")||o.includes("\\")?null:s}function _x(t,e,r){for(let[n,s]of Object.entries(e.files)){if(r.has(n))continue;let o=hx(t,n);if(o===null){delete e.files[n];continue}if(!ns(o)){delete e.files[n];continue}try{if(xc(ti(o))!==s)continue;cx(o),delete e.files[n]}catch{}}}function ni(t={}){let e=ri(t.cwd),r=Qe(e,"templates","workflows"),n=xh(),s={basedir:e,copied:[],refreshed:[],preserved:[],shadowed:[]};try{let o=ns(n)?ix(n).filter(c=>c.endsWith(".compound.json")||c.endsWith(".lmctl")||c==="index.jsonl"):[];if(o.length===0)return s;vh(r,{recursive:!0});let i=mx(e),a=it(),l=new Set(o.map(c=>`workflows/${c}`));for(let c of o){let u=`workflows/${c}`,d=ti(Qe(n,c)),f=xc(d),m=Qe(r,c);if(!ns(m)){try{ei(m,d,{flag:"wx"}),s.copied.push(c)}catch{}i.files[u]=f;continue}let p=xc(ti(m));if(p===f){i.files[u]=f;continue}let h=i.files[u];if(h!==void 0&&p===h)ei(m,d),i.files[u]=f,s.refreshed.push(c);else{let g=Qe(r,`${c}.dist-${a}`);ei(g,d),s.preserved.push(c),s.shadowed.push(`${c}.dist-${a}`)}}_x(e,i,l),px(e,{version:a,files:i.files})}catch(o){if(t.swallow!==!0)throw o}return s}function Rc(t){let e=[],r=process.env.LMCTL_HOME;r!==void 0&&r.trim().length>0&&e.push(an(r));let n=Nh(t??process.cwd());return n!==null&&e.push(n),e.push(Qe(Ih(),Ac)),e}function si(t,e){let r=Rc(e),n=[`${t}.compound.json`,`${t}.lmctl`];for(let s of r)for(let o of n){let i=Qe(s,"templates","workflows",o);if(ns(i))return i}for(let s of n){let o=Qe(xh(),s);if(ns(o))return o}return null}var Ac,Ih,xc,jh,oi=b(()=>{"use strict";Dn();Ac=".lmctl",Ih=()=>process.env.HOME??ux(),xc=t=>ox("sha256").update(t).digest("hex");jh=".dist-manifest.json"});import{createHash as gx}from"node:crypto";import{existsSync as
|
|
1465
|
+
Don't dump all of durable-memory into your context. The pattern is index-first, chapter-on-demand.`});function Zo(t){return sx.has(t)}function Nc(){return Ic===null&&(Ic=gt(wt())),Ic}function $c(t,e,r={}){if(!Zo(t))return null;try{let n=Nc().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?uo({warn:()=>{}}):[];return[...o,...i,...Th[t]??[]]}catch{return null}}function sn(t,e){let r=$c(t,e);return r===null?null:r.join(" ")}function jr(t,e){return Nc().getSession(t,e)}async function Qo(t){return(await Nc().resolveSessions(t)).map(r=>r.provider.name)}var Th,sx,Sh,Ic,on=b(()=>{"use strict";yt();kl();Th={claude:["--dangerously-skip-permissions"],codex:["--dangerously-bypass-approvals-and-sandbox"],gemini:["-y"],copilot:["--yolo"],opencode:[],qwen:["--approval-mode","yolo"],agy:[]},sx=new Set(Object.keys(Th)),Sh=/^[\w.:-]+$/;Ic=null});import{createHash as ox}from"node:crypto";import{existsSync as ns,mkdirSync as vh,readFileSync as ti,readdirSync as ix,renameSync as ax,statSync as lx,unlinkSync as cx,writeFileSync as ei}from"node:fs";import{homedir as ux}from"node:os";import{dirname as jc,isAbsolute as kh,join as Qe,relative as dx,resolve as an}from"node:path";import{fileURLToPath as fx}from"node:url";function Nh(t){let e=an(t);for(;;){let r=Qe(e,Ac);try{if(lx(r).isDirectory())return r}catch{}let n=jc(e);if(n===e)return null;e=n}}function ri(t=process.cwd()){let e=process.env.LMCTL_HOME;if(e!==void 0&&e.trim().length>0)return an(e);let r=Nh(t);return r!==null?r:Qe(Ih(),Ac)}function $h(t){return Qe(ri(t),"templates","workflows")}function xh(){return an(jc(fx(import.meta.url)),"..","..","workflows")}function mx(t){let e=Qe(t,jh);try{let r=JSON.parse(ti(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 px(t,e){vh(t,{recursive:!0});let r=Qe(t,jh),n=`${r}.tmp-${process.pid}`;ei(n,`${JSON.stringify(e,null,2)}
|
|
1466
|
+
`,"utf8"),ax(n,r)}function hx(t,e){if(kh(e)||jc(e)!=="workflows")return null;let r=e.slice(10);if(r.length===0||r.includes("/")||r.includes("\\")||r.includes(".."))return null;let n=an(t,"templates","workflows"),s=an(t,"templates",e),o=dx(n,s);return o.length===0||o.startsWith("..")||kh(o)||o.includes("/")||o.includes("\\")?null:s}function _x(t,e,r){for(let[n,s]of Object.entries(e.files)){if(r.has(n))continue;let o=hx(t,n);if(o===null){delete e.files[n];continue}if(!ns(o)){delete e.files[n];continue}try{if(xc(ti(o))!==s)continue;cx(o),delete e.files[n]}catch{}}}function ni(t={}){let e=ri(t.cwd),r=Qe(e,"templates","workflows"),n=xh(),s={basedir:e,copied:[],refreshed:[],preserved:[],shadowed:[]};try{let o=ns(n)?ix(n).filter(c=>c.endsWith(".compound.json")||c.endsWith(".lmctl")||c==="index.jsonl"):[];if(o.length===0)return s;vh(r,{recursive:!0});let i=mx(e),a=it(),l=new Set(o.map(c=>`workflows/${c}`));for(let c of o){let u=`workflows/${c}`,d=ti(Qe(n,c)),f=xc(d),m=Qe(r,c);if(!ns(m)){try{ei(m,d,{flag:"wx"}),s.copied.push(c)}catch{}i.files[u]=f;continue}let p=xc(ti(m));if(p===f){i.files[u]=f;continue}let h=i.files[u];if(h!==void 0&&p===h)ei(m,d),i.files[u]=f,s.refreshed.push(c);else{let g=Qe(r,`${c}.dist-${a}`);ei(g,d),s.preserved.push(c),s.shadowed.push(`${c}.dist-${a}`)}}_x(e,i,l),px(e,{version:a,files:i.files})}catch(o){if(t.swallow!==!0)throw o}return s}function Rc(t){let e=[],r=process.env.LMCTL_HOME;r!==void 0&&r.trim().length>0&&e.push(an(r));let n=Nh(t??process.cwd());return n!==null&&e.push(n),e.push(Qe(Ih(),Ac)),e}function si(t,e){let r=Rc(e),n=[`${t}.compound.json`,`${t}.lmctl`];for(let s of r)for(let o of n){let i=Qe(s,"templates","workflows",o);if(ns(i))return i}for(let s of n){let o=Qe(xh(),s);if(ns(o))return o}return null}var Ac,Ih,xc,jh,oi=b(()=>{"use strict";Dn();Ac=".lmctl",Ih=()=>process.env.HOME??ux(),xc=t=>ox("sha256").update(t).digest("hex");jh=".dist-manifest.json"});import{createHash as gx}from"node:crypto";import{existsSync as wx,mkdirSync as yx,writeFileSync as Ex}from"node:fs";import{dirname as bx,join as ln}from"node:path";function nr(t){return typeof t=="string"&&t.startsWith(Ah)}function Nx(t){if(!nr(t))throw new ct(`not an lmctl:// URI: ${t}`,"malformed");let e=t.slice(Ah.length),r=e.indexOf("/");if(r<=0)throw new ct(`malformed lmctl:// URI (expected lmctl://<workflow|mcp|skill>/<name>): ${t}`,"malformed");let n=e.slice(0,r);if(!vx.has(n))throw new ct(`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 ct(`empty name in lmctl:// URI: ${t}`,"malformed");if(/[\\/]|\.\./.test(a))throw new ct(`invalid name in lmctl:// URI (no path separators): ${t}`,"malformed");return{kind:n,name:a,...o!==void 0&&o.length>0?{ref:o}:{}}}function $x(t,e,r){if(t==="workflow")return si(e,r);let n=t==="mcp"?ln("templates","mcp",`${e}.json`):ln("templates","skills",e,"SKILL.md");for(let s of Rc(r)){let o=ln(s,n);if(wx(o))return o}return null}function xx(t,e,r){let n=ln(ri(r),Sx,t);return t==="skill"?ln(n,e,"SKILL.md"):ln(n,`${e}${t==="workflow"?".compound.json":".json"}`)}function jx(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 ss(t,e){let{kind:r,name:n,ref:s}=Nx(t),o=$x(r,n,e);if(o!==null)return o;let i=`${Tx}${r}/${n}`,a;try{a=await fetch(i,{signal:AbortSignal.timeout(kx)})}catch(u){throw new ct(`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 ct(`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=Ix.exec(s);if(u!==null){let d=gx("sha256").update(l).digest("hex");if(d.toLowerCase()!==u[1].toLowerCase())throw new ct(`lmctl:// '${t}' remote artifact FAILED integrity pin (expected sha256 ${u[1]}, got ${d}) \u2014 discarded, NOT cached.`,"validation-failure")}}if(!jx(r,l))throw new ct(`lmctl:// '${t}' remote artifact failed shape validation for ${r} \u2014 discarded, NOT cached.`,"validation-failure");let c=xx(r,n,e);return yx(bx(c),{recursive:!0}),Ex(c,l,"utf8"),c}var Ah,Tx,Sx,kx,vx,ct,Ix,Oc=b(()=>{"use strict";oi();Ah="lmctl://",Tx="https://lmctl.com/templates/",Sx=".cache",kx=8e3,vx=new Set(["workflow","mcp","skill"]),ct=class extends Error{reason;constructor(e,r="malformed"){super(e),this.reason=r,this.name="LmctlUriError"}},Ix=/^(?:sha256[:-])?([0-9a-f]{64})$/i});import{existsSync as Ax,mkdirSync as Rx,readFileSync as Ox,renameSync as Lx,unlinkSync as Cx,writeFileSync as Mx}from"node:fs";import{homedir as Lh}from"node:os";import{dirname as os,join as Be,resolve as Dx}from"node:path";function Cc(){return{type:"stdio",command:"lmctl",args:["mcp"]}}function Fx(t){let e=Be(t,".mcp.json"),r=Cc();if(!Te.existsSync(e))return Te.writeFileSync(e,JSON.stringify({mcpServers:{lmctl:r}},null,2)+`
|
|
1467
1467
|
`,"utf8"),!0;let n;try{n=JSON.parse(Te.readFileSync(e,"utf8"))}catch{return!1}if(n===null||typeof n!="object"||Array.isArray(n))return!1;let s=ut(n.mcpServers)?{...n.mcpServers}:{},o=ut(s.lmctl)?s.lmctl:void 0;return o!==void 0&&o.type===r.type&&o.command===r.command&&JSON.stringify(o.args)===JSON.stringify(r.args)?!1:(s.lmctl=r,n.mcpServers=s,Te.writeFileSync(e,JSON.stringify(n,null,2)+`
|
|
1468
1468
|
`,"utf8"),!0)}function Mc(t,e){if(t==="copilot"){let n=Ux();return n.present&&Bx(e,is),n}if(t==="codex")return{scope:"codex-cli-flags",path:"codex app-server -c mcp_servers.lmctl.*",changed:!1,present:!1};let r=Be(e,".mcp.json");try{let n=Fx(e);return{scope:"workspace",path:r,changed:n,present:Rh(e)}}catch(n){return{scope:"workspace",path:r,changed:!1,present:Rh(e),error:n instanceof Error?n.message:String(n)}}}function ai(t,e,r,n,s){if(!e)return;let o=Mc(n,s);o.error!==void 0&&t.stderr.write(`warning: MCP bridge self-heal failed: ${o.error}
|
|
1469
1469
|
`),Z({event:"lead_mcp_precheck",alias:r,provider:n,cwd:s,mcp_scope:o.scope,mcp_path:o.path,mcp_present:o.present,mcp_json_exists:o.present}),!o.present&&o.scope!=="codex-cli-flags"&&t.stderr.write(`warning: Lead MCP bridge config missing after self-heal: ${o.path}
|
|
@@ -1472,24 +1472,24 @@ Don't dump all of durable-memory into your context. The pattern is index-first,
|
|
|
1472
1472
|
`)),Z({event:"mcp_cleanup",path:t,removed:[...o]})}catch{}}function Oh(t,e){return t.length>=2&&t[0]==="mcp_servers"&&t[1]===e}function Jx(t){if(!/^\s*\[/.test(t))return;let e=/^\s*\[([^\]\r\n]+)\]\s*(?:#.*)?$/.exec(t);return e===null?null:Dh(e[1])}function Xx(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 Dh(r)}function Dh(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 Lc(t){try{if(!Te.existsSync(t))return!1;let e=JSON.parse(Te.readFileSync(t,"utf8"));if(!ut(e)||!ut(e.mcpServers))return!1;let r=ut(e.mcpServers[is])?e.mcpServers[is]:void 0;return Ph(r,Cc())}catch{return!1}}function Ph(t,e){return t!==void 0&&ii(t)===ii(e)}function ii(t){return Array.isArray(t)?`[${t.map(e=>ii(e)).join(",")}]`:ut(t)?`{${Object.keys(t).sort().map(e=>`${JSON.stringify(e)}:${ii(t[e])}`).join(",")}}`:JSON.stringify(t)}function ut(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var is,sr,Px,Te,Ch,as=b(()=>{"use strict";Ne();is="lmctl",sr="lmctl0",Px={existsSync:Ax,mkdirSync:Rx,readFileSync:Ox,writeFileSync:Mx,renameSync:Lx,unlinkSync:Cx},Te=Px});import{spawnSync as Hh}from"node:child_process";import{cpSync as Fh,existsSync as Uc,mkdirSync as Jh,mkdtempSync as Gx,readFileSync as Xh,statSync as Kx,writeFileSync as Pc}from"node:fs";import{homedir as Vx,tmpdir as Yx}from"node:os";import{basename as Uh,join as et}from"node:path";function Pt(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Fc(t,e,r){if(Array.isArray(t)){for(let n of t)Fc(n,e,r);return}if(Pt(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))Fc(n,e,r)}}function ej(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(!(!Pt(a)||!Array.isArray(a.steps)))for(let l of a.steps)Pt(l)&&l.members!==void 0&&Fc(l.members,e.alias,r)}let s=o=>{let i=new Map;for(let a of o)i.set(Qx(a),a);return[...i.values()]};return{mcp:s(r.mcp),skills:s(r.skills)}}async function Gh(t,e){let r;try{r=await fetch(t,{signal:AbortSignal.timeout(zx)})}catch(s){throw new tt(e,`fetch ${t} failed: ${s.message}`)}if(!r.ok)throw new tt(e,`fetch ${t} \u2192 HTTP ${r.status}`);let n=await r.text();if(n.length>Wh)throw new tt(e,`fetched ${t} exceeds ${Wh} bytes`);return n}async function tj(t,e){if(typeof t!="string")return[t];nr(t)&&(t=await ss(t));let r;if(Wc.test(t))r=await Gh(t,e);else{if(!Uc(t))throw new tt(e,`mcp file not found: ${t}`);r=Xh(t,"utf8")}let n;try{n=JSON.parse(r)}catch{throw new tt(e,`mcp source is not JSON: ${t}`)}if(Pt(n)&&Pt(n.mcpServers))return Object.entries(n.mcpServers).map(([s,o])=>({name:s,...Pt(o)?o:{}}));if(Pt(n)&&typeof n.name=="string")return[n];throw new tt(e,`mcp source ${t} is neither {mcpServers:{\u2026}} nor a {name,\u2026} server`)}function di(t){return t.type==="http"||t.type==="sse"||t.url!==void 0&&t.command===void 0}function ui(t,e,r,n){let s=Hh(t,e,{cwd:r,encoding:"utf8",timeout:6e4});if(s.error)throw new tt(n,`spawn ${t} failed: ${s.error.message}`);if(s.status!==0)throw new tt(n,`${t} ${e.slice(0,3).join(" ")} exited ${s.status}: ${(s.stderr??"").trim().slice(0,200)}`)}function rj(t,e,r){Hh(t,e,{cwd:r,encoding:"utf8",timeout:6e4})}function nj(t,e){return t==="claude"?["mcp","remove",e,"--scope","user"]:["mcp","remove",e]}function sj(t){let e=["mcp","add"];if(di(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 oj(t){if(di(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 ij(t){let e=et(process.env.XDG_CONFIG_HOME??et(cn(),".config"),"opencode"),r=et(e,"opencode.json"),n={};if(Uc(r))try{let o=JSON.parse(Xh(r,"utf8"));Pt(o)&&(n=o)}catch{}let s=Pt(n.mcp)?{...n.mcp}:{};for(let o of t){let{name:i,...a}=o;s[i]=di(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"),Jh(e,{recursive:!0}),Pc(r,`${JSON.stringify(n,null,2)}
|
|
1473
1473
|
`,"utf8")}function aj(t,e){let r={};for(let n of t)r[n.name]=di(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{Dc(ci(cn()),r)}catch(n){throw new tt(e,`copilot MCP config install failed: ${n instanceof Error?n.message:String(n)}`)}}function lj(t){if(typeof t!="string")return t.name;let e=Uh(t.replace(/\/+$/,""));return e.toLowerCase()==="skill.md"?Uh(t.replace(/\/skill\.md$/i,"")):e}async function Bh(t,e,r){let n=lj(t),s=et(e,n);if(Jh(s,{recursive:!0}),typeof t!="string")return Pc(et(s,"SKILL.md"),t.content,"utf8"),{name:n,dir:s};if(nr(t)&&(t=await ss(t)),Wc.test(t))return Pc(et(s,"SKILL.md"),await Gh(t,r),"utf8"),{name:n,dir:s};if(!Uc(t))throw new tt(r,`skill path not found: ${t}`);return Kx(t).isDirectory()?(Fh(t,s,{recursive:!0}),{name:n,dir:s}):(Fh(t,et(s,"SKILL.md")),{name:n,dir:s})}async function fi(t){let{dal:e,member:r,stderr:n}=t,s=ej(e,r);if(s.mcp.length===0&&s.skills.length===0)return;let o=$e(r),i=r.sessiondir||process.cwd(),a=l=>{n.write(`[seed:${r.alias}] ${l}
|
|
1474
1474
|
`)};if(s.mcp.length>0){let l=[];for(let c of s.mcp)l.push(...await tj(c,r.alias));if(o==="opencode")ij(l);else if(o==="copilot")aj(l,r.alias);else if(o==="claude"||o==="gemini"||o==="qwen"||o==="agy"||o==="codex")for(let c of l)if(rj(o,nj(o,c.name),i),o==="claude"){let{name:u,...d}=c;ui("claude",["mcp","add-json",u,JSON.stringify(d),"--scope","user"],i,r.alias)}else o==="codex"?ui("codex",oj(c),i,r.alias):ui(o,sj(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(Zx.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=Gx(et(Yx(),`lmctl-skill-${r.alias}-`));for(let c of s.skills){let u=typeof c=="string"&&!Wc.test(c)?c:(await Bh(c,l,r.alias)).dir;ui(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(qh[o]!==void 0){let l=qh[o]();for(let c of s.skills)await Bh(c,l,r.alias);a(`installed ${s.skills.length} skill(s) \u2192 ${l}/<name>/SKILL.md (idempotent overwrite).`)}else a(`provider ${o} has no verified skills mechanism \u2014 ${s.skills.length} declared skill(s) NOT installed.`)}var tt,Wc,zx,Wh,Zx,Qx,cn,qh,Bc=b(()=>{"use strict";Ue();Oc();as();tt=class extends Error{alias;constructor(e,r){super(`capability install failed for ${e}: ${r}`),this.alias=e,this.name="CapabilityInstallError"}},Wc=/^https?:\/\//i,zx=8e3,Wh=1e6,Zx=new Set(["opencode"]),Qx=t=>JSON.stringify(t),cn=()=>process.env.HOME??Vx();qh={claude:()=>et(cn(),".claude","skills"),qwen:()=>et(cn(),".qwen","skills"),codex:()=>et(cn(),".codex","skills"),copilot:()=>et(cn(),".copilot","skills")}});async function L(t,e){if(t.dal!==void 0)return e(t.dal);let r=pe({path:ue()});try{return await e(r)}finally{r.close()}}function D(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 $(t,e){let r=t.flags[e];return typeof r=="string"?r:void 0}function M(t,e){return t.flags[e]===!0}function B(t,e){t.stdout.write(`${JSON.stringify(e,null,2)}
|
|
1475
|
-
`)}function
|
|
1475
|
+
`)}function w(t,e){return t.stderr.write(`error: ${e}
|
|
1476
1476
|
`),1}function me(t,e){let r=e instanceof Error?e.message:String(e);return t.stderr.write(`internal error: ${r}
|
|
1477
|
-
`),2}var Se=b(()=>{"use strict";Ue();Ye()});var Zh={};le(Zh,{defaultTeamNameForProject:()=>Nj,resolveAlias:()=>hi,resolveProject:()=>mi,resolveTeam:()=>pi,runCode:()=>dj});import{execFileSync as cj}from"node:child_process";import{basename as uj,resolve as Kh}from"node:path";import*as Hc from"node:readline";import{setTimeout as qc}from"node:timers/promises";async function dj(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r===void 0)return fj(e);if(r==="chat"&&(n.includes("--help")||n.includes("-h")))return Yh(e);if(r==="spec"&&(n.includes("--help")||n.includes("-h")))return bj(e);try{return await L(e,async s=>{switch(r){case"team":return mj(n,e,s);case"chat":return
|
|
1478
|
-
`)),0}function mj(t,e,r){let[n,...s]=t;switch(n){case"add":return pj(s,e,r);case"list":return hj(s,e,r);case"show":return _j(s,e,r);case"rm":return gj(s,e,r);default:return
|
|
1479
|
-
`),0}function hj(t,e,r){let n=D(t,["--project","--team"]);if(n.error!==void 0)return
|
|
1480
|
-
`);return 0}function _j(t,e,r){let n=D(t,["--project","--team"]);if(n.error!==void 0)return
|
|
1477
|
+
`),2}var Se=b(()=>{"use strict";Ue();Ye()});var Zh={};le(Zh,{defaultTeamNameForProject:()=>Nj,resolveAlias:()=>hi,resolveProject:()=>mi,resolveTeam:()=>pi,runCode:()=>dj});import{execFileSync as cj}from"node:child_process";import{basename as uj,resolve as Kh}from"node:path";import*as Hc from"node:readline";import{setTimeout as qc}from"node:timers/promises";async function dj(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r===void 0)return fj(e);if(r==="chat"&&(n.includes("--help")||n.includes("-h")))return Yh(e);if(r==="spec"&&(n.includes("--help")||n.includes("-h")))return bj(e);try{return await L(e,async s=>{switch(r){case"team":return mj(n,e,s);case"chat":return wj(n,e,s);case"spec":return yj(n,e,s);default:return w(e,"usage: lmctl code <team|chat|spec> ...")}})}catch(s){return me(e,s)}}function fj(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(`
|
|
1478
|
+
`)),0}function mj(t,e,r){let[n,...s]=t;switch(n){case"add":return pj(s,e,r);case"list":return hj(s,e,r);case"show":return _j(s,e,r);case"rm":return gj(s,e,r);default:return w(e,"usage: lmctl code team <add|list|show|rm>")}}function pj(t,e,r){let n=D(t,["--project","--team","--provider","--model","--role","--sessiondir"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: code team add <alias> --provider P [--model M] [--role R] [--sessiondir DIR] [--project NAME] [--team NAME] [--json]");let o=$(n,"--provider");if(o===void 0)return w(e,"code team add requires --provider");let i=un(e,r,$(n,"--project"),$(n,"--team"));if(typeof i=="number")return i;let a=r.insertTeamMember({team_id:i.team.id,alias:s,provider:o,model:$(n,"--model")??null,role:$(n,"--role")??"agent",sessiondir:$(n,"--sessiondir")??i.project.local_path});return M(n,"--json")?B(e,a):e.stdout.write(`added member ${a.alias} to ${i.team.name}
|
|
1479
|
+
`),0}function hj(t,e,r){let n=D(t,["--project","--team"]);if(n.error!==void 0)return w(e,n.error);let s=un(e,r,$(n,"--project"),$(n,"--team"));if(typeof s=="number")return s;let o=zh(r.listTeamMembers(s.team.id));if(M(n,"--json"))B(e,o);else for(let i of o)e.stdout.write(`${i.alias} ${i.role} ${$e(i)} ${i.sessionid??"(unseeded)"}
|
|
1480
|
+
`);return 0}function _j(t,e,r){let n=D(t,["--project","--team"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: code team show <alias>");let o=un(e,r,$(n,"--project"),$(n,"--team"));if(typeof o=="number")return o;let i=r.findTeamMemberByAlias(o.team.id,s);return i===null||i.state==="retired"?w(e,`member not found: ${s}`):(M(n,"--json")?B(e,i):(e.stdout.write(`member ${i.alias}
|
|
1481
1481
|
`),e.stdout.write(`role: ${i.role}
|
|
1482
1482
|
`),e.stdout.write(`provider: ${$e(i)}
|
|
1483
1483
|
`),e.stdout.write(`model: ${i.model??"(default)"}
|
|
1484
1484
|
`),e.stdout.write(`sessionid: ${i.sessionid??"(unseeded)"}
|
|
1485
1485
|
`),e.stdout.write(`sessiondir: ${i.sessiondir}
|
|
1486
|
-
`)),0)}function gj(t,e,r){let n=D(t,["--project","--team"]);if(n.error!==void 0)return
|
|
1487
|
-
`),0}async function
|
|
1486
|
+
`)),0)}function gj(t,e,r){let n=D(t,["--project","--team"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: code team rm <alias>");let o=un(e,r,$(n,"--project"),$(n,"--team"));if(typeof o=="number")return o;let i=r.findTeamMemberByAlias(o.team.id,s);if(i===null||i.state==="retired")return w(e,`member not found: ${s}`);let a=r.setMemberState(i.id,"retired","removed via code team rm");return M(n,"--json")?B(e,a):e.stdout.write(`retired member ${i.alias}
|
|
1487
|
+
`),0}async function wj(t,e,r){if(t.includes("--help")||t.includes("-h"))return Yh(e);let n=D(t,["--project","--team","--alias"]);if(n.error!==void 0)return w(e,n.error);let s=un(e,r,$(n,"--project"),$(n,"--team"));if(typeof s=="number")return s;let o=hi(e,r,s.team,$(n,"--alias"));if(typeof o=="number")return o;let i=await Ij(e,r,s.project,o);e.stdout.write(`[${i.alias}@${s.project.name}] type /help for commands
|
|
1488
1488
|
`);let a=e.stdin??process.stdin,l=Hc.createInterface({input:a,terminal:!1}),c=i;ls(e,c,s.project);try{for await(let u of l){let d=u.trim();if(d.length===0){ls(e,c,s.project);continue}if(d==="/exit")return e.stdout.write(`[bye]
|
|
1489
1489
|
`),0;if(d==="/help"){vj(e),ls(e,c,s.project);continue}if(d.startsWith("/")){e.stderr.write(`unknown command: ${d}
|
|
1490
1490
|
`),ls(e,c,s.project);continue}e.stdout.write(`[${c.alias}@${s.project.name}] (thinking...)
|
|
1491
1491
|
`);let f=await Zr({sessionid:c.sessionid,sessiondir:c.sessiondir,prompt:d,dal:r,team_member_id:c.id});e.stdout.write(`${f.text.trimEnd()}
|
|
1492
|
-
`);let m=r.findTeamMemberByAlias(s.team.id,c.alias);m!==null&&(c=m),ls(e,c,s.project)}}finally{l.close()}return 0}async function
|
|
1492
|
+
`);let m=r.findTeamMemberByAlias(s.team.id,c.alias);m!==null&&(c=m),ls(e,c,s.project)}}finally{l.close()}return 0}async function yj(t,e,r){let n=D(t,["--slug","--template","--from-requirement","--from-plan","--from-design","--project","--team"]);if(n.error!==void 0)return w(e,n.error);let s=n.positionals.join(" ").trim();if(s.length===0)return w(e,"usage: code spec <task-description> [--slug S] [--template W]");let o=un(e,r,$(n,"--project"),$(n,"--team"));if(typeof o=="number")return o;let i=$(n,"--template")??Vh,a=r.getWorkflowByName(i);if(a===null)return w(e,`workflow not found: ${i}`);let l=$(n,"--slug")??kj(s),c={task_description:s,slug:l},u=$(n,"--from-requirement"),d=$(n,"--from-plan"),f=$(n,"--from-design");u!==void 0&&(c.from_requirement=u),d!==void 0&&(c.from_plan=d),f!==void 0&&(c.from_design=f);let m=Ej(r,e),p=await cs(m,"/api/jobs","POST",{project:o.project.name,source:"code_spec",source_ref:l,payload:c,dedupe_key:`code_spec:${o.project.name}:${l}`,workflow_id_override:a.id});return e.stderr.write(`[code spec] enqueued job ${p.id} for ${o.project.name}/${l}
|
|
1493
1493
|
`),Tj(e,m,p.id)}function Ej(t,e){let r=es(t,process.env,e);return process.env.LMCTL_API_URL=r.baseUrl,r.token!==null&&r.token.length>0&&(process.env.LMCTL_API_TOKEN=r.token),r}function bj(t){return t.stdout.write(["usage: lmctl code spec <task-description> [options]","","options:"," --slug S default: slugified task description",` --template W default: ${Vh}`," --from-requirement PATH skip requirement stage"," --from-plan PATH skip plan stage"," --from-design PATH skip design stage"," --project NAME override cwd project resolution"," --team NAME override project team","","interactive commands while paused:"," /done mark current Interactive stage done"," /exit leave the run paused and exit",""].join(`
|
|
1494
1494
|
`)),0}async function Tj(t,e,r){let n=null;for(let s=0;s<1e3;s+=1){let o=await cs(e,`/api/jobs/${r}/run`,"POST");if(o.run_id!==null&&(n=o.run_id),o.status==="done")return t.stdout.write(`code spec complete: run ${o.run_id??n??"(unknown)"} terminal=${o.terminal_state??"(none)"}
|
|
1495
1495
|
`),o.terminal_state==="done"?0:1;if(o.status==="failed")return t.stderr.write(`code spec failed: run ${o.run_id??n??"(unknown)"} terminal=${o.terminal_state??"(none)"}
|
|
@@ -1500,18 +1500,18 @@ Don't dump all of durable-memory into your context. The pattern is index-first,
|
|
|
1500
1500
|
`);let a=Hc.createInterface({input:t.stdin??process.stdin,terminal:!1});try{for await(let l of a){let c=l.trim();if(c==="/exit")return t.stdout.write(`code spec paused: job ${r}, run ${n}, stage ${o}
|
|
1501
1501
|
`),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 kj(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,60);return e.length>0?e:"spec-task"}function Yh(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(`
|
|
1502
1502
|
`)),0}function vj(t){t.stderr.write(`commands: /help, /exit
|
|
1503
|
-
`)}function ls(t,e,r){t.stdout.write(`[${e.alias}@${r.name}] > `)}function mi(t,e,r){if(r!==void 0){let a=e.findProjectByName(r);return a===null?
|
|
1503
|
+
`)}function ls(t,e,r){t.stdout.write(`[${e.alias}@${r.name}] > `)}function mi(t,e,r){if(r!==void 0){let a=e.findProjectByName(r);return a===null?w(t,`project not found: ${r}`):a}let n=t.cwd??process.cwd(),s;try{s=cj("git",["rev-parse","--show-toplevel"],{cwd:n,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return w(t,"not in a git repo; use --project <name>")}let o=Kh(s),i=e.listProjects().find(a=>Kh(a.local_path)===o);return i===void 0?w(t,"no lmctl project for this directory; create via `lmctl project create` or use --project <name>"):i}function pi(t,e,r,n){if(n!==void 0){let o=e.findTeamByName(n);return o===null?w(t,`team not found: ${n}`):o}let s=e.getTeam(r.team_id);return s===null?w(t,`project ${r.name} has no assigned team; use --team <name>`):s}function hi(t,e,r,n){if(n!==void 0){let o=e.findTeamMemberByAlias(r.id,n);return o===null||o.state==="retired"?w(t,`member not found: ${n}`):o}let s=zh(e.listTeamMembers(r.id)).find(o=>o.role==="agent");return s===void 0?w(t,`team ${r.name} has no active agent member; add one with \`lmctl code team add <alias> --provider <provider>\``):s}function un(t,e,r,n){let s=mi(t,e,r);if(typeof s=="number")return s;let o=pi(t,e,s,n);return typeof o=="number"?o:{project:s,team:o}}function zh(t){return t.filter(e=>e.state!=="retired")}async function Ij(t,e,r,n){if(n.sessionid!==null&&n.sessionid.trim().length>0)return n;t.stderr.write(`[seeding ${n.alias}...]
|
|
1504
1504
|
`),Vo(r,e),zo(r);let s=await Qr({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=sn($e(o),s.sessionid);i!==null&&t.stderr.write(`[seeded ${o.alias}] customize/compact in its native TUI:
|
|
1505
1505
|
${i}
|
|
1506
1506
|
`),await fi({dal:e,member:o,stderr:t.stderr});let a=o.role_prompt??"",l=a.length>0?`${a}
|
|
1507
1507
|
|
|
1508
|
-
${nn}`:nn;return e.setMemberPromptSnapshot(o.id,l)??o}function Nj(t){return`${uj(t.local_path)}-code`}var Vh,Jc=b(()=>{"use strict";Yn();Ao();rs();kc();vc();Ue();on();Bc();Se();Tc();Vh="spec-driven-task"});import Qh from"jexl";function ir(t){Qh.compile(e_(t))}async function Ar(t,e){return Qh.eval(e_(t),e)}function e_(t){return t.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var dn=b(()=>{"use strict"});import{z as w}from"zod";function Zc(t){let e=t.trim();return e.startsWith("={{")&&e.endsWith("}}")?e.slice(3,-2).trim():t}var $j,t_,Xc,Gc,Kc,Vc,Yc,zc,r_,xj,jj,Aj,us,Rj,_i,gi,yi,wi,Ei,n_,Oj,Lj,Cj,Mj,bi,fn=b(()=>{"use strict";dn();$j=w.object({kind:w.enum(["success","neutral","failure"])}),t_=w.enum(["string","number","boolean","object","array"]),Xc=w.object({name:w.string().min(1),type:t_,required:w.boolean().optional(),default:w.unknown().optional(),description:w.string().optional()}),Gc=w.object({name:w.string().min(1),type:t_,source_step_id:w.string().min(1),source_field:w.string().min(1),description:w.string().optional()}),Kc=w.object({id:w.string().min(1),type:w.string().min(1),parameters:w.record(w.string(),w.unknown()).default({})}),Vc="__failure__",Yc=w.object({tools:w.array(w.string().min(1)).optional(),auth:w.array(w.string().min(1)).optional()}).strict().optional(),zc=w.object({on_unhandled_failure:w.object({attention_kind:w.string().min(1).default("workflow_failed"),severity:w.enum(["warn","error","critical"]).default("warn"),capture_evidence:w.boolean().default(!0),recommend_recovery:w.string().min(1).optional()}).optional(),on_unhandled_failure_state:w.string().min(1).optional()}).optional(),r_=w.object({type:w.literal("AssertRepoClean"),fail_message:w.string().min(1).optional(),next:w.string().min(1)}),xj=w.object({name:w.string().min(1),command:w.string().min(1).optional(),args:w.array(w.string()).optional(),env:w.record(w.string(),w.string()).optional(),type:w.enum(["stdio","http","sse"]).optional(),url:w.string().min(1).optional(),headers:w.record(w.string(),w.string()).optional()}).strict(),jj=w.union([w.string().min(1),xj]),Aj=w.union([w.string().min(1),w.object({name:w.string().min(1),content:w.string().min(1)}).strict()]),us=w.object({team:w.string().min(1),alias:w.string().min(1),prompt_template:w.string().optional(),mcp:w.array(jj).optional(),skills:w.array(Aj).optional()}),Rj=w.object({kind:w.literal("shell"),command:w.string().min(1),description:w.string().optional()}),_i=w.object({type:w.literal("Review"),state_name:w.string().min(1),coder:us,pre_checks:w.array(Rj).optional(),reviewers:w.array(us.extend({rubric_artifact:w.string().optional()})).optional(),outcomes:w.object({approve:w.string().min(1),request_changes:w.string().optional(),fail_pre_check:w.string().optional(),max_loops_exceeded:w.string().optional()}),writes_to_project_path:w.boolean().optional(),durable_memory_tags:w.array(w.string().min(1)).optional(),write_back_durable_memory:w.union([w.boolean(),w.string().min(1)]).optional(),max_loops:w.number().int().positive().default(5),loop_feedback_artifact:w.string().optional(),outcomes_from_stance:w.record(w.string(),w.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"})}),gi=w.object({type:w.literal("Consolidate"),state_name:w.string().min(1),researchers:w.array(us.extend({topic:w.string().min(1)})).optional(),consolidator:us,outcomes:w.object({ok:w.string().min(1),error:w.string().optional()}),research_artifact_prefix:w.string().optional(),durable_memory_tags:w.array(w.string().min(1)).optional(),write_back_durable_memory:w.union([w.boolean(),w.string().min(1)]).optional()}),yi=w.object({type:w.literal("Interactive"),state_name:w.string().min(1),agent:us.extend({initial_prompt_template:w.string().min(1)}),termination:w.object({operator_signal:w.boolean().default(!0),agent_signal:w.string().optional(),max_turns:w.number().int().positive().default(20),timeout_seconds:w.number().int().positive().optional()}),outcomes:w.object({done:w.string().min(1),timeout:w.string().optional()}),artifact_name:w.string().optional(),durable_memory_tags:w.array(w.string().min(1)).optional(),write_back_durable_memory:w.union([w.boolean(),w.string().min(1)]).optional()}),wi=w.object({type:w.literal("Loop"),state_name:w.string().min(1),over:w.string().min(1),item_var:w.string().min(1),body:w.string().min(1),outcomes:w.object({ok:w.string().min(1),error:w.string().optional()}),stop_on_error:w.boolean().default(!0),max_items:w.number().int().positive().default(1e3)}),Ei=w.object({type:w.literal("ShellStep"),state_name:w.string().min(1),command:w.string().min(1),outcomes_from_exit:w.record(w.string(),w.string().min(1)),timeout_ms:w.number().int().nonnegative().optional(),capture_output_to:w.string().optional(),writes_to_project_path:w.boolean().optional()}),n_=w.object({type:w.literal("Choice"),state_name:w.string().min(1),branches:w.array(w.object({when:w.string().min(1),next:w.string().min(1)})).default([]),default_next:w.string().min(1).optional()}).superRefine((t,e)=>{for(let[r,n]of t.branches.entries())try{ir(Zc(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}`})}}),Oj=w.discriminatedUnion("type",[r_,_i,gi,yi,wi,Ei,n_]),Lj=w.object({type:w.literal("ForEach"),state_name:w.string().min(1),items_from:w.string().min(1),mode:w.enum(["sequential","parallel"]).default("sequential"),max_concurrency:w.number().int().positive().default(1),on_item_failure:w.enum(["continue","stop"]).default("stop"),body:Oj,outcomes:w.object({all_ok:w.string().min(1),any_failed:w.string().optional()})}).superRefine((t,e)=>{try{ir(Zc(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}`})}}),Cj=w.object({type:w.literal("Subflow"),state_name:w.string().min(1),workflow_name:w.string().min(1),inputs:w.record(w.string(),w.string().min(1)).optional(),outcomes:w.record(w.string(),w.string().min(1))}).superRefine((t,e)=>{for(let[r,n]of Object.entries(t.inputs??{}))try{ir(Zc(n))}catch(s){let o=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["inputs",r],message:`invalid jexl expression: ${o}`})}}),Mj=w.discriminatedUnion("type",[r_,_i,gi,yi,wi,Ei,n_,Lj,Cj]),bi=w.object({name:w.string().min(1),version:w.number().int().positive(),definition_schema_version:w.union([w.literal(1),w.literal(2)]),description:w.string().optional(),estimated_duration_ms:w.number().int().nonnegative().optional(),primitive_version:w.union([w.literal(1),w.literal(2)]).default(1),start_at:w.string().min(1),states:w.record(w.string().min(1),Mj),terminals:w.record(w.string().min(1),$j),errors:zc,concurrency_key:w.string().min(1).optional(),concurrent_limit:w.number().int().positive().optional(),default_task_timeout_ms:w.number().int().positive().max(216e5).optional(),inputs:w.array(Xc).optional(),outputs:w.array(Gc).optional(),triggers:w.array(Kc).optional(),read_only:w.boolean().optional(),requires:Yc}).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 Q}from"zod";var Dj,Ti,Pj,Fj,Uj,bt,mn=b(()=>{"use strict";fn();Dj=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,Ti=Q.string().regex(Dj),Pj=Q.object({step_id:Ti,type:Q.literal("main"),index:Q.number().int().min(0)}),Fj=Q.record(Ti,Q.record(Q.string().min(1),Q.array(Q.array(Pj)))),Uj=Q.object({id:Ti,name:Q.string().min(1),type:Q.string().min(1),typeVersion:Q.number().int().positive().default(1),parameters:Q.record(Q.string(),Q.unknown()).default({}),members:Q.record(Q.string(),Q.unknown()).optional(),estimated_duration_ms:Q.number().int().nonnegative().optional()}),bt=Q.object({schema_version:Q.literal("lmctl/v3"),definition_schema_version:Q.literal(3),name:Q.string().min(1),version:Q.number().int().positive(),description:Q.string().optional(),estimated_duration_ms:Q.number().int().nonnegative().optional(),default_task_timeout_ms:Q.number().int().positive().max(216e5).optional(),concurrency_key:Q.string().min(1).optional(),concurrent_limit:Q.number().int().positive().optional(),errors:zc,inputs:Q.array(Xc).optional(),outputs:Q.array(Gc).optional(),steps:Q.array(Uj).min(1),connections:Fj.default({}),entry_step_id:Ti,triggers:Q.array(Kc).optional(),read_only:Q.boolean().optional(),requires:Yc}).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 Si(t){return eu(t)}function eu(t){if(Array.isArray(t))return t.map(eu);if(t===null||typeof t!="object")return t;let e=t,r={};for(let n of Object.keys(e))r[n]=eu(e[n]);if(typeof r.type=="string"){let n=Bj[r.type];n!==void 0&&(r.type=n)}return r}var Qc,Wj,Bj,tu=b(()=>{"use strict";Qc="lmctl.builtin.",Wj={Review:`${Qc}Review`,Research:`${Qc}Research`,Consolidate:`${Qc}Consolidate`},Bj=Object.fromEntries(Object.entries(Wj).map(([t,e])=>[e,t]))});import{readFileSync as qj}from"node:fs";function i_(t){return Hj(t)}function Hj(t){let e=Si(Gj(t));if(Xj(e),a_(e)===3)return Jj(e);let r=bi.safeParse(e);if(!r.success)throw new Ft({errors:r.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message}))});let n=Kj(r.data);if(n.errors.length>0||n.unresolvedRefs.length>0)throw new Ft(n);return r.data}function Jj(t){let e=bt.safeParse(t);if(!e.success)throw new Ft({errors:e.error.issues.map(r=>({path:r.path.length===0?"$":r.path.map(String).join("."),message:r.message}))});return e.data}function Xj(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return;let e=a_(t);if(!(e===null||s_.includes(e)))throw new Ft({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${e}; supported versions: ${s_.join(", ")}`}]})}function a_(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 Gj(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
|
|
1508
|
+
${nn}`:nn;return e.setMemberPromptSnapshot(o.id,l)??o}function Nj(t){return`${uj(t.local_path)}-code`}var Vh,Jc=b(()=>{"use strict";Yn();Ao();rs();kc();vc();Ue();on();Bc();Se();Tc();Vh="spec-driven-task"});import Qh from"jexl";function ir(t){Qh.compile(e_(t))}async function Ar(t,e){return Qh.eval(e_(t),e)}function e_(t){return t.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var dn=b(()=>{"use strict"});import{z as y}from"zod";function Zc(t){let e=t.trim();return e.startsWith("={{")&&e.endsWith("}}")?e.slice(3,-2).trim():t}var $j,t_,Xc,Gc,Kc,Vc,Yc,zc,r_,xj,jj,Aj,us,Rj,_i,gi,wi,yi,Ei,n_,Oj,Lj,Cj,Mj,bi,fn=b(()=>{"use strict";dn();$j=y.object({kind:y.enum(["success","neutral","failure"])}),t_=y.enum(["string","number","boolean","object","array"]),Xc=y.object({name:y.string().min(1),type:t_,required:y.boolean().optional(),default:y.unknown().optional(),description:y.string().optional()}),Gc=y.object({name:y.string().min(1),type:t_,source_step_id:y.string().min(1),source_field:y.string().min(1),description:y.string().optional()}),Kc=y.object({id:y.string().min(1),type:y.string().min(1),parameters:y.record(y.string(),y.unknown()).default({})}),Vc="__failure__",Yc=y.object({tools:y.array(y.string().min(1)).optional(),auth:y.array(y.string().min(1)).optional()}).strict().optional(),zc=y.object({on_unhandled_failure:y.object({attention_kind:y.string().min(1).default("workflow_failed"),severity:y.enum(["warn","error","critical"]).default("warn"),capture_evidence:y.boolean().default(!0),recommend_recovery:y.string().min(1).optional()}).optional(),on_unhandled_failure_state:y.string().min(1).optional()}).optional(),r_=y.object({type:y.literal("AssertRepoClean"),fail_message:y.string().min(1).optional(),next:y.string().min(1)}),xj=y.object({name:y.string().min(1),command:y.string().min(1).optional(),args:y.array(y.string()).optional(),env:y.record(y.string(),y.string()).optional(),type:y.enum(["stdio","http","sse"]).optional(),url:y.string().min(1).optional(),headers:y.record(y.string(),y.string()).optional()}).strict(),jj=y.union([y.string().min(1),xj]),Aj=y.union([y.string().min(1),y.object({name:y.string().min(1),content:y.string().min(1)}).strict()]),us=y.object({team:y.string().min(1),alias:y.string().min(1),prompt_template:y.string().optional(),mcp:y.array(jj).optional(),skills:y.array(Aj).optional()}),Rj=y.object({kind:y.literal("shell"),command:y.string().min(1),description:y.string().optional()}),_i=y.object({type:y.literal("Review"),state_name:y.string().min(1),coder:us,pre_checks:y.array(Rj).optional(),reviewers:y.array(us.extend({rubric_artifact:y.string().optional()})).optional(),outcomes:y.object({approve:y.string().min(1),request_changes:y.string().optional(),fail_pre_check:y.string().optional(),max_loops_exceeded:y.string().optional()}),writes_to_project_path:y.boolean().optional(),durable_memory_tags:y.array(y.string().min(1)).optional(),write_back_durable_memory:y.union([y.boolean(),y.string().min(1)]).optional(),max_loops:y.number().int().positive().default(5),loop_feedback_artifact:y.string().optional(),outcomes_from_stance:y.record(y.string(),y.string().min(1)).optional()}).superRefine((t,e)=>{(t.reviewers??[]).length>0&&t.outcomes_from_stance!==void 0&&e.addIssue({code:"custom",path:["outcomes_from_stance"],message:"outcomes_from_stance cannot be used when reviewers is non-empty"})}),gi=y.object({type:y.literal("Consolidate"),state_name:y.string().min(1),researchers:y.array(us.extend({topic:y.string().min(1)})).optional(),consolidator:us,outcomes:y.object({ok:y.string().min(1),error:y.string().optional()}),research_artifact_prefix:y.string().optional(),durable_memory_tags:y.array(y.string().min(1)).optional(),write_back_durable_memory:y.union([y.boolean(),y.string().min(1)]).optional()}),wi=y.object({type:y.literal("Interactive"),state_name:y.string().min(1),agent:us.extend({initial_prompt_template:y.string().min(1)}),termination:y.object({operator_signal:y.boolean().default(!0),agent_signal:y.string().optional(),max_turns:y.number().int().positive().default(20),timeout_seconds:y.number().int().positive().optional()}),outcomes:y.object({done:y.string().min(1),timeout:y.string().optional()}),artifact_name:y.string().optional(),durable_memory_tags:y.array(y.string().min(1)).optional(),write_back_durable_memory:y.union([y.boolean(),y.string().min(1)]).optional()}),yi=y.object({type:y.literal("Loop"),state_name:y.string().min(1),over:y.string().min(1),item_var:y.string().min(1),body:y.string().min(1),outcomes:y.object({ok:y.string().min(1),error:y.string().optional()}),stop_on_error:y.boolean().default(!0),max_items:y.number().int().positive().default(1e3)}),Ei=y.object({type:y.literal("ShellStep"),state_name:y.string().min(1),command:y.string().min(1),outcomes_from_exit:y.record(y.string(),y.string().min(1)),timeout_ms:y.number().int().nonnegative().optional(),capture_output_to:y.string().optional(),writes_to_project_path:y.boolean().optional()}),n_=y.object({type:y.literal("Choice"),state_name:y.string().min(1),branches:y.array(y.object({when:y.string().min(1),next:y.string().min(1)})).default([]),default_next:y.string().min(1).optional()}).superRefine((t,e)=>{for(let[r,n]of t.branches.entries())try{ir(Zc(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}`})}}),Oj=y.discriminatedUnion("type",[r_,_i,gi,wi,yi,Ei,n_]),Lj=y.object({type:y.literal("ForEach"),state_name:y.string().min(1),items_from:y.string().min(1),mode:y.enum(["sequential","parallel"]).default("sequential"),max_concurrency:y.number().int().positive().default(1),on_item_failure:y.enum(["continue","stop"]).default("stop"),body:Oj,outcomes:y.object({all_ok:y.string().min(1),any_failed:y.string().optional()})}).superRefine((t,e)=>{try{ir(Zc(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}`})}}),Cj=y.object({type:y.literal("Subflow"),state_name:y.string().min(1),workflow_name:y.string().min(1),inputs:y.record(y.string(),y.string().min(1)).optional(),outcomes:y.record(y.string(),y.string().min(1))}).superRefine((t,e)=>{for(let[r,n]of Object.entries(t.inputs??{}))try{ir(Zc(n))}catch(s){let o=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["inputs",r],message:`invalid jexl expression: ${o}`})}}),Mj=y.discriminatedUnion("type",[r_,_i,gi,wi,yi,Ei,n_,Lj,Cj]),bi=y.object({name:y.string().min(1),version:y.number().int().positive(),definition_schema_version:y.union([y.literal(1),y.literal(2)]),description:y.string().optional(),estimated_duration_ms:y.number().int().nonnegative().optional(),primitive_version:y.union([y.literal(1),y.literal(2)]).default(1),start_at:y.string().min(1),states:y.record(y.string().min(1),Mj),terminals:y.record(y.string().min(1),$j),errors:zc,concurrency_key:y.string().min(1).optional(),concurrent_limit:y.number().int().positive().optional(),default_task_timeout_ms:y.number().int().positive().max(216e5).optional(),inputs:y.array(Xc).optional(),outputs:y.array(Gc).optional(),triggers:y.array(Kc).optional(),read_only:y.boolean().optional(),requires:Yc}).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 Q}from"zod";var Dj,Ti,Pj,Fj,Uj,bt,mn=b(()=>{"use strict";fn();Dj=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,Ti=Q.string().regex(Dj),Pj=Q.object({step_id:Ti,type:Q.literal("main"),index:Q.number().int().min(0)}),Fj=Q.record(Ti,Q.record(Q.string().min(1),Q.array(Q.array(Pj)))),Uj=Q.object({id:Ti,name:Q.string().min(1),type:Q.string().min(1),typeVersion:Q.number().int().positive().default(1),parameters:Q.record(Q.string(),Q.unknown()).default({}),members:Q.record(Q.string(),Q.unknown()).optional(),estimated_duration_ms:Q.number().int().nonnegative().optional()}),bt=Q.object({schema_version:Q.literal("lmctl/v3"),definition_schema_version:Q.literal(3),name:Q.string().min(1),version:Q.number().int().positive(),description:Q.string().optional(),estimated_duration_ms:Q.number().int().nonnegative().optional(),default_task_timeout_ms:Q.number().int().positive().max(216e5).optional(),concurrency_key:Q.string().min(1).optional(),concurrent_limit:Q.number().int().positive().optional(),errors:zc,inputs:Q.array(Xc).optional(),outputs:Q.array(Gc).optional(),steps:Q.array(Uj).min(1),connections:Fj.default({}),entry_step_id:Ti,triggers:Q.array(Kc).optional(),read_only:Q.boolean().optional(),requires:Yc}).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 Si(t){return eu(t)}function eu(t){if(Array.isArray(t))return t.map(eu);if(t===null||typeof t!="object")return t;let e=t,r={};for(let n of Object.keys(e))r[n]=eu(e[n]);if(typeof r.type=="string"){let n=Bj[r.type];n!==void 0&&(r.type=n)}return r}var Qc,Wj,Bj,tu=b(()=>{"use strict";Qc="lmctl.builtin.",Wj={Review:`${Qc}Review`,Research:`${Qc}Research`,Consolidate:`${Qc}Consolidate`},Bj=Object.fromEntries(Object.entries(Wj).map(([t,e])=>[e,t]))});import{readFileSync as qj}from"node:fs";function i_(t){return Hj(t)}function Hj(t){let e=Si(Gj(t));if(Xj(e),a_(e)===3)return Jj(e);let r=bi.safeParse(e);if(!r.success)throw new Ft({errors:r.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message}))});let n=Kj(r.data);if(n.errors.length>0||n.unresolvedRefs.length>0)throw new Ft(n);return r.data}function Jj(t){let e=bt.safeParse(t);if(!e.success)throw new Ft({errors:e.error.issues.map(r=>({path:r.path.length===0?"$":r.path.map(String).join("."),message:r.message}))});return e.data}function Xj(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return;let e=a_(t);if(!(e===null||s_.includes(e)))throw new Ft({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${e}; supported versions: ${s_.join(", ")}`}]})}function a_(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 Gj(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
|
|
1509
1509
|
`)||e.startsWith("{")||e.startsWith("[")?o_(t,"$"):e.endsWith(".json")?o_(qj(e,"utf8"),e):t}function o_(t,e){try{return JSON.parse(t)}catch(r){let n=r instanceof Error?r.message:"invalid JSON";throw new Ft({errors:[{path:e,message:`invalid JSON: ${n}`}]})}}function Kj(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"}),Vj(t,n,r);for(let[s,o]of Object.entries(t.states))new Set(Object.keys(t.terminals));return{errors:e,unresolvedRefs:r}}function Vj(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 s_,Ft,l_=b(()=>{"use strict";fn();mn();tu();s_=[1,2,3],Ft=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 Yj}from"node:crypto";function c_(t,e){let r=zj(e),n=Yj("sha1").update(`${t}:${e}`).digest("hex").slice(0,4);return`s-${r}-${n}`}function zj(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"step"}var u_=b(()=>{"use strict";mn()});function eA(t,e){let r=Qj[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 p_(t){let e=[],r=(v,I)=>{throw new pn([{line:v,message:I}])},n=t.split(`
|
|
1510
|
-
`),s=[];for(let v=0;v<n.length;v+=1){let O=nA(n[v]).trim();O.length>0&&s.push({n:v+1,text:O})}s.length===0&&r(1,"empty composition: expected a `workflow <name> v<version>` header");let o=/^workflow\s+(\S+)\s+v(\d+)$/.exec(s[0].text)??r(s[0].n,`expected header \`workflow <name> v<version>\`, got: ${s[0].text}`),i=o[1],a=Number.parseInt(o[2],10),l=new Map,c=[],u=[],d=[],f,m={},p=new Map,h=new Map,g=new Map,_=(v,I,O,X,q,P)=>{l.has(v)&&r(X,`duplicate step/terminal id: ${v}`),/^[A-Za-z][\w-]*$/.test(v)||r(X,`invalid id (must start with a letter): ${v}`),l.set(v,{declId:v,type:I,params:O,line:X,isTerminal:q,...P?{members:P}:{}}),u.push(v)},S=v=>{let I=[],O=v+1;for(;O<s.length;O+=1){let X=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[O].text);if(X===null)break;I.push({label:X[1],dst:X[2]})}return{branches:I,nextIdx:O-1}};for(let v=1;v<s.length;v+=1){let{n:I,text:O}=s[v],X=O.split(/\s+/,1)[0];if(/^meta\s*\(/.test(O)){v!==1&&r(I,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let q=/^meta\s*\((.*)\)\s*$/.exec(O)??r(I,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${O}`),P=ar(q[1],I,r);for(let te of Object.keys(P))f_.has(te)||r(I,`unknown \`meta\` key \`${te}\` \u2014 only workflow-level runtime metadata is allowed: ${[...f_].join(", ")} (no grammar inflation; bounded)`);m=P;continue}if(X==="step"){let q=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(O)??r(I,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${O}`),P=q[1],te=q[2],_e=q[3],ie=d_[te];ie===void 0&&r(I,`unknown step type: ${te} (supported \`step\` archetypes: ${Object.keys(d_).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:we,members:It}=eA(ie,ar(_e,I,r));_(P,ie,we,I,!1,Object.keys(It).length>0?It:void 0);continue}if(X==="trigger"){let q=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(O)??r(I,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${O}`),P=q[1],te=q[2],_e=q[3],ie=m_[te];ie===void 0&&r(I,`unknown trigger type: ${te} (registered trigger archetypes: ${Object.keys(m_).join(", ")})`),p.has(P)&&r(I,`duplicate trigger id: ${P}`),p.set(P,{id:P,type:ie,parameters:ar(_e,I,r)});continue}if(X==="mcp"||X==="skill"){let q=new RegExp(`^${X}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(O)??r(I,`malformed \`${X}\` decl (expected \`${X} <name> = {json} | ${X} <name> = "<file|url>"\`): ${O}`),P=q[1],te=q[2].trim(),_e=X==="mcp"?h:g;_e.has(P)&&r(I,`duplicate ${X} declaration: ${P}`);let ie;if(te.startsWith("{")){let we=ar(te,I,r);X==="mcp"?ie={...we,name:P}:((typeof we.content!="string"||we.content.length===0)&&r(I,`\`skill ${P}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),ie={name:P,content:we.content})}else{let we=h_(te);(typeof we!="string"||we.length===0)&&r(I,`\`${X} ${P}\`: string form must be a non-empty file path or http(s) URL`),ie=we}_e.set(P,ie);continue}if(X==="terminal"){let q=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(O)??r(I,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${O}`);_(q[1],"lmctl/terminal",{name:q[2],kind:q[3]??"neutral"},I,!0);continue}if(X==="seq"){let P=O.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(te=>te.trim()).filter(te=>te.length>0);(P.length<3||P.length%2===0)&&r(I,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${O}`);for(let te=0;te+2<P.length+1&&!(te+2>P.length-1);te+=2){let _e=P[te],ie=P[te+1],we=P[te+2],It=ie==="->"?"main":ie.slice(1,-2);c.push({srcDeclId:_e,port:It,dstDeclId:we,line:I})}continue}if(X==="choice"){let P=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(O)??r(I,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${O}`))[1],te=[],_e,ie=v+1;for(;ie<s.length;ie+=1){let we=s[ie].text,It=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(we);if(It!==null){_e!==void 0&&r(s[ie].n,`\`choice ${P}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let Rn=It[2];te.push({when:It[1].trim(),next:`@terminal:${Rn}`}),c.push({srcDeclId:P,port:Rn,dstDeclId:It[3],line:s[ie].n});continue}let Ya=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(we);if(Ya!==null){_e!==void 0&&r(s[ie].n,`\`choice ${P}\` has more than one \`default\``);let Rn=Ya[1];_e=`@terminal:${Rn}`,c.push({srcDeclId:P,port:Rn,dstDeclId:Ya[2],line:s[ie].n});continue}break}te.length===0&&r(I,`\`choice ${P}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),_(P,"lmctl/choice",{branches:te,..._e!==void 0?{default_next:_e}:{}},I,!1),v=ie-1;continue}if(X==="loop"){let q=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(O)??r(I,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${O}`);_(q[1],"lmctl/loop",ar(q[2],I,r),I,!1);continue}if(X==="foreach"){let q=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(O)??r(I,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${O}`),P=ar(q[2],I,r);"mode"in P&&r(I,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),_(q[1],"lmctl/foreach",P,I,!1);continue}if(X==="call"){let q=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(O)??r(I,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${O}`),P=q[1],te=ar(q[2],I,r),_e=te.workflow;(typeof _e!="string"||_e.length===0)&&r(I,`\`call ${P}\` requires a \`workflow=<name>\` argument`);let{workflow:ie,...we}=te;_(P,"lmctl/subflow",{workflow_name:_e,...we},I,!1),d.push({declId:P,target:_e,line:I});continue}if(X==="decide"){let q=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(O)??r(I,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${O}`),P=q[1],te=ar(q[2],I,r),{branches:_e,nextIdx:ie}=S(v);_e.length===0&&r(I,`\`decide ${P}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),_(P,"lmctl/interactive",{termination:{operator_signal:!0}},I,!1,{agent:te});for(let we of _e)c.push({srcDeclId:P,port:we.label,dstDeclId:we.dst,line:I});v=ie;continue}if(X==="entry"){let q=/^entry\s+([A-Za-z][\w-]*)$/.exec(O)??r(I,`malformed \`entry\` (expected \`entry <id>\`): ${O}`);f!==void 0&&r(I,`duplicate \`entry\` (already set to ${f})`),f=q[1];continue}r(I,`unknown statement \`${X}\` (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 E=v=>{if(Array.isArray(v)){for(let O of v)E(O);return}if(typeof v!="object"||v===null)return;let I=v;if(typeof I.alias=="string")for(let[O,X]of[["mcp",h],["skills",g]]){let q=I[O];Array.isArray(q)&&(I[O]=q.map(P=>typeof P=="string"&&X.has(P)?structuredClone(X.get(P)):P))}for(let O of Object.values(I))E(O)};for(let v of u){let I=l.get(v);I.members!==void 0&&E(I.members)}let k=v=>c_(i,v),x=u.map(v=>{let I=l.get(v);return{id:k(v),name:v,type:I.type,typeVersion:1,parameters:I.params,...I.members?{members:I.members}:{}}}),N={};for(let v of c){l.has(v.srcDeclId)||r(v.line,`edge source references undeclared step: ${v.srcDeclId}`),l.has(v.dstDeclId)||r(v.line,`dangling edge target: ${v.dstDeclId} is not declared`),l.get(v.srcDeclId).isTerminal&&r(v.line,`terminal \`${v.srcDeclId}\` cannot have an outgoing edge`);let I=k(v.srcDeclId);N[I]??={},N[I][v.port]!==void 0&&r(v.line,`duplicate edge port \`${v.port}\` on step \`${v.srcDeclId}\``),N[I][v.port]=[[{step_id:k(v.dstDeclId),type:"main",index:0}]]}for(let v of u){let I=l.get(v);tA.has(I.type)||r(I.line,`unknown archetype \`${I.type}\` for step \`${v}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let v of d)v.target===i&&r(v.line,`subflow cycle: \`call ${v.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 A=new Map;for(let v of c){let I=A.get(v.srcDeclId);I===void 0?A.set(v.srcDeclId,[v.dstDeclId]):I.push(v.dstDeclId)}for(let v of u){let I=l.get(v);if(I.type!=="lmctl/loop")continue;let O=I.params.body;if(typeof O=="string"&&l.has(O)){let X=A.get(v);X===void 0?A.set(v,[O]):X.push(O)}}let U=new Set([f]),F=[f];for(;F.length>0;){let v=F.shift();for(let I of A.get(v)??[])U.has(I)||(U.add(I),F.push(I))}for(let v of u)U.has(v)||r(l.get(v).line,`step \`${v}\` is unreachable from entry \`${f}\``);let J=new Map;for(let v of c){let I=J.get(v.srcDeclId);I===void 0&&(I=new Set,J.set(v.srcDeclId,I)),I.add(v.port)}let R=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let v of u){let I=l.get(v);if(I.isTerminal)continue;let O=J.get(v)??new Set;if(I.type==="lmctl/review"){let q=[...O].some(P=>!R.has(P));!O.has("approve")&&!q&&r(I.line,`uncovered outcome: review step \`${v}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${v} -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 X=rA[I.type];if(X!==void 0)for(let q of X)O.has(q)||r(I.line,`uncovered outcome: required outcome \`${q}\` of step \`${v}\` (\`${I.type}\`) has no connection \u2014 route it (\`seq ${v} -${q}-> <target|terminal>\`)`);else O.size===0&&r(I.line,`uncovered outcome: non-terminal step \`${v}\` (\`${I.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let v of u){let I=l.get(v),O=Zj[I.type];if(O===void 0)continue;let X={...I.params,...I.members??{},type:O.v2type,state_name:v,...Object.keys(O.outcomes).length>0?{outcomes:O.outcomes}:{}},q=O.schema.safeParse(X);if(!q.success){let P=q.error.issues[0],te=P.path.length===0?"$":P.path.map(String).join(".");r(I.line,`step \`${v}\` (\`${I.type}\`) has invalid params for archetype \`${O.v2type}\` at \`${te}\`: ${P.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${v} = ${I.type.replace("lmctl/","")}({ ... })\``)}}let W={schema_version:"lmctl/v3",definition_schema_version:3,name:i,version:a,...m,...p.size>0?{triggers:[...p.values()]}:{},steps:x,connections:N,entry_step_id:k(f)},z=bt.safeParse(W);if(!z.success)throw new pn(z.error.issues.map(v=>({line:s[0].n,message:`emitted V3 invalid at ${v.path.length===0?"$":v.path.map(String).join(".")}: ${v.message}`})));return z.data}function nA(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 ar(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 sA(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]=h_(l)}return s}function sA(t){return t.split(",").map(e=>e.trim()).filter(e=>e.length>0)}function h_(t){return t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'")?t.slice(1,-1):t==="true"?!0:t==="false"?!1:/^-?\d+$/.test(t)?Number.parseInt(t,10):/^-?\d*\.\d+$/.test(t)?Number.parseFloat(t):t}var Zj,Qj,d_,pn,tA,rA,f_,m_,__=b(()=>{"use strict";mn();u_();fn();Zj={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:_i},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:gi},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:yi},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:wi},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:Ei}},Qj={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};d_={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"},pn=class extends Error{issues;constructor(e){super(`composition DSL compile failed:
|
|
1510
|
+
`),s=[];for(let v=0;v<n.length;v+=1){let O=nA(n[v]).trim();O.length>0&&s.push({n:v+1,text:O})}s.length===0&&r(1,"empty composition: expected a `workflow <name> v<version>` header");let o=/^workflow\s+(\S+)\s+v(\d+)$/.exec(s[0].text)??r(s[0].n,`expected header \`workflow <name> v<version>\`, got: ${s[0].text}`),i=o[1],a=Number.parseInt(o[2],10),l=new Map,c=[],u=[],d=[],f,m={},p=new Map,h=new Map,g=new Map,_=(v,I,O,X,q,P)=>{l.has(v)&&r(X,`duplicate step/terminal id: ${v}`),/^[A-Za-z][\w-]*$/.test(v)||r(X,`invalid id (must start with a letter): ${v}`),l.set(v,{declId:v,type:I,params:O,line:X,isTerminal:q,...P?{members:P}:{}}),u.push(v)},S=v=>{let I=[],O=v+1;for(;O<s.length;O+=1){let X=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[O].text);if(X===null)break;I.push({label:X[1],dst:X[2]})}return{branches:I,nextIdx:O-1}};for(let v=1;v<s.length;v+=1){let{n:I,text:O}=s[v],X=O.split(/\s+/,1)[0];if(/^meta\s*\(/.test(O)){v!==1&&r(I,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let q=/^meta\s*\((.*)\)\s*$/.exec(O)??r(I,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${O}`),P=ar(q[1],I,r);for(let te of Object.keys(P))f_.has(te)||r(I,`unknown \`meta\` key \`${te}\` \u2014 only workflow-level runtime metadata is allowed: ${[...f_].join(", ")} (no grammar inflation; bounded)`);m=P;continue}if(X==="step"){let q=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(O)??r(I,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${O}`),P=q[1],te=q[2],_e=q[3],ie=d_[te];ie===void 0&&r(I,`unknown step type: ${te} (supported \`step\` archetypes: ${Object.keys(d_).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:ye,members:It}=eA(ie,ar(_e,I,r));_(P,ie,ye,I,!1,Object.keys(It).length>0?It:void 0);continue}if(X==="trigger"){let q=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(O)??r(I,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${O}`),P=q[1],te=q[2],_e=q[3],ie=m_[te];ie===void 0&&r(I,`unknown trigger type: ${te} (registered trigger archetypes: ${Object.keys(m_).join(", ")})`),p.has(P)&&r(I,`duplicate trigger id: ${P}`),p.set(P,{id:P,type:ie,parameters:ar(_e,I,r)});continue}if(X==="mcp"||X==="skill"){let q=new RegExp(`^${X}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(O)??r(I,`malformed \`${X}\` decl (expected \`${X} <name> = {json} | ${X} <name> = "<file|url>"\`): ${O}`),P=q[1],te=q[2].trim(),_e=X==="mcp"?h:g;_e.has(P)&&r(I,`duplicate ${X} declaration: ${P}`);let ie;if(te.startsWith("{")){let ye=ar(te,I,r);X==="mcp"?ie={...ye,name:P}:((typeof ye.content!="string"||ye.content.length===0)&&r(I,`\`skill ${P}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),ie={name:P,content:ye.content})}else{let ye=h_(te);(typeof ye!="string"||ye.length===0)&&r(I,`\`${X} ${P}\`: string form must be a non-empty file path or http(s) URL`),ie=ye}_e.set(P,ie);continue}if(X==="terminal"){let q=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(O)??r(I,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${O}`);_(q[1],"lmctl/terminal",{name:q[2],kind:q[3]??"neutral"},I,!0);continue}if(X==="seq"){let P=O.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(te=>te.trim()).filter(te=>te.length>0);(P.length<3||P.length%2===0)&&r(I,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${O}`);for(let te=0;te+2<P.length+1&&!(te+2>P.length-1);te+=2){let _e=P[te],ie=P[te+1],ye=P[te+2],It=ie==="->"?"main":ie.slice(1,-2);c.push({srcDeclId:_e,port:It,dstDeclId:ye,line:I})}continue}if(X==="choice"){let P=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(O)??r(I,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${O}`))[1],te=[],_e,ie=v+1;for(;ie<s.length;ie+=1){let ye=s[ie].text,It=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(ye);if(It!==null){_e!==void 0&&r(s[ie].n,`\`choice ${P}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let Rn=It[2];te.push({when:It[1].trim(),next:`@terminal:${Rn}`}),c.push({srcDeclId:P,port:Rn,dstDeclId:It[3],line:s[ie].n});continue}let Ya=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(ye);if(Ya!==null){_e!==void 0&&r(s[ie].n,`\`choice ${P}\` has more than one \`default\``);let Rn=Ya[1];_e=`@terminal:${Rn}`,c.push({srcDeclId:P,port:Rn,dstDeclId:Ya[2],line:s[ie].n});continue}break}te.length===0&&r(I,`\`choice ${P}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),_(P,"lmctl/choice",{branches:te,..._e!==void 0?{default_next:_e}:{}},I,!1),v=ie-1;continue}if(X==="loop"){let q=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(O)??r(I,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${O}`);_(q[1],"lmctl/loop",ar(q[2],I,r),I,!1);continue}if(X==="foreach"){let q=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(O)??r(I,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${O}`),P=ar(q[2],I,r);"mode"in P&&r(I,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),_(q[1],"lmctl/foreach",P,I,!1);continue}if(X==="call"){let q=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(O)??r(I,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${O}`),P=q[1],te=ar(q[2],I,r),_e=te.workflow;(typeof _e!="string"||_e.length===0)&&r(I,`\`call ${P}\` requires a \`workflow=<name>\` argument`);let{workflow:ie,...ye}=te;_(P,"lmctl/subflow",{workflow_name:_e,...ye},I,!1),d.push({declId:P,target:_e,line:I});continue}if(X==="decide"){let q=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(O)??r(I,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${O}`),P=q[1],te=ar(q[2],I,r),{branches:_e,nextIdx:ie}=S(v);_e.length===0&&r(I,`\`decide ${P}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),_(P,"lmctl/interactive",{termination:{operator_signal:!0}},I,!1,{agent:te});for(let ye of _e)c.push({srcDeclId:P,port:ye.label,dstDeclId:ye.dst,line:I});v=ie;continue}if(X==="entry"){let q=/^entry\s+([A-Za-z][\w-]*)$/.exec(O)??r(I,`malformed \`entry\` (expected \`entry <id>\`): ${O}`);f!==void 0&&r(I,`duplicate \`entry\` (already set to ${f})`),f=q[1];continue}r(I,`unknown statement \`${X}\` (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 E=v=>{if(Array.isArray(v)){for(let O of v)E(O);return}if(typeof v!="object"||v===null)return;let I=v;if(typeof I.alias=="string")for(let[O,X]of[["mcp",h],["skills",g]]){let q=I[O];Array.isArray(q)&&(I[O]=q.map(P=>typeof P=="string"&&X.has(P)?structuredClone(X.get(P)):P))}for(let O of Object.values(I))E(O)};for(let v of u){let I=l.get(v);I.members!==void 0&&E(I.members)}let k=v=>c_(i,v),x=u.map(v=>{let I=l.get(v);return{id:k(v),name:v,type:I.type,typeVersion:1,parameters:I.params,...I.members?{members:I.members}:{}}}),N={};for(let v of c){l.has(v.srcDeclId)||r(v.line,`edge source references undeclared step: ${v.srcDeclId}`),l.has(v.dstDeclId)||r(v.line,`dangling edge target: ${v.dstDeclId} is not declared`),l.get(v.srcDeclId).isTerminal&&r(v.line,`terminal \`${v.srcDeclId}\` cannot have an outgoing edge`);let I=k(v.srcDeclId);N[I]??={},N[I][v.port]!==void 0&&r(v.line,`duplicate edge port \`${v.port}\` on step \`${v.srcDeclId}\``),N[I][v.port]=[[{step_id:k(v.dstDeclId),type:"main",index:0}]]}for(let v of u){let I=l.get(v);tA.has(I.type)||r(I.line,`unknown archetype \`${I.type}\` for step \`${v}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let v of d)v.target===i&&r(v.line,`subflow cycle: \`call ${v.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 A=new Map;for(let v of c){let I=A.get(v.srcDeclId);I===void 0?A.set(v.srcDeclId,[v.dstDeclId]):I.push(v.dstDeclId)}for(let v of u){let I=l.get(v);if(I.type!=="lmctl/loop")continue;let O=I.params.body;if(typeof O=="string"&&l.has(O)){let X=A.get(v);X===void 0?A.set(v,[O]):X.push(O)}}let U=new Set([f]),F=[f];for(;F.length>0;){let v=F.shift();for(let I of A.get(v)??[])U.has(I)||(U.add(I),F.push(I))}for(let v of u)U.has(v)||r(l.get(v).line,`step \`${v}\` is unreachable from entry \`${f}\``);let J=new Map;for(let v of c){let I=J.get(v.srcDeclId);I===void 0&&(I=new Set,J.set(v.srcDeclId,I)),I.add(v.port)}let R=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let v of u){let I=l.get(v);if(I.isTerminal)continue;let O=J.get(v)??new Set;if(I.type==="lmctl/review"){let q=[...O].some(P=>!R.has(P));!O.has("approve")&&!q&&r(I.line,`uncovered outcome: review step \`${v}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${v} -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 X=rA[I.type];if(X!==void 0)for(let q of X)O.has(q)||r(I.line,`uncovered outcome: required outcome \`${q}\` of step \`${v}\` (\`${I.type}\`) has no connection \u2014 route it (\`seq ${v} -${q}-> <target|terminal>\`)`);else O.size===0&&r(I.line,`uncovered outcome: non-terminal step \`${v}\` (\`${I.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let v of u){let I=l.get(v),O=Zj[I.type];if(O===void 0)continue;let X={...I.params,...I.members??{},type:O.v2type,state_name:v,...Object.keys(O.outcomes).length>0?{outcomes:O.outcomes}:{}},q=O.schema.safeParse(X);if(!q.success){let P=q.error.issues[0],te=P.path.length===0?"$":P.path.map(String).join(".");r(I.line,`step \`${v}\` (\`${I.type}\`) has invalid params for archetype \`${O.v2type}\` at \`${te}\`: ${P.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${v} = ${I.type.replace("lmctl/","")}({ ... })\``)}}let W={schema_version:"lmctl/v3",definition_schema_version:3,name:i,version:a,...m,...p.size>0?{triggers:[...p.values()]}:{},steps:x,connections:N,entry_step_id:k(f)},z=bt.safeParse(W);if(!z.success)throw new pn(z.error.issues.map(v=>({line:s[0].n,message:`emitted V3 invalid at ${v.path.length===0?"$":v.path.map(String).join(".")}: ${v.message}`})));return z.data}function nA(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 ar(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 sA(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]=h_(l)}return s}function sA(t){return t.split(",").map(e=>e.trim()).filter(e=>e.length>0)}function h_(t){return t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'")?t.slice(1,-1):t==="true"?!0:t==="false"?!1:/^-?\d+$/.test(t)?Number.parseInt(t,10):/^-?\d*\.\d+$/.test(t)?Number.parseFloat(t):t}var Zj,Qj,d_,pn,tA,rA,f_,m_,__=b(()=>{"use strict";mn();u_();fn();Zj={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:_i},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:gi},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:wi},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:yi},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:Ei}},Qj={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};d_={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"},pn=class extends Error{issues;constructor(e){super(`composition DSL compile failed:
|
|
1511
1511
|
${e.map(r=>` line ${r.line}: ${r.message}`).join(`
|
|
1512
1512
|
`)}`),this.issues=e,this.name="DslCompileError"}},tA=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"]),rA={"lmctl/consolidate":["ok"],"lmctl/interactive":["done"],"lmctl/loop":["ok"],"lmctl/foreach":["all_ok"]},f_=new Set(["requires","default_task_timeout_ms","errors","concurrency_key","concurrent_limit"]),m_={"trigger-schedule":"lmctl/trigger-schedule","trigger-gh-issue":"lmctl/trigger-gh-issue"}});import{readFileSync as oA}from"node:fs";function iA(){let t=process.env.LMCTL_DSL;return t===void 0?!0:!["0","false","off"].includes(t.trim().toLowerCase())}function aA(t){for(let e of t.split(`
|
|
1513
1513
|
`)){let r=e.replace(/#.*/,"").trim();if(r.length!==0)return/^workflow\s+\S+\s+v\d+\s*$/.test(r)}return!1}function De(t){if(typeof t=="string"&&iA()&&aA(t)){let r;try{r=p_(t)}catch(s){throw s instanceof pn?new Ut(s.issues.map(o=>({path:`dsl:${o.line}`,message:o.message}))):s}let n=bt.safeParse(r);if(!n.success)throw new Ut(n.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));return n.data}let e=Si(cA(t));if(uA(e)&&e.definition_schema_version===3){let r=bt.safeParse(e);if(!r.success)throw new Ut(r.error.issues.map(n=>({path:n.path.length===0?"$":n.path.map(String).join("."),message:n.message})));return r.data}return lA(e)}function lA(t){let e=bi.safeParse(t);if(!e.success)throw new Ut(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 Ut([{path:`states.${s}`,message:`v2 workflows (primitive_version: 2) may not use v1 primitive type: ${o.type}`}]);try{return i_(r)}catch(s){throw s instanceof Ft?new ru(s):s}}function cA(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
|
|
1514
|
-
`)||e.startsWith("{")||e.startsWith("[")?g_(t):e.endsWith(".json")?g_(oA(e,"utf8")):t}function g_(t){return JSON.parse(t)}function uA(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var ru,Ut,hn=b(()=>{"use strict";fn();l_();tu();mn();__();ru=class extends Error{causeError;constructor(e){super("compiler emitted invalid atomic workflow"),this.causeError=e,this.name="CompilerInvariantError"}},Ut=class extends Error{issues;constructor(e){super("compound workflow validation failed"),this.issues=e,this.name="CompilerValidationError"}}});function ki(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:dA(r,{job:{id:t.job.id,kind:t.job.source,source:t.job.source,source_ref:t.job.source_ref,payload:mA(t.job.payload)},project:t.project===null?null:{id:t.project.id,name:t.project.name}}),concurrent_limit:e}}function dA(t,e){return t.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(r,n)=>{let s=fA(e,n.trim());return s==null?"":typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):JSON.stringify(s)})}function fA(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 mA(t){if(t===null||t.trim().length===0)return null;try{return JSON.parse(t)}catch{return t}}var nu=b(()=>{"use strict"});var y_={};le(y_,{enqueueFromAgentOutput:()=>hA,enqueueFromGitHubIssue:()=>su,enqueueManual:()=>pA,enqueueScheduled:()=>_A});function su(t,e){return Ii(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:vi(e.payload),concurrency_key:e.concurrency_key,priority:e.priority})}function pA(t,e){return Ii(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:vi(e.payload),concurrency_key:e.concurrency_key})}function hA(t,e){let r=e.sequence===void 0?`run:${e.parent_run_id}`:`run:${e.parent_run_id}:${e.sequence}`;return Ii(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:vi(e.payload),concurrency_key:e.concurrency_key})}function _A(t,e){return Ii(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:vi(e.payload),concurrency_key:e.concurrency_key})}function vi(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function Ii(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=De(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=ki({workflow:o,job:i,project:n});return t.enqueueJob({...e,concurrency_key:a.concurrency_key})}catch{return t.enqueueJob(e)}}var ou=b(()=>{"use strict";hn();nu()});async function E_(t){let e=t.dal.listProjectWorkflows(t.project.id,{enabled_only:!0});if(e.length===0)return w_(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 gA(o.condition,r))continue;let i=`${t.issue.url}#workflow:${o.workflow_id}`,a={issue:t.issue,...yA(o.parameters_override)},l=w_(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 w_(t,e,r,n,s,o,i){let a=t.findJobBySourceAndDedupe("gh_issue",n);return{jobs:[su(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 gA(t,e){if(t===null||t.trim().length===0)return!0;try{return await Ar(t,e)===!0}catch{return!1}}function yA(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 b_=b(()=>{"use strict";dn();ou()});import{spawnSync as wA}from"node:child_process";async function au(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=wA(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(!bA(o))throw new Error("gh issue list returned unexpected JSON shape");let i=0;for(let a of o){let l=await E_({dal:t.dal,project:t.project,issue:TA(a)});i+=l.new_jobs}return{scanned:o.length,new_jobs:i}}async function _n(t){if(process.env.LMCTL_INTAKE_DISABLED==="1")return[];let e=[];for(let r of t.listProjectsWithIntakeEnabled()){let n=EA(r.intake_config);try{let s=await au({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 EA(t){if(t===null)return{};try{let e=JSON.parse(t);if(!iu(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 bA(t){return Array.isArray(t)&&t.every(e=>{if(!iu(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:iu(n)&&typeof n.name=="string"))})}function TA(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 iu(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var Ni=b(()=>{"use strict";b_()});function S_(t){return async e=>kA(t.app,e,t.log!==void 0?{log:t.log}:{})}async function kA(t,e,r={}){let n=vA(e.path),s={"content-type":"application/json",...e.headers??{},[$i]:lu},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 IA(l);if(r.log!==void 0){let u=Date.now()-a;r.log(`[mailbox-dispatch] ${e.method} ${T_(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} ${T_(e.path)} \u2192 ERR (${c}ms)`)}throw l}}function T_(t){let e=t.startsWith("/")?t:`/${t}`,r=e.search(/[?#]/);return r===-1?e:e.slice(0,r)}function vA(t){let e=t.startsWith("/")?t:`/${t}`;return`${SA}${e}`}async function IA(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()!==$i&&(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 $i,lu,SA,cu=b(()=>{"use strict";$i="x-mailbox-channel",lu="1",SA="http://mailbox.local"});import{createHash as k_,createHmac as NA,timingSafeEqual as $A}from"node:crypto";function v_(){return async(t,e)=>{let r=I_();if(r===null||OA(t.req.path)){await e();return}if(t.req.path.startsWith("/mailbox/")&&t.req.header($i)===lu){await e();return}let n=t.req.query("token");if(n!==void 0&&xi(n,r)){du(t,r),await e();return}if(RA(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 I_(){let t=process.env.LMCTL_API_TOKEN;return t&&t.length>0?t:null}function N_(t){let e=I_();return e!==null&&xi(t,e)}function du(t,e,r=new Date){t.header("Set-Cookie",`${uu}=${jA(e,r)}; Path=/; HttpOnly; SameSite=Lax`)}function $_(t){t.header("Set-Cookie",`${uu}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`)}function jA(t,e=new Date){let n=`auth=ok|${new Date(e.getTime()+xA*24*60*60*1e3).toISOString()}`;return Buffer.from(`${n}|${x_(t,n)}`,"utf8").toString("base64url")}function AA(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:xi(s[2],x_(e,`${s[0]}|${s[1]}`))}function xi(t,e){return $A(k_("sha256").update(t).digest(),k_("sha256").update(e).digest())}function RA(t,e){let r=/^Bearer\s+(.+)$/i.exec(t.req.header("authorization")??"")?.[1];if(r!==void 0&&xi(r,e))return!0;let n=LA(t.req.header("cookie")??"")[uu];return n!==void 0&&AA(n,e)}function OA(t){return t==="/login"||t==="/logout"}function LA(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 x_(t,e){return NA("sha256",t).update(e).digest("hex")}var uu,xA,j_=b(()=>{"use strict";cu();uu="lmctl_next_session",xA=30});import{existsSync as gn,mkdirSync as CA,readdirSync as MA,readFileSync as ji,unlinkSync as DA,writeFileSync as pu}from"node:fs";import{join as Rr}from"node:path";function rt(t){if(!PA.test(t))throw new Error(`invalid memory name "${t}": only alphanumeric characters, underscores, and hyphens are allowed`)}function R_(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 BA(a)?{name:t,type:a,description:i?.[1]?.trim()??null,body:s,created_at:A_,updated_at:A_}:null}function FA(t,e,r,n){let s=r!==null?`
|
|
1514
|
+
`)||e.startsWith("{")||e.startsWith("[")?g_(t):e.endsWith(".json")?g_(oA(e,"utf8")):t}function g_(t){return JSON.parse(t)}function uA(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var ru,Ut,hn=b(()=>{"use strict";fn();l_();tu();mn();__();ru=class extends Error{causeError;constructor(e){super("compiler emitted invalid atomic workflow"),this.causeError=e,this.name="CompilerInvariantError"}},Ut=class extends Error{issues;constructor(e){super("compound workflow validation failed"),this.issues=e,this.name="CompilerValidationError"}}});function ki(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:dA(r,{job:{id:t.job.id,kind:t.job.source,source:t.job.source,source_ref:t.job.source_ref,payload:mA(t.job.payload)},project:t.project===null?null:{id:t.project.id,name:t.project.name}}),concurrent_limit:e}}function dA(t,e){return t.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(r,n)=>{let s=fA(e,n.trim());return s==null?"":typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):JSON.stringify(s)})}function fA(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 mA(t){if(t===null||t.trim().length===0)return null;try{return JSON.parse(t)}catch{return t}}var nu=b(()=>{"use strict"});var w_={};le(w_,{enqueueFromAgentOutput:()=>hA,enqueueFromGitHubIssue:()=>su,enqueueManual:()=>pA,enqueueScheduled:()=>_A});function su(t,e){return Ii(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:vi(e.payload),concurrency_key:e.concurrency_key,priority:e.priority})}function pA(t,e){return Ii(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:vi(e.payload),concurrency_key:e.concurrency_key})}function hA(t,e){let r=e.sequence===void 0?`run:${e.parent_run_id}`:`run:${e.parent_run_id}:${e.sequence}`;return Ii(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:vi(e.payload),concurrency_key:e.concurrency_key})}function _A(t,e){return Ii(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:vi(e.payload),concurrency_key:e.concurrency_key})}function vi(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function Ii(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=De(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=ki({workflow:o,job:i,project:n});return t.enqueueJob({...e,concurrency_key:a.concurrency_key})}catch{return t.enqueueJob(e)}}var ou=b(()=>{"use strict";hn();nu()});async function E_(t){let e=t.dal.listProjectWorkflows(t.project.id,{enabled_only:!0});if(e.length===0)return y_(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 gA(o.condition,r))continue;let i=`${t.issue.url}#workflow:${o.workflow_id}`,a={issue:t.issue,...wA(o.parameters_override)},l=y_(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 y_(t,e,r,n,s,o,i){let a=t.findJobBySourceAndDedupe("gh_issue",n);return{jobs:[su(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 gA(t,e){if(t===null||t.trim().length===0)return!0;try{return await Ar(t,e)===!0}catch{return!1}}function wA(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 b_=b(()=>{"use strict";dn();ou()});import{spawnSync as yA}from"node:child_process";async function au(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=yA(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(!bA(o))throw new Error("gh issue list returned unexpected JSON shape");let i=0;for(let a of o){let l=await E_({dal:t.dal,project:t.project,issue:TA(a)});i+=l.new_jobs}return{scanned:o.length,new_jobs:i}}async function _n(t){if(process.env.LMCTL_INTAKE_DISABLED==="1")return[];let e=[];for(let r of t.listProjectsWithIntakeEnabled()){let n=EA(r.intake_config);try{let s=await au({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 EA(t){if(t===null)return{};try{let e=JSON.parse(t);if(!iu(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 bA(t){return Array.isArray(t)&&t.every(e=>{if(!iu(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:iu(n)&&typeof n.name=="string"))})}function TA(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 iu(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var Ni=b(()=>{"use strict";b_()});function S_(t){return async e=>kA(t.app,e,t.log!==void 0?{log:t.log}:{})}async function kA(t,e,r={}){let n=vA(e.path),s={"content-type":"application/json",...e.headers??{},[$i]:lu},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 IA(l);if(r.log!==void 0){let u=Date.now()-a;r.log(`[mailbox-dispatch] ${e.method} ${T_(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} ${T_(e.path)} \u2192 ERR (${c}ms)`)}throw l}}function T_(t){let e=t.startsWith("/")?t:`/${t}`,r=e.search(/[?#]/);return r===-1?e:e.slice(0,r)}function vA(t){let e=t.startsWith("/")?t:`/${t}`;return`${SA}${e}`}async function IA(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()!==$i&&(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 $i,lu,SA,cu=b(()=>{"use strict";$i="x-mailbox-channel",lu="1",SA="http://mailbox.local"});import{createHash as k_,createHmac as NA,timingSafeEqual as $A}from"node:crypto";function v_(){return async(t,e)=>{let r=I_();if(r===null||OA(t.req.path)){await e();return}if(t.req.path.startsWith("/mailbox/")&&t.req.header($i)===lu){await e();return}let n=t.req.query("token");if(n!==void 0&&xi(n,r)){du(t,r),await e();return}if(RA(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 I_(){let t=process.env.LMCTL_API_TOKEN;return t&&t.length>0?t:null}function N_(t){let e=I_();return e!==null&&xi(t,e)}function du(t,e,r=new Date){t.header("Set-Cookie",`${uu}=${jA(e,r)}; Path=/; HttpOnly; SameSite=Lax`)}function $_(t){t.header("Set-Cookie",`${uu}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`)}function jA(t,e=new Date){let n=`auth=ok|${new Date(e.getTime()+xA*24*60*60*1e3).toISOString()}`;return Buffer.from(`${n}|${x_(t,n)}`,"utf8").toString("base64url")}function AA(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:xi(s[2],x_(e,`${s[0]}|${s[1]}`))}function xi(t,e){return $A(k_("sha256").update(t).digest(),k_("sha256").update(e).digest())}function RA(t,e){let r=/^Bearer\s+(.+)$/i.exec(t.req.header("authorization")??"")?.[1];if(r!==void 0&&xi(r,e))return!0;let n=LA(t.req.header("cookie")??"")[uu];return n!==void 0&&AA(n,e)}function OA(t){return t==="/login"||t==="/logout"}function LA(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 x_(t,e){return NA("sha256",t).update(e).digest("hex")}var uu,xA,j_=b(()=>{"use strict";cu();uu="lmctl_next_session",xA=30});import{existsSync as gn,mkdirSync as CA,readdirSync as MA,readFileSync as ji,unlinkSync as DA,writeFileSync as pu}from"node:fs";import{join as Rr}from"node:path";function rt(t){if(!PA.test(t))throw new Error(`invalid memory name "${t}": only alphanumeric characters, underscores, and hyphens are allowed`)}function R_(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 BA(a)?{name:t,type:a,description:i?.[1]?.trim()??null,body:s,created_at:A_,updated_at:A_}:null}function FA(t,e,r,n){let s=r!==null?`
|
|
1515
1515
|
description: ${r}`:"";return`---
|
|
1516
1516
|
name: ${t}${s}
|
|
1517
1517
|
type: ${e}
|
|
@@ -1592,40 +1592,40 @@ ${s}`;YA(t,i,"utf8")}function QA(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r
|
|
|
1592
1592
|
JOIN step s ON s.id = sa.step_id
|
|
1593
1593
|
WHERE s.run_id = ? ORDER BY sa.id ASC`,t),l=new Map;for(let R of a){let W=l.get(R.step_id)??[];W.push({kind:R.kind,id:R.id}),l.set(R.step_id,W)}let c=i.map(R=>({id:R.id,state_name:R.state_name,outcome:R.outcome,duration_ms:R.started_at!==null&&R.ended_at!==null?Math.max(0,new Date(R.ended_at).getTime()-new Date(R.started_at).getTime()):null,artifacts:l.get(R.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 R of d)try{let W=JSON.parse(R.payload);typeof W.elapsedMs=="number"&&W.elapsedMs>0&&(f+=W.elapsedMs)}catch{}let m=u.map(R=>({kind:R.kind,count:R.count,total_elapsed_ms:R.kind==="tool_result"?f:0})),p=c.filter(R=>R.outcome==="request_changes"),h=[...new Set(p.map(R=>R.state_name))],g=new Date(n.started_at).getTime(),_=n.ended_at!==null?new Date(n.ended_at).getTime():Date.now(),E=e.query("SELECT project_id FROM job WHERE id = ?",n.job_id)[0]?.project_id??null,k=E!==null?e.query(`SELECT id, signal_kind, severity, description, detected_at FROM drift_signal
|
|
1594
1594
|
WHERE project_id = ? AND detected_at >= ? AND detected_at <= ? ORDER BY detected_at ASC`,E,g,_):[],N=e.query(`SELECT SUM(input_tokens) AS input, SUM(output_tokens) AS output
|
|
1595
|
-
FROM session_size WHERE observed_at >= ? AND observed_at <= ?`,n.started_at,n.ended_at??new Date().toISOString())[0],A=N?.input!==null&&N?.input!==void 0?`input: ${N.input}, output: ${N.output??0}`:"n/a",U=e.getWorkflow(n.workflow_id),F=n.started_at!==null&&n.ended_at!==null?Math.max(0,new Date(n.ended_at).getTime()-new Date(n.started_at).getTime()):null,J={run_id:t,workflow_name:U?.name??null,started_at:n.started_at,ended_at:n.ended_at,terminal_state:n.terminal_state,duration_ms:F,steps:c,tool_stats:m,reviewer_interventions:{count:p.length,state_names:h},drift_signals:k,token_totals:A};e.insertStepArtifact({step_id:o,kind:"run_report",content:JSON.stringify(J)})}var J_=b(()=>{"use strict"});import{spawnSync as G_}from"node:child_process";function
|
|
1595
|
+
FROM session_size WHERE observed_at >= ? AND observed_at <= ?`,n.started_at,n.ended_at??new Date().toISOString())[0],A=N?.input!==null&&N?.input!==void 0?`input: ${N.input}, output: ${N.output??0}`:"n/a",U=e.getWorkflow(n.workflow_id),F=n.started_at!==null&&n.ended_at!==null?Math.max(0,new Date(n.ended_at).getTime()-new Date(n.started_at).getTime()):null,J={run_id:t,workflow_name:U?.name??null,started_at:n.started_at,ended_at:n.ended_at,terminal_state:n.terminal_state,duration_ms:F,steps:c,tool_stats:m,reviewer_interventions:{count:p.length,state_names:h},drift_signals:k,token_totals:A};e.insertStepArtifact({step_id:o,kind:"run_report",content:JSON.stringify(J)})}var J_=b(()=>{"use strict"});import{spawnSync as G_}from"node:child_process";function wu(t){return nR[t]??`no install hint; ensure '${t}' is on PATH`}function sR(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 X_(t){return G_("which",[t],{encoding:"utf8"}).status===0}function K_(t){if(t===void 0)return null;for(let e of t.tools??[])if(!X_(e)){let r=wu(e);return{kind:"missing_tool",tool:e,install_hint:r,message:`missing dependency: ${e}; ${r}`}}for(let e of t.auth??[]){if(!X_(e)){let s=wu(e);return{kind:"missing_tool",tool:e,install_hint:s,message:`missing dependency: ${e}; ${s}`}}let r=sR(e);if(r===null)continue;let n=G_(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:wu(e),message:`${e} not authenticated; run \`${e} login\` or equivalent`,detail:s.length>0?s:void 0}}}return null}var nR,V_=b(()=>{"use strict";nR={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 oR,readdirSync as iR,readFileSync as aR}from"node:fs";import{join as Y_}from"node:path";function lR(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(`
|
|
1596
1596
|
`).map(o=>o.replace(/^\s*-\s+/,"").trim()).filter(Boolean):[]}function z_(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 Z_(t,e){if(e.length===0)return null;let r=Y_(t,"durable-memory");if(!oR(r))return null;let n;try{n=iR(r).filter(o=>o.endsWith(".md")&&o!=="index.md")}catch{return null}let s=[];for(let o of n)try{let i=aR(Y_(r,o),"utf8");if(lR(i).some(l=>e.includes(l))){let l=z_(i,"name")??o.replace(".md",""),c=z_(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 Q_=b(()=>{"use strict"});function bu(t){let e=t.trim().replace(cR,"").trim();for(let r=0;r<4;r+=1){let n=uR.exec(e);if(n===null)break;e=n[2].trim()}return e}function eg(t){let e=t.trim(),r=dR.exec(e);if(r!==null)return r[2];let n=fR.exec(e);return n!==null?n[0]:null}function ps(t,e){let r=t.split(`
|
|
1597
|
-
`),n=null,s=-1;for(let i=0;i<r.length;i+=1){let a=bu(r[i]),l=
|
|
1598
|
-
`),r=null;for(let n=0;n<e.length;n+=1){let s=bu(e[n]),o=
|
|
1599
|
-
\u2026[truncated ${t.length-8e3} chars]`:t}function Y(t,e,r,n){t.outcomes[e]=n,r!==e&&(t.outcomes[r]=n)}function ee(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 fg(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=lr(t.job.payload)?.[n];if(Array.isArray(o)&&o.every(i=>typeof i=="string"))return o}return null}async function Ke(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=lr(e.job.payload);return i===null?"":JSON.stringify(i)}if(o.startsWith("job_payload.")){let i=o.slice(12),l=lr(e.job.payload)?.[i];return l==null?"":String(l)}if(o.startsWith("outcomes.")){let i=jR(e.outcomes,o.slice(9));return i==null?"":typeof i=="string"?i:JSON.stringify(i)}return""});return ag(n,e)}function jR(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 lr(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 gs(t){let{context:e,stateId:r,member:n,prompt:s,stepId:o,timeoutMs:i,writesToProjectPath:a}=t,l=rg(e.dal,e.run_id,()=>o),c=Iu(e,r),u={violation:null},d=S=>{if(l(S),u.violation===null&&S.kind==="tool_use"&&S.tool==="Bash"&&S.summary){let E=ku(S.summary),k=Su(E);k.matched&&!c&&(u.violation={summary:S.summary,kind:k.kind})}},f=new Date(Date.now()-1),m=0,p=0,h=S=>{d(S),AR(S,(E,k)=>{m+=E,p+=k})},g=await Zr({sessionid:n.sessionid,sessiondir:n.sessiondir,prompt:s,timeoutMs:i,dal:e.dal,team_member_id:n.id,onProgress:h});e.dal.insertSessionEvent({run_id:e.run_id,step_id:o,kind:"agent_call",timestamp_ms:Date.now(),payload:JSON.stringify({alias:n.alias,provider:$e(n),model:n.model??"unknown",tokens_in:m,tokens_out:p,wall_time_ms:g.ms})}),RR(e.project,e.dal,f);let _=u.violation;return _!==null?{kind:"g3_violation",summary:_.summary,violationKind:_.kind}:!a&&e.project.local_path.trim().length>0&&Nu(e.project.local_path,f)?{kind:"g2_violation"}:{kind:"ok",text:g.text,ms:g.ms,argv:g.argv}}function AR(t,e){let r=t.raw;if(r==null)return;let s=r.message?.usage;if(s!==void 0){let i=Mi(s.input_tokens),a=Mi(s.output_tokens);(i>0||a>0)&&e(i,a);return}let o=r.usage;if(o!==void 0){let i=Mi(o.input_tokens),a=Mi(o.output_tokens);(i>0||a>0)&&e(i,a)}}function Mi(t){return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:0}async function Wt(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 gs({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
|
|
1597
|
+
`),n=null,s=-1;for(let i=0;i<r.length;i+=1){let a=bu(r[i]),l=yu.exec(a);if(l===null)continue;let c=l[1].trim();if(Eu.test(c))continue;let u=eg(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=bu(r[i]),l=yu.exec(a);if(l===null)break;let c=Eu.exec(l[1].trim());if(c===null)break;o[c[1]]=c[2].trim()}return{outcome:n,evidence:o}}function tg(t){let e=t.split(`
|
|
1598
|
+
`),r=null;for(let n=0;n<e.length;n+=1){let s=bu(e[n]),o=yu.exec(s);if(o===null)continue;let i=o[1].trim();if(Eu.test(i))continue;let a=eg(i);if(a===null||!Hr(a))continue;let c=i.slice(i.indexOf(a)+a.length).replace(/^[`*_:\s\-–—]+/,"").trim();r={token:a,reason:c}}return r}var cR,uR,yu,Eu,dR,fR,Tu=b(()=>{"use strict";Un();cR=/^#{1,6}\s+/,uR=/^(```|\*\*|__|`|\*|_)([\s\S]+?)\1$/,yu=/^STANCE:\s+(.+)$/,Eu=/^([A-Z][A-Z0-9_]*):\s*(.+)$/,dR=/^(```|\*\*|__|`|\*|_)([A-Za-z0-9_-]+)\1/,fR=/^[A-Za-z0-9_-]+/});function rg(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 ng=b(()=>{"use strict"});import{readFileSync as mR}from"node:fs";import{dirname as pR,join as hR}from"node:path";import{fileURLToPath as _R}from"node:url";function yR(t){return t.rules.map(e=>({command:e.command,subcommands:e.argv_patterns.map(r=>r.trim().split(/\s+/)),kind:e.kind}))}function SR(t){let e=[],r=[];for(let n of t)gR.has(n)?(r.length>0&&e.push(r),r=[]):r.push(n);return r.length>0&&e.push(r),e}function kR(t,e){if(t.length===0)return{matched:!1};let r=0;for(;r<t.length&&wR.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 vR(t,e){if(t.length===0)return{matched:!1};let r=SR(t);for(let n of r){let s=kR(n,e);if(s.matched)return s}return{matched:!1}}function Su(t){return vR(t,TR)}function IR(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 ku(t){return IR(t).split(" ").filter(e=>e.length>0)}var gR,wR,ER,bR,TR,sg=b(()=>{"use strict";gR=new Set(["&&","||",";","|",">",">>","<","<<"]),wR=/^[A-Za-z_][A-Za-z0-9_]*=/;ER=pR(_R(import.meta.url)),bR=JSON.parse(mR(hR(ER,"side_effect_classifier.json"),"utf-8")),TR=yR(bR)});function Li(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 og(t,e){try{return await Ar(vu(t)??t,Li(e))===!0}catch{return!1}}async function Ci(t,e){try{return await Ar(vu(t)??t,Li(e))}catch{return}}async function ig(t,e){if(typeof t!="string")return t;let r=vu(t);if(r===null)return t;try{return await Ar(r,Li(e))}catch{return}}async function ag(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+=NR(await Ar(a,Li(e)))}catch{n+=""}s=i+o[0].length}return n+=t.slice(s),n}function vu(t){let e=t.trim();return!e.startsWith("={{")||!e.endsWith("}}")?null:e.slice(3,-2).trim()}function NR(t){return t==null?"":typeof t=="string"?t:JSON.stringify(t)}var hs=b(()=>{"use strict";dn()});import{existsSync as lg,readdirSync as cg,readFileSync as $R,statSync as ug}from"node:fs";import{join as Di}from"node:path";function dg(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 nt(t,e,r,n,s={}){let o=C(),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,`${_s}${e.id}`,o);let a=t.dal.getRun(t.run_id),l=Hr(r)?"generic":"unhandled";return t.dal.raiseAttention({kind:to,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:xR(s.agent_output??n),paused_at:o,created_at:o})}),t.dal.pauseJob(t.job.id),{kind:"paused"}}function xR(t){return t.length>8e3?`${t.slice(0,8e3)}
|
|
1599
|
+
\u2026[truncated ${t.length-8e3} chars]`:t}function Y(t,e,r,n){t.outcomes[e]=n,r!==e&&(t.outcomes[r]=n)}function ee(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 fg(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=lr(t.job.payload)?.[n];if(Array.isArray(o)&&o.every(i=>typeof i=="string"))return o}return null}async function Ke(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=lr(e.job.payload);return i===null?"":JSON.stringify(i)}if(o.startsWith("job_payload.")){let i=o.slice(12),l=lr(e.job.payload)?.[i];return l==null?"":String(l)}if(o.startsWith("outcomes.")){let i=jR(e.outcomes,o.slice(9));return i==null?"":typeof i=="string"?i:JSON.stringify(i)}return""});return ag(n,e)}function jR(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 lr(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 gs(t){let{context:e,stateId:r,member:n,prompt:s,stepId:o,timeoutMs:i,writesToProjectPath:a}=t,l=rg(e.dal,e.run_id,()=>o),c=Iu(e,r),u={violation:null},d=S=>{if(l(S),u.violation===null&&S.kind==="tool_use"&&S.tool==="Bash"&&S.summary){let E=ku(S.summary),k=Su(E);k.matched&&!c&&(u.violation={summary:S.summary,kind:k.kind})}},f=new Date(Date.now()-1),m=0,p=0,h=S=>{d(S),AR(S,(E,k)=>{m+=E,p+=k})},g=await Zr({sessionid:n.sessionid,sessiondir:n.sessiondir,prompt:s,timeoutMs:i,dal:e.dal,team_member_id:n.id,onProgress:h});e.dal.insertSessionEvent({run_id:e.run_id,step_id:o,kind:"agent_call",timestamp_ms:Date.now(),payload:JSON.stringify({alias:n.alias,provider:$e(n),model:n.model??"unknown",tokens_in:m,tokens_out:p,wall_time_ms:g.ms})}),RR(e.project,e.dal,f);let _=u.violation;return _!==null?{kind:"g3_violation",summary:_.summary,violationKind:_.kind}:!a&&e.project.local_path.trim().length>0&&Nu(e.project.local_path,f)?{kind:"g2_violation"}:{kind:"ok",text:g.text,ms:g.ms,argv:g.argv}}function AR(t,e){let r=t.raw;if(r==null)return;let s=r.message?.usage;if(s!==void 0){let i=Mi(s.input_tokens),a=Mi(s.output_tokens);(i>0||a>0)&&e(i,a);return}let o=r.usage;if(o!==void 0){let i=Mi(o.input_tokens),a=Mi(o.output_tokens);(i>0||a>0)&&e(i,a)}}function Mi(t){return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:0}async function Wt(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 gs({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 wn(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(cm(s)),l!=null&&l.length>0&&d.push(l);let f=r.prompt_template!==void 0?await Ke(r.prompt_template,t,e):"";f.length>0&&d.push(f),n!==null&&n.length>0&&d.push(n);let m=d.join(`
|
|
1600
1600
|
|
|
1601
|
-
`);try{let p=await gs({context:t,stateId:e,member:c,prompt:m,stepId:u.id,timeoutMs:i,writesToProjectPath:a});if(p.kind==="g3_violation"||p.kind==="g2_violation"){let g=p.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${p.violationKind}`:"policy_violation:writes_to_project_path";return t.dal.insertSessionEvent({run_id:t.run_id,step_id:u.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(p.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:e,kind:p.violationKind,command_summary:p.summary,message:`State ${e} ran a classified side-effect command (${p.violationKind}) without a preceding approved Pause`}:{violation:"writes_to_project_path",state_id:e,message:`State ${e} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(u.id,null,g),{outcome:null,text:"",status_detail:g}}if(t.dal.insertStepArtifact({step_id:u.id,kind:`${e}_transcript`,content:p.text}),t.transcripts[e]=p.text,!o)return t.dal.finishStep(u.id,"done",`chat_ms=${p.ms}`),t.outcomes[e]="done",{outcome:"done",text:p.text,status_detail:`chat_ms=${p.ms}`};let h=ps(p.text,s);return t.dal.finishStep(u.id,h.outcome,h.outcome!==null?`chat_ms=${p.ms}`:h.reason),h.outcome!==null&&(t.outcomes[e]=h.outcome),{outcome:h.outcome,text:p.text,status_detail:h.outcome!==null?`chat_ms=${p.ms}`:h.reason}}catch(p){let h=p instanceof be?`chat_${p.kind}`:"chat_other";return t.dal.finishStep(u.id,null,h),{outcome:null,text:"",status_detail:h}}}function
|
|
1601
|
+
`);try{let p=await gs({context:t,stateId:e,member:c,prompt:m,stepId:u.id,timeoutMs:i,writesToProjectPath:a});if(p.kind==="g3_violation"||p.kind==="g2_violation"){let g=p.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${p.violationKind}`:"policy_violation:writes_to_project_path";return t.dal.insertSessionEvent({run_id:t.run_id,step_id:u.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(p.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:e,kind:p.violationKind,command_summary:p.summary,message:`State ${e} ran a classified side-effect command (${p.violationKind}) without a preceding approved Pause`}:{violation:"writes_to_project_path",state_id:e,message:`State ${e} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(u.id,null,g),{outcome:null,text:"",status_detail:g}}if(t.dal.insertStepArtifact({step_id:u.id,kind:`${e}_transcript`,content:p.text}),t.transcripts[e]=p.text,!o)return t.dal.finishStep(u.id,"done",`chat_ms=${p.ms}`),t.outcomes[e]="done",{outcome:"done",text:p.text,status_detail:`chat_ms=${p.ms}`};let h=ps(p.text,s);return t.dal.finishStep(u.id,h.outcome,h.outcome!==null?`chat_ms=${p.ms}`:h.reason),h.outcome!==null&&(t.outcomes[e]=h.outcome),{outcome:h.outcome,text:p.text,status_detail:h.outcome!==null?`chat_ms=${p.ms}`:h.reason}}catch(p){let h=p instanceof be?`chat_${p.kind}`:"chat_other";return t.dal.finishStep(u.id,null,h),{outcome:null,text:"",status_detail:h}}}function yn(t,e){return(e?.length??0)>0?Z_(t.project.local_path,e):null}function mg(t){return Su(ku(t))}function Iu(t,e){let r=t.dal.query(`SELECT state_name, outcome FROM step
|
|
1602
1602
|
WHERE run_id = ? AND state_name != ? AND ended_at IS NOT NULL
|
|
1603
1603
|
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 Nu(t,e){if(!lg(t))return!1;let r=Di(t,"durable-memory");function n(s){let o;try{o=cg(s,{withFileTypes:!0})}catch{return!1}for(let i of o){if(i.name===".git")continue;let a=Di(s,i.name);if(a!==r)if(i.isDirectory()){if(n(a))return!0}else try{if(ug(a).mtime>e)return!0}catch{}}return!1}return n(t)}function RR(t,e,r){let n=Di(t.local_path,"durable-memory");if(!lg(n))return;let s;try{s=cg(n)}catch{return}for(let o of s){if(!o.endsWith(".md")||o==="MEMORY.md")continue;let i=Di(n,o),a;try{a=ug(i).mtime}catch{continue}if(a<=r)continue;let l;try{l=$R(i,"utf8")}catch{continue}let c=LR(l);if(c===null){process.stderr.write(`[durable-memory-sync] warning: ${o} has no valid frontmatter, skipping
|
|
1604
|
-
`);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 LR(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||!OR.has(l)?null:{name:a,type:l,description:i?.[1]?.trim()??null,body:n}}var _s,OR,qe=b(()=>{"use strict";Ue();fn();Yn();Q_();Tu();Un();ng();sg();hs();_s="__paused__:";OR=new Set(["user","feedback","project","reference"])});import{spawnSync as pg}from"node:child_process";function CR(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=pg("git",["diff","--quiet"],{cwd:o}).status!==0,a=pg("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,Vc),{kind:"terminal",terminal:ee(t.workflow)}}return t.dal.finishStep(s.id,"clean","repo_clean"),Y(t,r,n,"clean"),V(t.workflow,e.next)}var hg,_g=b(()=>{"use strict";qe();hg={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=>CR(t,t.state)}});async function MR(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 og(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":ee(t.workflow)}}var gg,
|
|
1604
|
+
`);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 LR(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||!OR.has(l)?null:{name:a,type:l,description:i?.[1]?.trim()??null,body:n}}var _s,OR,qe=b(()=>{"use strict";Ue();fn();Yn();Q_();Tu();Un();ng();sg();hs();_s="__paused__:";OR=new Set(["user","feedback","project","reference"])});import{spawnSync as pg}from"node:child_process";function CR(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=pg("git",["diff","--quiet"],{cwd:o}).status!==0,a=pg("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,Vc),{kind:"terminal",terminal:ee(t.workflow)}}return t.dal.finishStep(s.id,"clean","repo_clean"),Y(t,r,n,"clean"),V(t.workflow,e.next)}var hg,_g=b(()=>{"use strict";qe();hg={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=>CR(t,t.state)}});async function MR(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 og(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":ee(t.workflow)}}var gg,wg=b(()=>{"use strict";qe();hs();gg={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=>MR(t,t.state)}});async function DR(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms,o=e.researchers??[],i=yn(t,e.durable_memory_tags),a=new Array(o.length).fill(null);await Promise.all(o.map(async(m,p)=>{let h=`${n}:researcher_${m.alias}[${p}]`,g=await wn(t,h,m,`TOPIC: ${m.topic}`,[],!1,s,!1,i);g.text.length>0&&(a[p]=g.text)}));let l=a.map((m,p)=>m!==null?`# Research ${p+1}: ${o[p]?.topic??""}
|
|
1605
1605
|
${m}`:null).filter(m=>m!==null).join(`
|
|
1606
1606
|
|
|
1607
|
-
`),c=`${n}:consolidator`,u=await
|
|
1607
|
+
`),c=`${n}:consolidator`,u=await wn(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:ee(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 Wt(t,n,m,e.write_back_durable_memory)}return V(t.workflow,e.outcomes.ok)}var yg,Eg=b(()=>{"use strict";qe();yg={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=>DR(t,t.state)}});async function PR(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 Ci(e.items_from,t),a=BR(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:ee(t.workflow)}}let l={routed:null},c=e.mode==="parallel"?await UR(t,e,s.id,a,l):await FR(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:ee(t.workflow)}}return V(t.workflow,e.outcomes.all_ok)}finally{t.progress_step_id=o}}async function FR(t,e,r,n,s){let o=[];for(let i=0;i<n.length;i+=1){let a=await Tg(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 UR(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 Tg(t,e,r,n[l],l,s)}});return await Promise.all(a),o}async function Tg(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__":WR(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 WR(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function BR(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 bg,Sg=b(()=>{"use strict";qe();hs();bg={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=>PR(t,t.state)}});async function qR(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:ee(t.workflow)}}let i=yn(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 Wt(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:ee(t.workflow)}}let f=a.last_operator_input??"";try{let m=await gs({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:ee(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 Wt(t,n,o,e.write_back_durable_memory),V(t.workflow,e.outcomes.done)):(kg({context:t,state:e,stateId:r,displayName:n,stepId:a.step_id,agentText:m.text}),{kind:"paused"})}catch(m){let p=m instanceof be?`chat_${m.kind}`:"chat_other";return t.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:ee(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 Ke(e.agent.initial_prompt_template,t,n),d=i?`${i}
|
|
1608
1608
|
|
|
1609
|
-
${u}`:u;try{let f=await gs({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:ee(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 Wt(t,n,o,e.write_back_durable_memory),V(t.workflow,e.outcomes.done)):(kg({context:t,state:e,stateId:r,displayName:n,stepId:l.id,agentText:f.text}),{kind:"paused"})}catch(f){let m=f instanceof be?`chat_${f.kind}`:"chat_other";return t.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:ee(t.workflow)}}}function kg(t){let{context:e,state:r,stateId:n,displayName:s,stepId:o,agentText:i}=t,a=C();e.dal.setRunPausedState(e.run_id,`${_s}${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(HR({context:e,stateId:s,state:r,stepId:o,agentText:i,pausedAt:a}))}),e.dal.pauseJob(e.job.id)}function HR(t){let{context:e,stateId:r,state:n,stepId:s,agentText:o,pausedAt:i}=t,a=e.dal.getRun(e.run_id),l=JR(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:XR(o,3),paused_at:i,created_run_inputs:lr(e.job.payload)}}function JR(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 XR(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 vg,Ig=b(()=>{"use strict";Yn();qe();vg={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=>qR(t,t.state)}});async function GR(t,e){let r=t.stateId,n=t.displayName,s=fg(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:ee(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:ee(t.workflow)}}let i=s.slice(0,e.max_items),a=[],l=!1;for(let d=0;d<i.length;d+=1){let f=i[d],m=`${n}[${d}]`,p=t.iteration;t.iteration={item:f,index:d};let h;try{h=await t.dispatchState(m,o,{iteration:{item:f,index:d}})}finally{t.iteration=p}if(h.kind==="paused"||h.kind==="escalate")return h;let g=KR(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:ee(t.workflow)}}return V(t.workflow,e.outcomes.ok)}function KR(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}var Ng,$g=b(()=>{"use strict";qe();Ng={description:{displayName:"Loop",name:"loop",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],builtin:!0},execute:async t=>GR(t,t.state)}});import{createHash as VR}from"node:crypto";import{existsSync as YR,mkdirSync as zR,readFileSync as ZR,writeFileSync as QR}from"node:fs";import{dirname as eO,isAbsolute as jg,normalize as tO,resolve as
|
|
1609
|
+
${u}`:u;try{let f=await gs({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:ee(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 Wt(t,n,o,e.write_back_durable_memory),V(t.workflow,e.outcomes.done)):(kg({context:t,state:e,stateId:r,displayName:n,stepId:l.id,agentText:f.text}),{kind:"paused"})}catch(f){let m=f instanceof be?`chat_${f.kind}`:"chat_other";return t.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:ee(t.workflow)}}}function kg(t){let{context:e,state:r,stateId:n,displayName:s,stepId:o,agentText:i}=t,a=C();e.dal.setRunPausedState(e.run_id,`${_s}${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(HR({context:e,stateId:s,state:r,stepId:o,agentText:i,pausedAt:a}))}),e.dal.pauseJob(e.job.id)}function HR(t){let{context:e,stateId:r,state:n,stepId:s,agentText:o,pausedAt:i}=t,a=e.dal.getRun(e.run_id),l=JR(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:XR(o,3),paused_at:i,created_run_inputs:lr(e.job.payload)}}function JR(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 XR(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 vg,Ig=b(()=>{"use strict";Yn();qe();vg={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=>qR(t,t.state)}});async function GR(t,e){let r=t.stateId,n=t.displayName,s=fg(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:ee(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:ee(t.workflow)}}let i=s.slice(0,e.max_items),a=[],l=!1;for(let d=0;d<i.length;d+=1){let f=i[d],m=`${n}[${d}]`,p=t.iteration;t.iteration={item:f,index:d};let h;try{h=await t.dispatchState(m,o,{iteration:{item:f,index:d}})}finally{t.iteration=p}if(h.kind==="paused"||h.kind==="escalate")return h;let g=KR(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:ee(t.workflow)}}return V(t.workflow,e.outcomes.ok)}function KR(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}var Ng,$g=b(()=>{"use strict";qe();Ng={description:{displayName:"Loop",name:"loop",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],builtin:!0},execute:async t=>GR(t,t.state)}});import{createHash as VR}from"node:crypto";import{existsSync as YR,mkdirSync as zR,readFileSync as ZR,writeFileSync as QR}from"node:fs";import{dirname as eO,isAbsolute as jg,normalize as tO,resolve as ws}from"node:path";import{Document as rO,ExternalHyperlink as nO,HeadingLevel as En,LevelFormat as sO,Packer as oO,Paragraph as mt,Table as iO,TableCell as aO,TableRow as lO,TextRun as pt,WidthType as cO}from"docx";import{marked as uO}from"marked";async function dO(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 fO(t,e,n),i=await mO(t,e),a=await pO(t,e.title),l=await yO(o,a??t.workflow.name);if(l.length===0)throw new Error("rendered DOCX buffer was empty");return zR(eO(i),{recursive:!0}),QR(i,l),t.dal.insertStepArtifact({step_id:s.id,kind:"render_docx",path:i,sha:VR("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 fO(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 Ke(e.markdown_source,t,r)).trim(),o=(n.length===0?wO(t,e.markdown_source):null)??n;if(o.length===0)throw new Error("markdown_source resolved empty");let i=_O(t.project.local_path,o);if(i!==null){if(!YR(i))throw new Error(`markdown_source file not found: ${i}`);return Pi(ZR(i,"utf8"))}return Pi(o)}async function mO(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let r=(await Ke(e.output_path,t,t.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=hO(t.project.local_path,r);if(!n.endsWith(".docx"))throw new Error(`output_path must end with .docx: ${n}`);return n}async function pO(t,e){if(typeof e!="string"||e.trim().length===0)return null;let r=(await Ke(e,t,t.stateId)).trim();return r.length===0?null:r}function hO(t,e){let r=ws(t);return tO(jg(e)?ws(e):ws(r,e))}function _O(t,e){return gO(e)?jg(e)?ws(e):ws(t,e):null}function gO(t){return t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function wO(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 Pi(s);let o=t.dal.query(`SELECT sa.content
|
|
1610
1610
|
FROM step_artifact sa
|
|
1611
1611
|
JOIN step s ON s.id = sa.step_id
|
|
1612
1612
|
WHERE s.run_id = ?
|
|
1613
1613
|
AND s.state_name LIKE ?
|
|
1614
1614
|
AND sa.content IS NOT NULL
|
|
1615
1615
|
ORDER BY sa.id DESC
|
|
1616
|
-
LIMIT 1`,t.run_id,`${n}:coder[%`);return o[0]?.content===void 0?null:Pi(o[0].content)}function Pi(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}async function
|
|
1617
|
-
`).map(r=>new mt({children:[new pt({text:r.length===0?" ":r,font:"Courier New"})]}))}function cr(t){let e=t.tokens;return Array.isArray(e)?e:[]}function SO(t){return t.type==="list"&&Array.isArray(t.items)}function kO(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function vO(t){return t.type==="code"&&typeof t.text=="string"}function IO(t){switch(t){case 1:return En.HEADING_1;case 2:return En.HEADING_2;case 3:return En.HEADING_3;case 4:return En.HEADING_4;case 5:return En.HEADING_5;default:return En.HEADING_6}}var Ag,Og=b(()=>{"use strict";qe();Ag={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=>dO(t,t.state)}});import{createHash as NO}from"node:crypto";import{existsSync as $O,mkdirSync as xO,readFileSync as Lg,statSync as jO}from"node:fs";import{dirname as AO,isAbsolute as Cg,normalize as RO,resolve as
|
|
1618
|
-
${a}`:null,c,l,s,e.writes_to_project_path===!0,o);if(l){let g=tg(p.text);if(g!==null){let _=G(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(_.id,null,`escalation_vocab:${g.token}`),{kind:"escalate",token:g.token,reason:g.reason.length>0?`${g.token}: ${g.reason}`:g.token}}}if(p.outcome===null){let g=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 S=Object.keys(e.outcomes_from_stance),E=ps(p.text,S);if(E.outcome===null){let x=G(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(x.id,null,`unhandled_stance:${E.reason}`),{kind:"escalate",token:"",reason:`no_stance:${E.reason}`}}let k=G(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(k.id,E.outcome,"outcomes_from_stance"),Y(t,r,n,E.outcome),V(t.workflow,e.outcomes_from_stance[E.outcome])}let g=ps(p.text,oL);if(g.outcome!==null){let S=G(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(S.id,g.outcome,"default_failure_stance"),Y(t,r,n,g.outcome),{kind:"escalate",token:g.outcome,reason:`failure_stance:${g.outcome}`}}let _=G(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,t.dal.finishStep(_.id,"approve","no_reviewers"),Y(t,r,n,"approve"),e.write_back_durable_memory){let S=t.membersByAlias.get(e.coder.alias);S!==void 0&&await Wt(t,n,S,e.write_back_durable_memory)}return V(t.workflow,e.outcomes.approve)}let h=await Promise.all(i.map(g=>
|
|
1616
|
+
LIMIT 1`,t.run_id,`${n}:coder[%`);return o[0]?.content===void 0?null:Pi(o[0].content)}function Pi(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}async function yO(t,e){let r=Rg(uO.lexer(t,{gfm:!0})),n=new rO({title:e,numbering:{config:[{reference:"ordered-list",levels:[{level:0,format:sO.DECIMAL,text:"%1."}]}]},sections:[{children:r.length===0?[new mt("")]:r}]});return oO.toBuffer(n)}function Rg(t){let e=[];for(let r of t)switch(r.type){case"space":break;case"heading":e.push(new mt({heading:IO(r.depth),children:ur(cr(r))}));break;case"paragraph":e.push(new mt({children:ur(cr(r))}));break;case"text":e.push(new mt({children:cr(r).length===0?[new pt(r.text)]:ur(cr(r))}));break;case"blockquote":e.push(...Rg(cr(r)).map(n=>n instanceof mt?n:new mt({children:[new pt(r.text)]})));break;case"list":SO(r)&&e.push(...EO(r));break;case"table":kO(r)&&e.push(bO(r));break;case"code":vO(r)&&e.push(...TO(r));break;case"hr":e.push(new mt(""));break;case"html":r.text.trim().length>0&&e.push(new mt({children:[new pt(r.text)]}));break;default:break}return e}function ur(t,e){let r=[];for(let n of t)switch(n.type){case"text":case"escape":r.push(new pt({text:n.text,...$u(e)}));break;case"strong":r.push(...ur(cr(n),{...e,bold:!0}));break;case"em":r.push(...ur(cr(n),{...e,italics:!0}));break;case"codespan":r.push(new pt({text:n.text,...$u({...e,code:!0})}));break;case"link":r.push(new nO({link:n.href,children:ur(cr(n),{...e})}));break;case"br":r.push(new pt({text:"",break:1}));break;case"image":r.push(new pt({text:`[image: ${n.text}]`,italics:!0}));break;case"del":r.push(new pt({text:n.text,strike:!0}));break;default:r.push(new pt({text:n.raw,...$u(e)}));break}return r.length===0?[new pt("")]:r}function $u(t){return{...t?.bold===!0?{bold:!0}:{},...t?.italics===!0?{italics:!0}:{},...t?.code===!0?{font:"Courier New"}:{}}}function EO(t){return t.items.map(e=>new mt({children:ur(e.tokens.length===1&&e.tokens[0]?.type==="text"?[{...e.tokens[0],text:xg(e)+e.tokens[0].text}]:[{type:"text",raw:e.text,text:xg(e)+e.text}]),...t.ordered?{numbering:{reference:"ordered-list",level:0}}:{bullet:{level:0}}}))}function xg(t){return t.task?`[${t.checked?"x":" "}] `:""}function bO(t){let e=[t.header,...t.rows].map(r=>new lO({children:r.map(n=>new aO({children:[new mt({children:ur(n.tokens,n.header?{bold:!0}:void 0)})]}))}));return new iO({width:{size:100,type:cO.PERCENTAGE},rows:e})}function TO(t){return t.text.split(`
|
|
1617
|
+
`).map(r=>new mt({children:[new pt({text:r.length===0?" ":r,font:"Courier New"})]}))}function cr(t){let e=t.tokens;return Array.isArray(e)?e:[]}function SO(t){return t.type==="list"&&Array.isArray(t.items)}function kO(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function vO(t){return t.type==="code"&&typeof t.text=="string"}function IO(t){switch(t){case 1:return En.HEADING_1;case 2:return En.HEADING_2;case 3:return En.HEADING_3;case 4:return En.HEADING_4;case 5:return En.HEADING_5;default:return En.HEADING_6}}var Ag,Og=b(()=>{"use strict";qe();Ag={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=>dO(t,t.state)}});import{createHash as NO}from"node:crypto";import{existsSync as $O,mkdirSync as xO,readFileSync as Lg,statSync as jO}from"node:fs";import{dirname as AO,isAbsolute as Cg,normalize as RO,resolve as ys}from"node:path";import{marked as OO}from"marked";import LO from"write-excel-file/node";async function CO(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 MO(t,e),i=DO(e.input_format),a=await PO(t,e),l=await FO(t,e.title),c=i==="markdown"?KO(o):qO(o);await VO({sheets:c.length===0?[{name:"Sheet1",headers:[],rows:[]}]:c,outputPath:a,title:l??t.workflow.name});let u=jO(a).size;if(u===0)throw new Error("rendered XLSX file was empty");let d=NO("sha256").update(Lg(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 MO(t,e){if(typeof e.source!="string"||e.source.trim().length===0)return"";let r=(await Ke(e.source,t,t.stateId)).trim(),n=WO(t.project.local_path,r);if(n!==null){if(!$O(n))throw new Error(`source file not found: ${n}`);return Lg(n,"utf8")}return r}function DO(t){if(t==null||t==="")return"json";if(t==="json"||t==="markdown")return t;throw new Error(`unsupported input_format: ${String(t)}`)}async function PO(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let r=(await Ke(e.output_path,t,t.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=UO(t.project.local_path,r);if(!n.endsWith(".xlsx"))throw new Error(`output_path must end with .xlsx: ${n}`);return n}async function FO(t,e){if(typeof e!="string"||e.trim().length===0)return null;let r=(await Ke(e,t,t.stateId)).trim();return r.length===0?null:r}function UO(t,e){let r=ys(t);return RO(Cg(e)?ys(e):ys(r,e))}function WO(t,e){return BO(e)?Cg(e)?ys(e):ys(t,e):null}function BO(t){return t.endsWith(".json")||t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function qO(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(!Fi(e)||!Array.isArray(e.sheets))throw new Error("JSON source must be an object with sheets[]");return e.sheets.map((r,n)=>HO(r,n))}function HO(t,e){if(!Fi(t))throw new Error(`sheets[${e}] must be an object`);let r=JO(t.headers,`sheets[${e}].headers`),n=XO(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:GO(t.styles)}}function JO(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 XO(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 GO(t){if(!Fi(t)||!Fi(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 KO(t){let e=OO.lexer(t,{gfm:!0}),r=[],n=null;for(let s of e){if(rL(s)){n=s.text;continue}nL(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 VO(t){xO(AO(t.outputPath),{recursive:!0});let e=new Set,r=t.sheets.map(n=>({sheet:QO(n.name,e),data:YO(n),columns:ZO(n)}));await LO(r).toFile(t.outputPath)}function YO(t){let e=[];if(t.headers.length>0){let r=tL(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(zO));return e.length===0?[[{}]]:e}function zO(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 ZO(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 QO(t,e){let r=eL(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 eL(t){let e=t.replace(/[\[\]:*?/\\]/g," ").trim();return(e.length===0?"Sheet":e).slice(0,31)}function tL(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 rL(t){return t.type==="heading"&&typeof t.text=="string"}function nL(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function Fi(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Mg,Dg=b(()=>{"use strict";qe();Mg={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=>CO(t,t.state)}});import{spawnSync as sL}from"node:child_process";async function iL(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms;for(let f of e.pre_checks??[])if(sL("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 h=e.outcomes.fail_pre_check;return h!==void 0?V(t.workflow,h):{kind:"terminal",terminal:ee(t.workflow)}}let o=yn(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 wn(t,m,e.coder,a!==null?`PRIOR REVIEW FEEDBACK:
|
|
1618
|
+
${a}`:null,c,l,s,e.writes_to_project_path===!0,o);if(l){let g=tg(p.text);if(g!==null){let _=G(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(_.id,null,`escalation_vocab:${g.token}`),{kind:"escalate",token:g.token,reason:g.reason.length>0?`${g.token}: ${g.reason}`:g.token}}}if(p.outcome===null){let g=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 S=Object.keys(e.outcomes_from_stance),E=ps(p.text,S);if(E.outcome===null){let x=G(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(x.id,null,`unhandled_stance:${E.reason}`),{kind:"escalate",token:"",reason:`no_stance:${E.reason}`}}let k=G(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(k.id,E.outcome,"outcomes_from_stance"),Y(t,r,n,E.outcome),V(t.workflow,e.outcomes_from_stance[E.outcome])}let g=ps(p.text,oL);if(g.outcome!==null){let S=G(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(S.id,g.outcome,"default_failure_stance"),Y(t,r,n,g.outcome),{kind:"escalate",token:g.outcome,reason:`failure_stance:${g.outcome}`}}let _=G(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,t.dal.finishStep(_.id,"approve","no_reviewers"),Y(t,r,n,"approve"),e.write_back_durable_memory){let S=t.membersByAlias.get(e.coder.alias);S!==void 0&&await Wt(t,n,S,e.write_back_durable_memory)}return V(t.workflow,e.outcomes.approve)}let h=await Promise.all(i.map(g=>wn(t,`${n}:reviewer_${g.alias}[${f}]`,g,`CODER OUTPUT:
|
|
1619
1619
|
${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));if(h.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 _=t.membersByAlias.get(e.coder.alias);_!==void 0&&await Wt(t,n,_,e.write_back_durable_memory)}return V(t.workflow,e.outcomes.approve)}if(a=h.filter(g=>g.outcome==="request_changes").map(g=>g.text).join(`
|
|
1620
1620
|
|
|
1621
|
-
`),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:ee(t.workflow)}}var oL,Pg,Fg=b(()=>{"use strict";Tu();qe();oL=["blocked","failed","aborted"],Pg={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=>iL(t,t.state)}});import{spawnSync as aL}from"node:child_process";async function lL(t,e){let r=t.stateId,n=t.displayName,s=await Ke(e.command,t,n),o=Iu(t,n),i=mg(s);if(i.matched&&!o){let h=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:h.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"side_effect_without_pause",state_id:n,kind:i.kind,command:s,message:`ShellStep ${n} runs a classified side-effect command (${i.kind}) without a preceding approved gate`})}),t.dal.finishStep(h.id,null,`policy_violation:side_effect_without_pause:${i.kind}`),{kind:"terminal",terminal:ee(t.workflow)}}let a=new Date(Date.now()-1),l=typeof e.timeout_ms=="number"&&e.timeout_ms>0,c=aL("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:ee(t.workflow)});if(e.writes_to_project_path!==!0&&t.project.local_path.trim().length>0&&Nu(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:ee(t.workflow)};if(e.capture_output_to!==void 0){let h=c.stdout??"";t.dal.insertStepArtifact({step_id:u.id,kind:e.capture_output_to,content:h})}let m=String(c.status),p=e.outcomes_from_exit[m]??e.outcomes_from_exit.default;return p===void 0?(t.dal.insertStepArtifact({step_id:u.id,kind:"unhandled_exit",content:m}),t.dal.finishStep(u.id,null,`shell_step_unhandled_exit:${m}`),{kind:"terminal",terminal:"shell_step_unhandled_exit"}):(t.dal.finishStep(u.id,m,`exit=${c.status}`),Y(t,r,n,m),V(t.workflow,p))}var Ug,Wg=b(()=>{"use strict";qe();Ug={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=>lL(t,t.state)}});async function cL(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:ee(t.workflow)};let i=De(o.definition),a=await uL(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:ee(t.workflow)};Y(t,r,n,dL(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:ee(t.workflow)}:V(t.workflow,u)}async function uL(t,e){let r={};for(let[n,s]of Object.entries(e.inputs??{})){let o=await ig(s,t);r[n]=o===s?await Ci(s,t):o}return r}function dL(t,e,r){let n={};for(let s of r)n[s.name]=fL(t,e,s);return n}function fL(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=mL(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 mL(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 Bg,qg=b(()=>{"use strict";hn();qe();hs();Bg={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=>cL(t,t.state)}});function pL(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 Hg,Jg=b(()=>{"use strict";qe();Hg={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=>pL(t,t.state)}});async function hL(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=_L(t.cursor),a=o.filter(gL).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 _L(t){if(t===void 0)return 0;let e=Number(t);return Number.isFinite(e)?e:0}function gL(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 Xg,Gg=b(()=>{"use strict";Xg={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=>hL(t)}});async function yL(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 Kg,Vg=b(()=>{"use strict";Kg={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=>yL(t)}});function Yg(t){t.register(hg),t.register(Pg),t.register(wg),t.register(vg),t.register(Ng),t.register(Ag),t.register(Mg),t.register(Ug),t.register(gg),t.register(bg),t.register(Bg),t.register(Hg),t.register(Kg),t.register(Xg)}var zg=b(()=>{"use strict";_g();yg();Eg();Sg();Ig();$g();Og();Dg();Fg();Wg();qg();Jg();Gg();Vg()});function Wi(){return Ui===null&&(Ui=new xu,Yg(Ui)),Ui}var wL,xu,Ui,ju=b(()=>{"use strict";zg();wL={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"},xu=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:wL[e];return r?this.types.get(r):void 0}list(){return Array.from(this.types.values())}},Ui=null});async function ey(t){oy(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=bL(e.definition,t.workflow),s=t.job.run_id===null?null:t.dal.getRun(t.job.run_id),o=Es(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=K_(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(Es(n)){let m=Au({dal:t.dal,workflow:qi(n),job:t.job,project:r,run:i,membersByAlias:c,outcomes:s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},inputs:lr(t.job.payload)??{},team_id:t.team.id}),p=await ry(n,m,i.current_state??n.entry_step_id);return Qg(t.dal,r.id,i.id,n.name,p),p}let u=s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},d=Au({dal:t.dal,workflow:n,job:t.job,project:r,run:i,membersByAlias:c,outcomes:u,inputs:lr(t.job.payload)??{},team_id:t.team.id}),f=await ty(d,i.current_state??n.start_at);return Qg(t.dal,r.id,i.id,n.name,f),f}function Qg(t,e,r,n,s){if(s.paused===!0)return;let o=s.terminal_state;if(o===null)return;let i="unknown",a=!1;try{let u=t.getRun(r);if(u!==null){let d=t.getWorkflow(u.workflow_id);if(d!==null){let f=JSON.parse(d.definition),p=(f.terminals??{})[o];if(p!==void 0&&typeof p.kind=="string"&&(p.kind==="success"||p.kind==="failure"||p.kind==="neutral")&&(i=p.kind),i==="unknown"&&Array.isArray(f.steps)){for(let g of f.steps)if(g.type==="lmctl/terminal"&&g.parameters!==null&&typeof g.parameters=="object"){let _=g.parameters;if(_.name===o&&(_.kind==="success"||_.kind==="failure"||_.kind==="neutral")){i=_.kind;break}}}let h=f.errors;if(h!==null&&typeof h=="object"){let g=h;(g.on_unhandled_failure!==void 0||g.on_unhandled_failure_state!==void 0)&&(a=!0)}}}}catch{}if(i==="success"||i==="failure"&&a)return;let l=null;try{l=t.query("SELECT status_detail FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",r)[0]?.status_detail??null}catch{l=null}let c=i==="failure"?"workflow_failed":"workflow_has_issues";t.raiseAttention({kind:c,severity:i==="failure"?"error":"warn",project_id:e,run_id:r,payload:JSON.stringify({run_id:r,workflow_name:n,terminal_state:o,terminal_kind:i,last_error:l})})}function Au(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 Ru(e,r,n,s?.display_name??r)}finally{e.parent_step_id=o,e.iteration=i}},runChildWorkflow:async(r,n,s)=>{oy(n);let o=Es(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=Au({dal:t.dal,workflow:Es(n)?qi(n):n,job:t.job,project:t.project,run:i,membersByAlias:t.membersByAlias,outcomes:{},inputs:s,team_id:t.team_id});return Es(n)?ry(n,a,i.current_state??n.entry_step_id):ty(a,i.current_state??n.start_at)}};return e}async function ty(t,e){let r=e;if(r.startsWith(_s))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 Bt(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=Bi(t,ee(t.workflow));if(l.kind==="paused")return Pe(t);if(l.kind==="escalate")return nt(t,{id:r,name:r,type:"unknown"},l.token,l.reason),Pe(t);if(l.kind==="terminal")return Bt(t,l.terminal);r=l.state;continue}let i,a=sy(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===Fn)return Bt(t,hl);let c=o.outcomes?.[a];i=c!==void 0?V(t.workflow,c):nt(t,{id:r,name:r,type:o.type},a,`no declared edge for resumed outcome '${a}' from state '${r}'`)}else i=await Ru(t,r,o);if(i.kind==="paused")return Pe(t);if(i.kind==="escalate")return nt(t,{id:r,name:r,type:o.type},i.token,i.reason),Pe(t);if(i.kind==="terminal"){let l=Bi(t,i.terminal);if(l.kind==="paused")return Pe(t);if(l.kind==="escalate")return nt(t,{id:r,name:r,type:o.type},l.token,l.reason),Pe(t);if(l.kind==="terminal")return Bt(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=Bi(t,ee(t.workflow));return n.kind==="terminal"?Bt(t,n.terminal):Bt(t,ee(t.workflow))}async function ry(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 nt(e,{id:o,name:o,type:"unknown"},"",`internal:unknown v3 step '${o}'`),Pe(e);let l=sy(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===Fn)return Bt(e,hl);let p=Object.keys(t.connections[a.id]??{}),h=t.connections[a.id]?.[l]?.[0]?.[0]?.step_id??t.connections[a.id]?.main?.[0]?.[0]?.step_id;if(h===void 0)return nt(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}),Pe(e);o=h;continue}let c=await EL(e,t,a);if(c.kind==="paused")return Pe(e);let u=Object.keys(t.connections[a.id]??{});if(c.kind==="escalate")return nt(e,{id:a.id,name:a.name,type:a.type},c.token,c.reason,{declared_outcomes:u}),Pe(e);let d=c.kind==="terminal"?c.terminal:c.state;if(a.type==="lmctl/terminal"){let m=e.workflow;e.workflow=qi(t,a);try{let p=Bi(e,d);if(p.kind==="paused")return Pe(e);if(p.kind==="escalate")return nt(e,{id:a.id,name:a.name,type:a.type},p.token,p.reason),Pe(e);if(p.kind==="terminal")return Bt(e,p.terminal);let h=s.get(p.state);if(h===void 0)return nt(e,{id:a.id,name:a.name,type:a.type},"",`internal:unknown v3 error handler step '${p.state}'`),Pe(e);o=h.id;continue}finally{e.workflow=m}}if(Hr(d))return nt(e,{id:a.id,name:a.name,type:a.type},d,`generic escalation '${d}' from step '${a.id}'`,{declared_outcomes:u}),Pe(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 nt(e,{id:a.id,name:a.name,type:a.type},d,`no declared edge for outcome '${d}' from step '${a.id}'`,{declared_outcomes:u}),Pe(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})}),Bt(e,"aborted")}async function EL(t,e,r){let n=ny(e,r),s=t.workflow;t.workflow=qi(e,r);try{return await Ru(t,r.id,n,r.name)}finally{t.workflow=s}}function ny(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 Ru(t,e,r,n){let s=Wi().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?kL(t,s):void 0,t.progress_step_id=null;try{return await s.execute(dg(t,e,r,n??e))}finally{t.emit_progress=o,t.progress_step_id=i}}function bL(t,e){try{let r=JSON.parse(t);if(SL(r)&&r.definition_schema_version===3)return bt.parse(r)}catch{return e}return e}function Es(t){return t.definition_schema_version===3}function qi(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]=ny(t,o))}return e?.type==="lmctl/terminal"&&typeof e.parameters.name=="string"&&(n[e.parameters.name]={kind:TL(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 TL(t){return t==="success"||t==="failure"||t==="neutral"?t:"neutral"}function SL(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function kL(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 Bt(t,e){t.dal.setRunTerminalState(t.run_id,e);try{H_(t.run_id,t.dal)}catch{}return{run_id:t.run_id,terminal_state:e,steps_executed:t.steps_executed}}function Pe(t){return{run_id:t.run_id,terminal_state:null,steps_executed:t.steps_executed,paused:!0}}function sy(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 Bi(t,e){if(!vL(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&&IL(t,e,r.on_unhandled_failure),{kind:"terminal",terminal:e}))}function vL(t,e){return t.definition_schema_version===2&&t.terminals[e]?.kind==="failure"}function IL(t,e,r){let n=NL(t),s=r.capture_evidence&&n!==null?$L(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 NL(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 $L(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 oy(t){if(!Zg.includes(t.definition_schema_version))throw new Error(`unsupported definition_schema_version ${t.definition_schema_version}; supported versions: ${Zg.join(", ")}`)}var Zg,iy=b(()=>{"use strict";mn();J_();V_();qe();ju();Un();Zg=[1,2,3]});import{readFileSync as xL,readdirSync as jL}from"node:fs";import{basename as AL,join as RL,resolve as OL}from"node:path";function cy(t={}){let e=OL(t.workflowsDir??"workflows"),r=jL(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=>LL(RL(e,n)))}}function LL(t){let e=AL(t);try{let r=xL(t,"utf8"),n=De(r);return fy(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:my(r)}}}function uy(t,e){try{let r=De(e);return fy(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:my(r)}}}function dy(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(`
|
|
1621
|
+
`),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:ee(t.workflow)}}var oL,Pg,Fg=b(()=>{"use strict";Tu();qe();oL=["blocked","failed","aborted"],Pg={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=>iL(t,t.state)}});import{spawnSync as aL}from"node:child_process";async function lL(t,e){let r=t.stateId,n=t.displayName,s=await Ke(e.command,t,n),o=Iu(t,n),i=mg(s);if(i.matched&&!o){let h=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:h.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"side_effect_without_pause",state_id:n,kind:i.kind,command:s,message:`ShellStep ${n} runs a classified side-effect command (${i.kind}) without a preceding approved gate`})}),t.dal.finishStep(h.id,null,`policy_violation:side_effect_without_pause:${i.kind}`),{kind:"terminal",terminal:ee(t.workflow)}}let a=new Date(Date.now()-1),l=typeof e.timeout_ms=="number"&&e.timeout_ms>0,c=aL("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:ee(t.workflow)});if(e.writes_to_project_path!==!0&&t.project.local_path.trim().length>0&&Nu(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:ee(t.workflow)};if(e.capture_output_to!==void 0){let h=c.stdout??"";t.dal.insertStepArtifact({step_id:u.id,kind:e.capture_output_to,content:h})}let m=String(c.status),p=e.outcomes_from_exit[m]??e.outcomes_from_exit.default;return p===void 0?(t.dal.insertStepArtifact({step_id:u.id,kind:"unhandled_exit",content:m}),t.dal.finishStep(u.id,null,`shell_step_unhandled_exit:${m}`),{kind:"terminal",terminal:"shell_step_unhandled_exit"}):(t.dal.finishStep(u.id,m,`exit=${c.status}`),Y(t,r,n,m),V(t.workflow,p))}var Ug,Wg=b(()=>{"use strict";qe();Ug={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=>lL(t,t.state)}});async function cL(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:ee(t.workflow)};let i=De(o.definition),a=await uL(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:ee(t.workflow)};Y(t,r,n,dL(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:ee(t.workflow)}:V(t.workflow,u)}async function uL(t,e){let r={};for(let[n,s]of Object.entries(e.inputs??{})){let o=await ig(s,t);r[n]=o===s?await Ci(s,t):o}return r}function dL(t,e,r){let n={};for(let s of r)n[s.name]=fL(t,e,s);return n}function fL(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=mL(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 mL(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 Bg,qg=b(()=>{"use strict";hn();qe();hs();Bg={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=>cL(t,t.state)}});function pL(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 Hg,Jg=b(()=>{"use strict";qe();Hg={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=>pL(t,t.state)}});async function hL(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=_L(t.cursor),a=o.filter(gL).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 _L(t){if(t===void 0)return 0;let e=Number(t);return Number.isFinite(e)?e:0}function gL(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 Xg,Gg=b(()=>{"use strict";Xg={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=>hL(t)}});async function wL(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 Kg,Vg=b(()=>{"use strict";Kg={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=>wL(t)}});function Yg(t){t.register(hg),t.register(Pg),t.register(yg),t.register(vg),t.register(Ng),t.register(Ag),t.register(Mg),t.register(Ug),t.register(gg),t.register(bg),t.register(Bg),t.register(Hg),t.register(Kg),t.register(Xg)}var zg=b(()=>{"use strict";_g();wg();Eg();Sg();Ig();$g();Og();Dg();Fg();Wg();qg();Jg();Gg();Vg()});function Wi(){return Ui===null&&(Ui=new xu,Yg(Ui)),Ui}var yL,xu,Ui,ju=b(()=>{"use strict";zg();yL={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"},xu=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:yL[e];return r?this.types.get(r):void 0}list(){return Array.from(this.types.values())}},Ui=null});async function ew(t){ow(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=bL(e.definition,t.workflow),s=t.job.run_id===null?null:t.dal.getRun(t.job.run_id),o=Es(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=K_(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(Es(n)){let m=Au({dal:t.dal,workflow:qi(n),job:t.job,project:r,run:i,membersByAlias:c,outcomes:s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},inputs:lr(t.job.payload)??{},team_id:t.team.id}),p=await rw(n,m,i.current_state??n.entry_step_id);return Qg(t.dal,r.id,i.id,n.name,p),p}let u=s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},d=Au({dal:t.dal,workflow:n,job:t.job,project:r,run:i,membersByAlias:c,outcomes:u,inputs:lr(t.job.payload)??{},team_id:t.team.id}),f=await tw(d,i.current_state??n.start_at);return Qg(t.dal,r.id,i.id,n.name,f),f}function Qg(t,e,r,n,s){if(s.paused===!0)return;let o=s.terminal_state;if(o===null)return;let i="unknown",a=!1;try{let u=t.getRun(r);if(u!==null){let d=t.getWorkflow(u.workflow_id);if(d!==null){let f=JSON.parse(d.definition),p=(f.terminals??{})[o];if(p!==void 0&&typeof p.kind=="string"&&(p.kind==="success"||p.kind==="failure"||p.kind==="neutral")&&(i=p.kind),i==="unknown"&&Array.isArray(f.steps)){for(let g of f.steps)if(g.type==="lmctl/terminal"&&g.parameters!==null&&typeof g.parameters=="object"){let _=g.parameters;if(_.name===o&&(_.kind==="success"||_.kind==="failure"||_.kind==="neutral")){i=_.kind;break}}}let h=f.errors;if(h!==null&&typeof h=="object"){let g=h;(g.on_unhandled_failure!==void 0||g.on_unhandled_failure_state!==void 0)&&(a=!0)}}}}catch{}if(i==="success"||i==="failure"&&a)return;let l=null;try{l=t.query("SELECT status_detail FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",r)[0]?.status_detail??null}catch{l=null}let c=i==="failure"?"workflow_failed":"workflow_has_issues";t.raiseAttention({kind:c,severity:i==="failure"?"error":"warn",project_id:e,run_id:r,payload:JSON.stringify({run_id:r,workflow_name:n,terminal_state:o,terminal_kind:i,last_error:l})})}function Au(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 Ru(e,r,n,s?.display_name??r)}finally{e.parent_step_id=o,e.iteration=i}},runChildWorkflow:async(r,n,s)=>{ow(n);let o=Es(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=Au({dal:t.dal,workflow:Es(n)?qi(n):n,job:t.job,project:t.project,run:i,membersByAlias:t.membersByAlias,outcomes:{},inputs:s,team_id:t.team_id});return Es(n)?rw(n,a,i.current_state??n.entry_step_id):tw(a,i.current_state??n.start_at)}};return e}async function tw(t,e){let r=e;if(r.startsWith(_s))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 Bt(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=Bi(t,ee(t.workflow));if(l.kind==="paused")return Pe(t);if(l.kind==="escalate")return nt(t,{id:r,name:r,type:"unknown"},l.token,l.reason),Pe(t);if(l.kind==="terminal")return Bt(t,l.terminal);r=l.state;continue}let i,a=sw(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===Fn)return Bt(t,hl);let c=o.outcomes?.[a];i=c!==void 0?V(t.workflow,c):nt(t,{id:r,name:r,type:o.type},a,`no declared edge for resumed outcome '${a}' from state '${r}'`)}else i=await Ru(t,r,o);if(i.kind==="paused")return Pe(t);if(i.kind==="escalate")return nt(t,{id:r,name:r,type:o.type},i.token,i.reason),Pe(t);if(i.kind==="terminal"){let l=Bi(t,i.terminal);if(l.kind==="paused")return Pe(t);if(l.kind==="escalate")return nt(t,{id:r,name:r,type:o.type},l.token,l.reason),Pe(t);if(l.kind==="terminal")return Bt(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=Bi(t,ee(t.workflow));return n.kind==="terminal"?Bt(t,n.terminal):Bt(t,ee(t.workflow))}async function rw(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 nt(e,{id:o,name:o,type:"unknown"},"",`internal:unknown v3 step '${o}'`),Pe(e);let l=sw(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===Fn)return Bt(e,hl);let p=Object.keys(t.connections[a.id]??{}),h=t.connections[a.id]?.[l]?.[0]?.[0]?.step_id??t.connections[a.id]?.main?.[0]?.[0]?.step_id;if(h===void 0)return nt(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}),Pe(e);o=h;continue}let c=await EL(e,t,a);if(c.kind==="paused")return Pe(e);let u=Object.keys(t.connections[a.id]??{});if(c.kind==="escalate")return nt(e,{id:a.id,name:a.name,type:a.type},c.token,c.reason,{declared_outcomes:u}),Pe(e);let d=c.kind==="terminal"?c.terminal:c.state;if(a.type==="lmctl/terminal"){let m=e.workflow;e.workflow=qi(t,a);try{let p=Bi(e,d);if(p.kind==="paused")return Pe(e);if(p.kind==="escalate")return nt(e,{id:a.id,name:a.name,type:a.type},p.token,p.reason),Pe(e);if(p.kind==="terminal")return Bt(e,p.terminal);let h=s.get(p.state);if(h===void 0)return nt(e,{id:a.id,name:a.name,type:a.type},"",`internal:unknown v3 error handler step '${p.state}'`),Pe(e);o=h.id;continue}finally{e.workflow=m}}if(Hr(d))return nt(e,{id:a.id,name:a.name,type:a.type},d,`generic escalation '${d}' from step '${a.id}'`,{declared_outcomes:u}),Pe(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 nt(e,{id:a.id,name:a.name,type:a.type},d,`no declared edge for outcome '${d}' from step '${a.id}'`,{declared_outcomes:u}),Pe(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})}),Bt(e,"aborted")}async function EL(t,e,r){let n=nw(e,r),s=t.workflow;t.workflow=qi(e,r);try{return await Ru(t,r.id,n,r.name)}finally{t.workflow=s}}function nw(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 Ru(t,e,r,n){let s=Wi().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?kL(t,s):void 0,t.progress_step_id=null;try{return await s.execute(dg(t,e,r,n??e))}finally{t.emit_progress=o,t.progress_step_id=i}}function bL(t,e){try{let r=JSON.parse(t);if(SL(r)&&r.definition_schema_version===3)return bt.parse(r)}catch{return e}return e}function Es(t){return t.definition_schema_version===3}function qi(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]=nw(t,o))}return e?.type==="lmctl/terminal"&&typeof e.parameters.name=="string"&&(n[e.parameters.name]={kind:TL(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 TL(t){return t==="success"||t==="failure"||t==="neutral"?t:"neutral"}function SL(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function kL(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 Bt(t,e){t.dal.setRunTerminalState(t.run_id,e);try{H_(t.run_id,t.dal)}catch{}return{run_id:t.run_id,terminal_state:e,steps_executed:t.steps_executed}}function Pe(t){return{run_id:t.run_id,terminal_state:null,steps_executed:t.steps_executed,paused:!0}}function sw(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 Bi(t,e){if(!vL(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&&IL(t,e,r.on_unhandled_failure),{kind:"terminal",terminal:e}))}function vL(t,e){return t.definition_schema_version===2&&t.terminals[e]?.kind==="failure"}function IL(t,e,r){let n=NL(t),s=r.capture_evidence&&n!==null?$L(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 NL(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 $L(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 ow(t){if(!Zg.includes(t.definition_schema_version))throw new Error(`unsupported definition_schema_version ${t.definition_schema_version}; supported versions: ${Zg.join(", ")}`)}var Zg,iw=b(()=>{"use strict";mn();J_();V_();qe();ju();Un();Zg=[1,2,3]});import{readFileSync as xL,readdirSync as jL}from"node:fs";import{basename as AL,join as RL,resolve as OL}from"node:path";function cw(t={}){let e=OL(t.workflowsDir??"workflows"),r=jL(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=>LL(RL(e,n)))}}function LL(t){let e=AL(t);try{let r=xL(t,"utf8"),n=De(r);return fw(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:mw(r)}}}function uw(t,e){try{let r=De(e);return fw(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:mw(r)}}}function dw(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(`
|
|
1622
1622
|
`)}
|
|
1623
|
-
`}function
|
|
1623
|
+
`}function fw(t,e){let r=ML(e),n=DL(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=CL(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 CL(t){return(t??[]).filter(e=>e.required===!0&&e.default===void 0).map(e=>e.name)}function ML(t){return Ou(t)?t.entry_step_id:t.start_at}function DL(t){return Ou(t)?t.steps.find(e=>e.id===t.entry_step_id)?.type??null:t.states[t.start_at]?.type??null}function Ou(t){return t.definition_schema_version===3}function mw(t){return t instanceof Ut?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 pw(t){let e=new Set;if(Ou(t))for(let r of t.steps){let n=r.members??{};aw(n,e)}else for(let r of Object.values(t.states))aw(r,e);return[...e].sort()}function aw(t,e){let r=["coder","agent","consolidator"],n=["reviewers","researchers"];for(let s of r){let o=t[s],i=lw(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=lw(i);a!==null&&e.add(a)}}}function lw(t){if(t===null||typeof t!="object")return null;let e=t.alias;return typeof e=="string"&&e.length>0?e:null}var Hi=b(()=>{"use strict";hn()});function PL({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,Ji)[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}=FL(t,r,i);if(a<20)continue;let c=i??"initial",u=`${bs}:${r.id}:${c}`;t.enqueueJob({project_id:r.id,source:Ji,source_ref:bs,payload:JSON.stringify({kind:bs,project_id:r.id,completed_sessions:a,max_run_id:l,since_run_id:i}),dedupe_key:u})}}function FL(t,e,r){let n=t.query(`SELECT COUNT(*) AS cnt, MAX(r.id) AS max_id
|
|
1624
1624
|
FROM run r
|
|
1625
1625
|
JOIN job j ON j.id = r.job_id
|
|
1626
1626
|
WHERE j.project_id = ?
|
|
1627
1627
|
AND r.terminal_state IS NOT NULL
|
|
1628
|
-
${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
|
|
1628
|
+
${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 hw(t){for(let e of UL)try{e(t)}catch{}}var Ji,bs,UL,Lu=b(()=>{"use strict";Ji="memory_policy",bs="memory_consolidation_request";UL=[PL]});var bw={};le(bw,{getOrInsertConsolidationWorkflow:()=>gw,runJobById:()=>Ts,runOnce:()=>Lr,startWorker:()=>JL});import{createHash as WL}from"node:crypto";import{readFileSync as BL}from"node:fs";import{pathToFileURL as qL}from"node:url";function gw(t,e="durable-memory-consolidation-v2"){let r=t.getWorkflowByName(e);if(r!==null)return r;try{ni({swallow:!0});let n=si(e);if(n===null)return null;let s=BL(n,"utf8"),o=De(s);return t.insertWorkflow({name:e,version:o.version,definition_schema_version:o.definition_schema_version,definition:s,source_uri:qL(n).href,source_sha256:WL("sha256").update(s).digest("hex")})}catch{return null}}async function Lr(t){let e=Date.now(),r=null;try{return r=t.dal.claimNextJobWithConcurrency({worker_id:t.worker_id,lease_ms:t.lease_ms??_w,evaluator:n=>yw(t.dal,n)}),r===null?null:await ww(t.dal,r,e)}catch(n){if(r!==null)return dr(t.dal,r,"worker_run_failed",Or(n),e);try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:Xi(Or(n))})})}catch{}return null}finally{t.max_concurrent}}async function Ts(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??_w,evaluator:s=>yw(t.dal,s)});return n.claimed?(r=n.job,{claimed:!0,...await ww(t.dal,r,e)}):n}catch(n){if(r!==null)return{claimed:!0,...dr(t.dal,r,"worker_run_failed",Or(n),e)};try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:Xi(Or(n)),job_id:t.job_id})})}catch{}return{claimed:!1,reason:"not_claimable",job_id:t.job_id}}finally{t.max_concurrent}}async function ww(t,e,r){let n=t.getProjectByJob(e.id);if(n===null)return dr(t,e,"worker_project_missing","project_not_found",r);let s=e.source===Ji&&e.source_ref===bs,o=e.run_id===null?null:t.getRun(e.run_id),i;if(o!==null?i=t.getWorkflow(o.workflow_id):s?i=gw(t):i=Ew(t,e,n),i===null)return dr(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 dr(t,e,"worker_team_missing","team_not_found",r,n);let c;try{c=De(i.definition)}catch(d){return dr(t,e,"worker_workflow_invalid",Or(d),r,n)}let u=XL(c,l);if(u.length>0)return dr(t,e,"worker_team_missing_aliases",`missing_aliases:${u.join(",")}`,r,n,a);try{let d=await ew({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 dr(t,e,"worker_run_failed",Or(d),r,n,a)}}function yw(t,e){let r=t.getProjectByJob(e.id);if(r===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let n=Ew(t,e,r);if(n===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let s=null;try{s=De(n.definition)}catch{s=null}return ki({workflow:s,job:e,project:r})}function Ew(t,e,r){return e.workflow_id_override!==null?t.getWorkflow(e.workflow_id_override):t.getWorkflowByName(r.workflow_name)}async function JL(t){let e=!1,r=null,n=Promise.resolve(),s=async()=>{if(!e){try{let o;do o=await Lr(t);while(!e&&o!==null)}catch(o){try{t.dal.raiseAttention({kind:"worker_loop_error",severity:"error",payload:JSON.stringify({error:Xi(Or(o))})})}catch{}}e||(r=setTimeout(()=>{n=s()},t.poll_interval_ms??HL))}};return n=s(),{stop:async()=>{e=!0,r!==null&&clearTimeout(r),await n.catch(()=>{})}}}function dr(t,e,r,n,s,o,i){let a=Xi(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 Or(t){return t instanceof Error?t.message:String(t)}function Xi(t){return t.length>4096?t.slice(0,4096):t}function XL(t,e){let r=pw(t);if(r.length===0)return[];let n=new Set(e.map(s=>s.alias));return r.filter(s=>!n.has(s))}var _w,HL,Ss=b(()=>{"use strict";oi();iw();hn();Hi();nu();Lu();_w=6e5,HL=5e3});import{existsSync as GL,readFileSync as KL}from"node:fs";import{marked as VL}from"marked";function vw(t,e){t.get("/layman",r=>r.html(Oe("Layman Home",YL(e.dal)))),t.get("/api/layman",r=>r.json(xw(e.dal))),t.get("/layman/start/:workflow",r=>{let n=kw(r);return n===null?r.notFound():r.html(Oe(`Start ${bn(n)}`,QL(e.dal,n)))}),t.post("/layman/start/:workflow",async r=>{let n=kw(r);return n===null?r.notFound():n==="newspaper"?Tw(r,e.dal):eC(r,e.dal,n)}),t.get("/layman/run/:id",r=>{let n=Nr(e.dal,Gi(r,"id"));return n===null?r.notFound():r.html(Oe(`Run ${n.id}`,nC(e.dal,n)))}),t.get("/api/layman/run/:id",r=>{let n=Nr(e.dal,Gi(r,"id"));return n===null?r.notFound():r.json(pC(e.dal,n))}),t.post("/layman/run/:id/respond",async r=>oC(r,e.dal)),t.get("/layman/newspaper",r=>r.html(Oe("Newspaper Subscriptions",fC(e.dal)))),t.post("/layman/newspaper",r=>Tw(r,e.dal)),t.delete("/layman/newspaper/:id",r=>Sw(r,e.dal)),t.post("/layman/newspaper/:id/delete",r=>Sw(r,e.dal))}function YL(t){let e=xw(t);return`<section class="layman-home">
|
|
1629
1629
|
<h1>Welcome</h1>
|
|
1630
1630
|
<p class="muted">Choose a workflow and answer a few plain-language prompts.</p>
|
|
1631
1631
|
<div class="grid">${Ki.map(zL).join("")}</div>
|
|
@@ -1640,7 +1640,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
|
|
|
1640
1640
|
<h2>${T(t.title)}</h2>
|
|
1641
1641
|
<p>${T(t.description)}</p>
|
|
1642
1642
|
<p><a href="/layman/start/${encodeURIComponent(t.name)}">Start</a></p>
|
|
1643
|
-
</article>`}function ZL(t){return fe(["run","workflow","state","started"],t.map(e=>[`<a href="/layman/run/${e.id}">${T(e.id)}</a>`,T(bn(e.workflow_name)),T(e.terminal_state??e.current_state??"queued"),T(e.started_at)]))}function QL(t,e){let r=t.getWorkflowByName(e),n=t.listProjects();if(r===null)return`<h1>${T(bn(e))}</h1><p class="error">This workflow has not been loaded yet.</p>`;if(n.length===0)return`<h1>${T(bn(e))}</h1><p class="error">Create a project before starting a workflow.</p>`;let s=
|
|
1643
|
+
</article>`}function ZL(t){return fe(["run","workflow","state","started"],t.map(e=>[`<a href="/layman/run/${e.id}">${T(e.id)}</a>`,T(bn(e.workflow_name)),T(e.terminal_state??e.current_state??"queued"),T(e.started_at)]))}function QL(t,e){let r=t.getWorkflowByName(e),n=t.listProjects();if(r===null)return`<h1>${T(bn(e))}</h1><p class="error">This workflow has not been loaded yet.</p>`;if(n.length===0)return`<h1>${T(bn(e))}</h1><p class="error">Create a project before starting a workflow.</p>`;let s=Iw(n);return e==="info-qa"?`<h1>Ask a Question</h1>
|
|
1644
1644
|
<form method="post" action="/layman/start/info-qa">
|
|
1645
1645
|
${s}
|
|
1646
1646
|
<label>Ask anything<textarea name="question" rows="8" required></textarea></label>
|
|
@@ -1653,12 +1653,12 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
|
|
|
1653
1653
|
<label>Slug<input name="slug" placeholder="my-document" required></label>
|
|
1654
1654
|
<label>Output directory<input name="output_dir" value="drafts"></label>
|
|
1655
1655
|
<button type="submit">Start Document Wizard</button>
|
|
1656
|
-
</form>`:$
|
|
1657
|
-
<p><a href="/layman">Layman home</a></p>`;if(e.terminal_state!==null)return`${n}${aC(t,e,r)}`;let s=
|
|
1656
|
+
</form>`:$w(n,"/layman/start/newspaper")}function Iw(t){return`<label>Project<select name="project_id" required>${t.map(e=>`<option value="${T(e.id)}">${T(e.name)}</option>`).join("")}</select></label>`}async function eC(t,e,r){let n=await t.req.parseBody(),s=Rw(e,n);if(s===null)return t.html(Oe("Start workflow",'<p class="error">Choose a valid project.</p>'),400);let o=e.getWorkflowByName(r);if(o===null)return t.html(Oe("Start workflow",`<p class="error">${T(bn(r))} is not loaded.</p>`),400);let i=r==="info-qa"?tC(n):rC(n);if(typeof i=="string")return t.html(Oe("Start workflow",`<p class="error">${T(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 Lr({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 tC(t){let e=Ve(t.question).trim();if(e.length===0)return"Enter a question.";let r=Ve(t.output_path).trim();return{question:e,...r.length>0?{output_path:r}:{}}}function rC(t){let e=Ve(t.task_description).trim(),r=bC(Ve(t.slug).trim()),n=Ve(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 nC(t,e){let r=e.workflow?.name??"unknown",n=`<h1>${T(bn(r))}</h1>
|
|
1657
|
+
<p><a href="/layman">Layman home</a></p>`;if(e.terminal_state!==null)return`${n}${aC(t,e,r)}`;let s=Aw(t,e);return s!==null&&s.status==="waiting_operator"?`${n}${sC(e,s)}`:`${n}<section hx-get="/layman/run/${T(e.id)}" hx-trigger="every 2s" hx-swap="outerHTML">
|
|
1658
1658
|
<h2>Running</h2>
|
|
1659
1659
|
<p class="muted">Current stage: <strong>${T(e.current_state??"starting")}</strong></p>
|
|
1660
|
-
${
|
|
1661
|
-
</section>`}function
|
|
1660
|
+
${Nw(e)}
|
|
1661
|
+
</section>`}function Nw(t){let e=t.steps.map(r=>[T(r.id),T(`\u25B6 ${r.state_name}`),T(r.outcome??"running"),T(r.status_detail??"")]);return fe(["step","stage","outcome","detail"],e)}function sC(t,e){return`<section class="metric paused-interactive">
|
|
1662
1662
|
<h2>${T(gC(e.state_name))}</h2>
|
|
1663
1663
|
<p class="muted">The agent is waiting for your response.</p>
|
|
1664
1664
|
<h3>Agent output</h3>
|
|
@@ -1669,20 +1669,20 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
|
|
|
1669
1669
|
<button type="submit" name="done" value="false">Send response</button>
|
|
1670
1670
|
<button type="submit" name="done" value="true">Done with this stage</button>
|
|
1671
1671
|
</form>
|
|
1672
|
-
</section>`}async function oC(t,e){let r=Gi(t,"id"),n=await t.req.parseBody(),s=Number(Ve(n.step_id)),o=Ve(n.input),i=Ve(n.done)==="true";if(!Number.isInteger(s))return t.html(Oe("Interactive response",'<p class="error">Missing interactive step.</p>'),400);let a=e.resumeInteractive(s,o,i);return a.resumed?(iC(e,a.run.id),await Lr({dal:e,worker_id:`layman-respond-${Date.now()}`}),t.redirect(`/layman/run/${r}`,302)):t.html(Oe("Interactive response",`<p class="error">Could not submit response: ${T(a.reason)}</p>`),400)}function iC(t,e){let r=t.getRun(e);if(r===null||r.current_state===null)return;let n=t.getWorkflow(r.workflow_id);if(n!==null)try{let s=JSON.parse(n.definition);if(!Mu(s)||s.definition_schema_version!==3||!Array.isArray(s.steps))return;let o=s.steps.find(i=>Mu(i)&&i.name===r.current_state&&typeof i.id=="string");Mu(o)&&typeof o.id=="string"&&t.setRunCurrentState(r.id,o.id)}catch{return}}function aC(t,e,r){let n=
|
|
1672
|
+
</section>`}async function oC(t,e){let r=Gi(t,"id"),n=await t.req.parseBody(),s=Number(Ve(n.step_id)),o=Ve(n.input),i=Ve(n.done)==="true";if(!Number.isInteger(s))return t.html(Oe("Interactive response",'<p class="error">Missing interactive step.</p>'),400);let a=e.resumeInteractive(s,o,i);return a.resumed?(iC(e,a.run.id),await Lr({dal:e,worker_id:`layman-respond-${Date.now()}`}),t.redirect(`/layman/run/${r}`,302)):t.html(Oe("Interactive response",`<p class="error">Could not submit response: ${T(a.reason)}</p>`),400)}function iC(t,e){let r=t.getRun(e);if(r===null||r.current_state===null)return;let n=t.getWorkflow(r.workflow_id);if(n!==null)try{let s=JSON.parse(n.definition);if(!Mu(s)||s.definition_schema_version!==3||!Array.isArray(s.steps))return;let o=s.steps.find(i=>Mu(i)&&i.name===r.current_state&&typeof i.id=="string");Mu(o)&&typeof o.id=="string"&&t.setRunCurrentState(r.id,o.id)}catch{return}}function aC(t,e,r){let n=wC(e.terminal_state);return`<section class="metric terminal-run">
|
|
1673
1673
|
<h2>${n?"Complete":"Stopped"}</h2>
|
|
1674
1674
|
<p>Status: <strong>${T(e.terminal_state)}</strong></p>
|
|
1675
1675
|
${n?lC(t,e,r):uC(e)}
|
|
1676
1676
|
<h2>Stage Log</h2>
|
|
1677
|
-
${
|
|
1677
|
+
${Nw(e)}
|
|
1678
1678
|
</section>`}function lC(t,e,r){if(r==="info-qa"){let n=Pu(e,["info_qa_consolidated"]);return`<h3>Answer</h3><div class="metric">${Fu(n??"No answer artifact was recorded yet.")}</div>`}if(r==="document-creation")return cC(t,e);if(r==="newspaper"){let n=Pu(e,["newspaper_consolidated"]);return`<h3>Digest</h3><div class="metric">${Fu(n??"No digest artifact was recorded yet.")}</div>`}return'<p class="muted">No layman output renderer for this workflow.</p>'}function cC(t,e){let r=$r(t,e.id),n=Cu(r,["render_docx"]),s=Cu(r,["render_xlsx"]),o=Pu(e,["review:coder[0]_transcript","chat_output_md"])??dC(Cu(r,["document_md","markdown"])),i=[n,s].filter(a=>a!==null).map(a=>`<li><a href="file://${T(a)}">${T(a)}</a></li>`).join("");return`<h3>Document Preview</h3>
|
|
1679
|
-
<pre>${T(EC(
|
|
1679
|
+
<pre>${T(EC(yC(o??"No preview available."),30))}</pre>
|
|
1680
1680
|
<h3>Downloads</h3>
|
|
1681
1681
|
${i.length>0?`<ul>${i}</ul>`:'<p class="muted">No rendered files found yet.</p>'}`}function uC(t){let e=[...t.steps].reverse().find(r=>r.status_detail!==null);return`<p class="error">${T(e?.status_detail??"The workflow did not complete successfully.")}</p>`}function Pu(t,e){for(let r of[...t.steps].reverse())for(let n of e){let s=[...r.artifacts].reverse().find(o=>o.kind===n&&o.content!==null);if(s?.content!==null&&s?.content!==void 0)return s.content}return null}function Cu(t,e){for(let r of[...t].reverse())if(e.includes(r.kind)&&r.path!==null)return r.path;return null}function dC(t){if(t===null||!GL(t)||!t.endsWith(".md"))return null;try{return KL(t,"utf8")}catch{return null}}function fC(t){let e=t.listProjects();return`<h1>Newspaper Subscriptions</h1>
|
|
1682
|
-
${mC(
|
|
1682
|
+
${mC(jw(t))}
|
|
1683
1683
|
<h2>Add Subscription</h2>
|
|
1684
|
-
${e.length===0?'<p class="error">Create a project before subscribing.</p>':$
|
|
1685
|
-
${
|
|
1684
|
+
${e.length===0?'<p class="error">Create a project before subscribing.</p>':$w(e,"/layman/newspaper")}`}function $w(t,e){return`<form method="post" action="${T(e)}">
|
|
1685
|
+
${Iw(t)}
|
|
1686
1686
|
<label>Topics<textarea name="topics" rows="5" placeholder="local news, AI safety, climate" required></textarea></label>
|
|
1687
1687
|
<label>Schedule<select name="schedule">
|
|
1688
1688
|
<option value="daily">Daily at 6am</option>
|
|
@@ -1692,31 +1692,31 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
|
|
|
1692
1692
|
<label>Custom cron<input name="cron" placeholder="0 6 * * *"></label>
|
|
1693
1693
|
<label>Output directory<input name="output_dir" value="digests"></label>
|
|
1694
1694
|
<button type="submit">Create subscription</button>
|
|
1695
|
-
</form>`}async function
|
|
1695
|
+
</form>`}async function Tw(t,e){let r=await t.req.parseBody(),n=Rw(e,r);if(n===null)return t.html(Oe("Newspaper",'<p class="error">Choose a valid project.</p>'),400);let s=e.getWorkflowByName("newspaper");if(s===null)return t.html(Oe("Newspaper",'<p class="error">The newspaper workflow is not loaded.</p>'),400);let o=Ve(r.topics).split(/[\n,]/).map(a=>a.trim()).filter(a=>a.length>0);if(o.length===0)return t.html(Oe("Newspaper",'<p class="error">Enter at least one topic.</p>'),400);let i={topics:o,output_dir:Ve(r.output_dir).trim()||"digests",schedule:_C(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 Sw(t,e){let r=Gi(t,"id");return e.removeProjectWorkflow(r)?t.redirect("/layman/newspaper?removed=1",302):t.notFound()}function mC(t){return fe(["id","project","topics","status","action"],t.map(e=>{let r=TC(e.parameters_override),n=Array.isArray(r.topics)?r.topics.join(", "):"";return[T(e.id),T(e.project_name),T(n),e.enabled===1?"enabled":"disabled",`<form method="post" action="/layman/newspaper/${e.id}/delete"><button type="submit">Remove</button></form>`]}))}function xw(t){let e=jw(t);return{workflows:Ki,recent_runs:hC(t),newspaper_subscriptions:e.length}}function pC(t,e){let r=Aw(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 hC(t){return t.query(`SELECT r.*, w.name AS workflow_name
|
|
1696
1696
|
FROM run r
|
|
1697
1697
|
JOIN workflow w ON w.id = r.workflow_id
|
|
1698
1698
|
WHERE w.name IN (${Du.map(()=>"?").join(",")})
|
|
1699
1699
|
ORDER BY r.id DESC
|
|
1700
|
-
LIMIT 10`,...Du)}function
|
|
1700
|
+
LIMIT 10`,...Du)}function jw(t){return t.query(`SELECT pw.*, p.name AS project_name
|
|
1701
1701
|
FROM project_workflow pw
|
|
1702
1702
|
JOIN workflow w ON w.id = pw.workflow_id
|
|
1703
1703
|
JOIN project p ON p.id = pw.project_id
|
|
1704
1704
|
WHERE w.name = ?
|
|
1705
|
-
ORDER BY pw.id DESC`,"newspaper")}function
|
|
1705
|
+
ORDER BY pw.id DESC`,"newspaper")}function Aw(t,e){for(let r of[...e.steps].reverse()){let n=t.getInteractiveSessionByStepId(r.id);if(n!==null)return n}return null}function Rw(t,e){let r=Number(Ve(e.project_id));return Number.isInteger(r)?t.getProject(r):null}function _C(t){let e=Ve(t.schedule)||"daily";return e==="weekly"?{preset:e,cron:"0 6 * * 1"}:e==="custom"?{preset:e,cron:Ve(t.cron).trim()||"0 6 * * *"}:{preset:"daily",cron:"0 6 * * *"}}function kw(t){let e=t.req.param("workflow");return Du.includes(e)?e:null}function bn(t){return Ki.find(e=>e.name===t)?.title??t}function gC(t){return t.split(/[_:-]/).filter(Boolean).map(e=>`${e[0]?.toUpperCase()??""}${e.slice(1)}`).join(" ")}function Fu(t){return VL.parse(t,{async:!1})}function wC(t){return t==="done"||t==="pr_ready"||t==="merged"}function yC(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}function EC(t,e){return t.split(`
|
|
1706
1706
|
`).slice(0,e).join(`
|
|
1707
|
-
`)}function bC(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function Ve(t){return typeof t=="string"?t:""}function TC(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 Mu(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Gi(t,e){return Number(t.req.param(e))}var Ki,Du,Oy=b(()=>{"use strict";Ss();Dt();gu();Ki=[{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."}],Du=Ki.map(t=>t.name)});function kC(t){return t.replace(/^\/+/,"")}function Ly(t){return typeof t=="string"&&t!==""&&!t.includes("/")&&!t.includes("\\")}function Tn(t){if(t.mailboxKey!==void 0&&t.mailboxKey!==null&&t.mailboxKey!==""){let e=kC(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 Ly(t.userId)&&Ly(t.deviceId)?`${t.userId}/${t.deviceId}/`:`${SC}/${t.identityId}/`}function IC(t){return String(Math.max(0,Math.floor(t))).padStart(vC,"0")}function Uu(t,e,r){return`${t}${e}${IC(r)}.json`}function Vi(t,e){return`${t}${e}`}function Yi(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 SC,vC,zi=b(()=>{"use strict";SC="mailbox";vC=12});function qt(t,e){let r=Math.floor(t),n="",s=r;for(let u=0;u<12;u++)n=Zi[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=Zi[a&15]+i,a=a>>4;let l=Zi[8|Math.floor(e()*4)&3],c="";for(let u=0;u<15;u++)c+=Zi[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 Zi,Qi=b(()=>{"use strict";Zi="0123456789abcdef"});function Bu(t,e){return!Number.isFinite(t)||t<=0?e:t}function qu(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 Fy(t){return t.conversation_id===Py&&xC(t.payload)}function xC(t){return typeof t=="object"&&t!==null&&t.kind==="heartbeat"}function jC(t){let e=typeof t.hb=="string"&&t.hb!==""?t.hb:Fy(t)?t.timestamp:void 0;if(e===void 0)return;let r=Date.parse(e);return Number.isFinite(r)?r:void 0}var Cy,My,Dy,NC,Py,$C,Wu,Cr,ea=b(()=>{"use strict";zi();Qi();Cy=3e3,My=1e4,Dy=12e3,NC=1e3,Py="__lmctl_heartbeat__",$C={kind:"heartbeat"},Wu={setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t)},Cr=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=Tn({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=Bu(e.readIntervalMs??e.pollIntervalMs??Cy,Cy),this.heartbeatIdleMs=Bu(e.heartbeatIdleMs??My,My),this.backoffReadIntervalMs=Bu(e.backoffReadIntervalMs??e.pollIntervalMs??Dy,Dy)}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??Wu;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=Vi(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:NC,...s!==void 0&&{ContinuationToken:s}}));this.opts.onS3Op?.("list");for(let i of o.Contents??[]){let a=Yi(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:qt(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=Uu(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??Wu;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=Uu(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(qu(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),Fy(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=jC(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??Wu;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(Py,$C)}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 AC}from"@hono/node-server/conninfo";function Uy(t,e){let r=e.bucket??RC,n=e.remoteAddressOf??(o=>LC(o)),s=o=>{let i=n(o);return CC(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=Hu(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 qu(l)?o.json({error:"not_found"},404):o.json({error:"internal",message:Ju(l)},500)}}),t.put("/local-mailbox/object",async o=>{let i=s(o);if(i!==null)return i;let a=Hu(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:Ju(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=Hu(a,{allowEmpty:!0});if(typeof l!="string")return o.json({error:"bad_request",message:l.error},400);let c=OC(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:Ju(d)},500)}})}function Hu(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 OC(t){if(t===void 0||t==="")return;let e=Number(t);return Number.isInteger(e)&&e>0?e:void 0}function LC(t){try{return AC(t).remote.address}catch{return}}function CC(t){return t===void 0||t===""?!1:!!(t==="127.0.0.1"||t==="::1"||t.startsWith("::ffff:127.")||t.startsWith("127."))}function Ju(t){return t instanceof Error?t.message:String(t)}var RC,Wy=b(()=>{"use strict";ea();RC="local"});function By(t,e){t.get("/mailbox/workspace",r=>PC(r,e)),t.get("/mailbox/projects",r=>FC(r,e)),t.get("/mailbox/projects/:id",r=>UC(r,e)),t.post("/mailbox/projects",r=>WC(r,e)),t.patch("/mailbox/projects/:id",r=>BC(r,e)),t.delete("/mailbox/projects/:id",r=>qC(r,e)),t.post("/mailbox/projects/:project_id/prompts",r=>HC(r,e)),t.get("/mailbox/prompts/:id",r=>JC(r,e))}function PC(t,e){e.dal.ensureWorkspace({id:kn,name:Xu});let r=qy(e.dal),n={id:kn,name:Xu,created_at:DC,projects:r};return t.json({workspace:n})}function FC(t,e){return t.json({projects:qy(e.dal)})}function UC(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(Sn)){let s=Gu(e.dal,r);return s===null||s.deleted_at!==null?t.json({project:null},404):t.json({project:na(s)})}let n=Jy(e.dal,r);return n===null?t.json({project:null},404):t.json({project:Hy(n)})}async function WC(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:kn,name:Xu});let s=e.dal.insertWebProject({workspace_id:kn,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:na(s)},201)}async function BC(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(Sn)){let o=Gu(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:na(i)})}return t.json({error:"project_not_found",message:`project not found: ${r}`},404)}function qC(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(Sn)){let n=Gu(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 HC(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=Jy(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=`${MC}${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 XC({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:`${ra}${i.id}`,text:s.text,status:"pending",created_at:new Date().toISOString(),completed_at:null};return t.json({prompt:d},201)}function JC(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=GC(e.dal,r);return t.json({result:n})}function qy(t){let e=t.listProjects().map(Hy),r=t.listWebProjectsActive(kn).map(na);return[...e,...r].sort(nM)}function Hy(t){return{id:`${ra}${t.id}`,workspace_id:kn,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 na(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:`${Sn}${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 Gu(t,e){if(!e.startsWith(Sn))return null;let r=e.slice(Sn.length),n=Number.parseInt(r,10);return!Number.isFinite(n)||String(n)!==r?null:t.getWebProject(n)}function Jy(t,e){if(e.startsWith(ra)){let n=e.slice(ra.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 XC(t){let{enqueueManual:e}=await Promise.resolve().then(()=>(ou(),y_));return{id:e(t.dal,{project_id:t.project_id,source_ref:t.source_ref,payload:t.payload}).id}}function GC(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=eM(t,o?.team_id??null),a=QC(s),l=tM(n,a,i.length>0),c=rM(r.created_at,s),u=o===null?{totalEstimatedMs:void 0,perStep:new Map}:KC(t,o.workflow_name),d=u.totalEstimatedMs,f=Xy(r.created_at),m=o?.workflow_name,p=u.perStep.size>0?u.perStep.size:void 0,h=s===null?[]:VC(t,s.id),g=YC(s,a,h,u.perStep,i),_=zC(h,u.perStep),S=ZC(g,_,d,f,m,p);return l==="error"?{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,...ta(d,f),...S},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,...ta(d,f),...S},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,...ta(d,f),...S},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,...ta(d,f),...S},errors_json:null,duration_ms:c}}function KC(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 VC(t,e){try{return t.listStepsForRun(e)}catch{return[]}}function YC(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=Xy(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 zC(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 ZC(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 Xy(t){let e=Date.parse(t);return Number.isNaN(e)?0:Math.max(0,Date.now()-e)}function ta(t,e){return t===void 0?{elapsed_ms:e}:{elapsed_ms:e,estimated_duration_ms:t}}function QC(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 eM(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 tM(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 rM(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 nM(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 ra,Sn,MC,kn,Xu,DC,Gy=b(()=>{"use strict";ra="project:",Sn="web_project:",MC="prompt:",kn="default",Xu="Default workspace",DC=new Date(0).toISOString()});import{Buffer as Ky}from"node:buffer";function Vy(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 Yy(t){return iM[t]}function zy(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 sM,oM,sa,iM,Ku=b(()=>{"use strict";sM=1e4,oM=256*1024,sa=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=Vy(e.pushWindowMs,process.env.LMCTL_TERMINAL_PUSH_WINDOW_MS,sM),this.pushByteCap=Vy(e.pushByteCap,process.env.LMCTL_TERMINAL_PUSH_BYTE_CAP,oM),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+=Ky.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=${Ky.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
|
|
1707
|
+
`)}function bC(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function Ve(t){return typeof t=="string"?t:""}function TC(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 Mu(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Gi(t,e){return Number(t.req.param(e))}var Ki,Du,Ow=b(()=>{"use strict";Ss();Dt();gu();Ki=[{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."}],Du=Ki.map(t=>t.name)});function kC(t){return t.replace(/^\/+/,"")}function Lw(t){return typeof t=="string"&&t!==""&&!t.includes("/")&&!t.includes("\\")}function Tn(t){if(t.mailboxKey!==void 0&&t.mailboxKey!==null&&t.mailboxKey!==""){let e=kC(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 Lw(t.userId)&&Lw(t.deviceId)?`${t.userId}/${t.deviceId}/`:`${SC}/${t.identityId}/`}function IC(t){return String(Math.max(0,Math.floor(t))).padStart(vC,"0")}function Uu(t,e,r){return`${t}${e}${IC(r)}.json`}function Vi(t,e){return`${t}${e}`}function Yi(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 SC,vC,zi=b(()=>{"use strict";SC="mailbox";vC=12});function qt(t,e){let r=Math.floor(t),n="",s=r;for(let u=0;u<12;u++)n=Zi[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=Zi[a&15]+i,a=a>>4;let l=Zi[8|Math.floor(e()*4)&3],c="";for(let u=0;u<15;u++)c+=Zi[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 Zi,Qi=b(()=>{"use strict";Zi="0123456789abcdef"});function Bu(t,e){return!Number.isFinite(t)||t<=0?e:t}function qu(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 Fw(t){return t.conversation_id===Pw&&xC(t.payload)}function xC(t){return typeof t=="object"&&t!==null&&t.kind==="heartbeat"}function jC(t){let e=typeof t.hb=="string"&&t.hb!==""?t.hb:Fw(t)?t.timestamp:void 0;if(e===void 0)return;let r=Date.parse(e);return Number.isFinite(r)?r:void 0}var Cw,Mw,Dw,NC,Pw,$C,Wu,Cr,ea=b(()=>{"use strict";zi();Qi();Cw=3e3,Mw=1e4,Dw=12e3,NC=1e3,Pw="__lmctl_heartbeat__",$C={kind:"heartbeat"},Wu={setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t)},Cr=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=Tn({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=Bu(e.readIntervalMs??e.pollIntervalMs??Cw,Cw),this.heartbeatIdleMs=Bu(e.heartbeatIdleMs??Mw,Mw),this.backoffReadIntervalMs=Bu(e.backoffReadIntervalMs??e.pollIntervalMs??Dw,Dw)}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??Wu;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=Vi(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:NC,...s!==void 0&&{ContinuationToken:s}}));this.opts.onS3Op?.("list");for(let i of o.Contents??[]){let a=Yi(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:qt(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=Uu(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??Wu;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=Uu(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(qu(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),Fw(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=jC(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??Wu;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(Pw,$C)}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 AC}from"@hono/node-server/conninfo";function Uw(t,e){let r=e.bucket??RC,n=e.remoteAddressOf??(o=>LC(o)),s=o=>{let i=n(o);return CC(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=Hu(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 qu(l)?o.json({error:"not_found"},404):o.json({error:"internal",message:Ju(l)},500)}}),t.put("/local-mailbox/object",async o=>{let i=s(o);if(i!==null)return i;let a=Hu(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:Ju(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=Hu(a,{allowEmpty:!0});if(typeof l!="string")return o.json({error:"bad_request",message:l.error},400);let c=OC(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:Ju(d)},500)}})}function Hu(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 OC(t){if(t===void 0||t==="")return;let e=Number(t);return Number.isInteger(e)&&e>0?e:void 0}function LC(t){try{return AC(t).remote.address}catch{return}}function CC(t){return t===void 0||t===""?!1:!!(t==="127.0.0.1"||t==="::1"||t.startsWith("::ffff:127.")||t.startsWith("127."))}function Ju(t){return t instanceof Error?t.message:String(t)}var RC,Ww=b(()=>{"use strict";ea();RC="local"});function Bw(t,e){t.get("/mailbox/workspace",r=>PC(r,e)),t.get("/mailbox/projects",r=>FC(r,e)),t.get("/mailbox/projects/:id",r=>UC(r,e)),t.post("/mailbox/projects",r=>WC(r,e)),t.patch("/mailbox/projects/:id",r=>BC(r,e)),t.delete("/mailbox/projects/:id",r=>qC(r,e)),t.post("/mailbox/projects/:project_id/prompts",r=>HC(r,e)),t.get("/mailbox/prompts/:id",r=>JC(r,e))}function PC(t,e){e.dal.ensureWorkspace({id:kn,name:Xu});let r=qw(e.dal),n={id:kn,name:Xu,created_at:DC,projects:r};return t.json({workspace:n})}function FC(t,e){return t.json({projects:qw(e.dal)})}function UC(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(Sn)){let s=Gu(e.dal,r);return s===null||s.deleted_at!==null?t.json({project:null},404):t.json({project:na(s)})}let n=Jw(e.dal,r);return n===null?t.json({project:null},404):t.json({project:Hw(n)})}async function WC(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:kn,name:Xu});let s=e.dal.insertWebProject({workspace_id:kn,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:na(s)},201)}async function BC(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(Sn)){let o=Gu(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:na(i)})}return t.json({error:"project_not_found",message:`project not found: ${r}`},404)}function qC(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(Sn)){let n=Gu(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 HC(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=Jw(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=`${MC}${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 XC({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:`${ra}${i.id}`,text:s.text,status:"pending",created_at:new Date().toISOString(),completed_at:null};return t.json({prompt:d},201)}function JC(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=GC(e.dal,r);return t.json({result:n})}function qw(t){let e=t.listProjects().map(Hw),r=t.listWebProjectsActive(kn).map(na);return[...e,...r].sort(nM)}function Hw(t){return{id:`${ra}${t.id}`,workspace_id:kn,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 na(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:`${Sn}${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 Gu(t,e){if(!e.startsWith(Sn))return null;let r=e.slice(Sn.length),n=Number.parseInt(r,10);return!Number.isFinite(n)||String(n)!==r?null:t.getWebProject(n)}function Jw(t,e){if(e.startsWith(ra)){let n=e.slice(ra.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 XC(t){let{enqueueManual:e}=await Promise.resolve().then(()=>(ou(),w_));return{id:e(t.dal,{project_id:t.project_id,source_ref:t.source_ref,payload:t.payload}).id}}function GC(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=eM(t,o?.team_id??null),a=QC(s),l=tM(n,a,i.length>0),c=rM(r.created_at,s),u=o===null?{totalEstimatedMs:void 0,perStep:new Map}:KC(t,o.workflow_name),d=u.totalEstimatedMs,f=Xw(r.created_at),m=o?.workflow_name,p=u.perStep.size>0?u.perStep.size:void 0,h=s===null?[]:VC(t,s.id),g=YC(s,a,h,u.perStep,i),_=zC(h,u.perStep),S=ZC(g,_,d,f,m,p);return l==="error"?{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,...ta(d,f),...S},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,...ta(d,f),...S},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,...ta(d,f),...S},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,...ta(d,f),...S},errors_json:null,duration_ms:c}}function KC(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 VC(t,e){try{return t.listStepsForRun(e)}catch{return[]}}function YC(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=Xw(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 zC(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 ZC(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 Xw(t){let e=Date.parse(t);return Number.isNaN(e)?0:Math.max(0,Date.now()-e)}function ta(t,e){return t===void 0?{elapsed_ms:e}:{elapsed_ms:e,estimated_duration_ms:t}}function QC(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 eM(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 tM(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 rM(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 nM(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 ra,Sn,MC,kn,Xu,DC,Gw=b(()=>{"use strict";ra="project:",Sn="web_project:",MC="prompt:",kn="default",Xu="Default workspace",DC=new Date(0).toISOString()});import{Buffer as Kw}from"node:buffer";function Vw(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 Yw(t){return iM[t]}function zw(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 sM,oM,sa,iM,Ku=b(()=>{"use strict";sM=1e4,oM=256*1024,sa=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=Vw(e.pushWindowMs,process.env.LMCTL_TERMINAL_PUSH_WINDOW_MS,sM),this.pushByteCap=Vw(e.pushByteCap,process.env.LMCTL_TERMINAL_PUSH_BYTE_CAP,oM),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+=Kw.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=${Kw.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
|
|
1708
1708
|
[process exited with code ${r.exitCode}${r.signal!==void 0?` signal ${r.signal}`:""}]\r
|
|
1709
|
-
`,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)}};iM={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 Qy(t,e){t.post("/mailbox/terminal/launch",r=>aM(r,e)),t.post("/mailbox/terminal/end/:session_id",r=>lM(r,e)),t.get("/mailbox/terminal/sessions",r=>cM(r,e))}async function aM(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"||!Zy.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=zy(n.command_line),i===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=Yy(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 lM(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||!Zy.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 cM(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 Zy,ew=b(()=>{"use strict";Ku();Zy=/^[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 uM}from"node:buffer";function mM(t){try{return uM.byteLength(JSON.stringify(t),"utf8")}catch{return 256}}function tw(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 rw(t){return pM[t]}function nw(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 dM,fM,oa,pM,Vu=b(()=>{"use strict";dM=2e3,fM=64*1024,oa=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=tw(e.pushWindowMs,process.env.LMCTL_PROVIDER_PUSH_WINDOW_MS,dM),this.pushByteCap=tw(e.pushByteCap,process.env.LMCTL_PROVIDER_PUSH_BYTE_CAP,fM),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=mM(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")))})}};pM={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 ow(t,e){t.post("/mailbox/chat/launch",r=>hM(r,e)),t.post("/mailbox/chat/end/:session_id",r=>_M(r,e)),t.get("/mailbox/chat/sessions",r=>gM(r,e))}async function hM(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"||!sw.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=nw(n.command_line),i===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=rw(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 _M(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||!sw.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 gM(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 sw,iw=b(()=>{"use strict";Vu();sw=/^[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 yM}from"node:fs";function lw(t){let e=t.artifacts.find(r=>r.kind===`${t.state_name}_transcript`);if(e?.content!==void 0&&e.content!==null)return aw(e.content);if(e?.path===void 0||e.path===null)return[];try{let r=yM(e.path,{encoding:"utf8"});return aw(r)}catch{return[]}}function aw(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 cw=b(()=>{"use strict"});function uw(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 ia(t,e){let r=t.query(`SELECT id, kind FROM attention
|
|
1709
|
+
`,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)}};iM={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 Qw(t,e){t.post("/mailbox/terminal/launch",r=>aM(r,e)),t.post("/mailbox/terminal/end/:session_id",r=>lM(r,e)),t.get("/mailbox/terminal/sessions",r=>cM(r,e))}async function aM(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"||!Zw.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=zw(n.command_line),i===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=Yw(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 lM(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||!Zw.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 cM(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 Zw,ey=b(()=>{"use strict";Ku();Zw=/^[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 uM}from"node:buffer";function mM(t){try{return uM.byteLength(JSON.stringify(t),"utf8")}catch{return 256}}function ty(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 ry(t){return pM[t]}function ny(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 dM,fM,oa,pM,Vu=b(()=>{"use strict";dM=2e3,fM=64*1024,oa=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=ty(e.pushWindowMs,process.env.LMCTL_PROVIDER_PUSH_WINDOW_MS,dM),this.pushByteCap=ty(e.pushByteCap,process.env.LMCTL_PROVIDER_PUSH_BYTE_CAP,fM),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=mM(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")))})}};pM={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 oy(t,e){t.post("/mailbox/chat/launch",r=>hM(r,e)),t.post("/mailbox/chat/end/:session_id",r=>_M(r,e)),t.get("/mailbox/chat/sessions",r=>gM(r,e))}async function hM(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"||!sy.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=ny(n.command_line),i===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=ry(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 _M(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||!sy.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 gM(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 sy,iy=b(()=>{"use strict";Vu();sy=/^[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 wM}from"node:fs";function ly(t){let e=t.artifacts.find(r=>r.kind===`${t.state_name}_transcript`);if(e?.content!==void 0&&e.content!==null)return ay(e.content);if(e?.path===void 0||e.path===null)return[];try{let r=wM(e.path,{encoding:"utf8"});return ay(r)}catch{return[]}}function ay(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 cy=b(()=>{"use strict"});function uy(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 ia(t,e){let r=t.query(`SELECT id, kind FROM attention
|
|
1710
1710
|
WHERE run_id = ?
|
|
1711
1711
|
AND acknowledged_at IS NULL
|
|
1712
1712
|
AND requires_user = 1
|
|
1713
|
-
ORDER BY id DESC LIMIT 1`,e);return r.length===0?null:{kind:r[0].kind,attention_id:r[0].id}}var aa=b(()=>{"use strict"});function Ew(t,e){t.all("/runtime/*",r=>wM(r.req.raw,e))}async function wM(t,e){try{return Response.json(await EM(t,e))}catch(r){if(r instanceof oe)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 EM(t,e){let r=new URL(t.url),n=NM(e),s=r.pathname.split("/").filter(Boolean).map(decodeURIComponent);if(t.method==="GET"&&r.pathname==="/runtime/workspaces")return Yu(t),[{id:n.id,name:n.name}];if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="workspaces")return la(t,n.id,s[2]),bM(e.dal,n);if(t.method==="GET"&&s.length===5&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"){la(t,n.id,s[2]);let o=fw(e.dal,s[4]);return dw(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/lead-teams")return Yu(t),e.dal.listTeams().map(o=>IM(o));if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="chat"){let o=mw(e.dal,pw(s[2])),i=await t.json();if(i.teamId!==`team:${o.name}`)throw new oe(400,"runtime lead chat body does not match route team");return _w(t,n.id,i.context),hw(o,i.context)}if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="messages"){let o=mw(e.dal,pw(s[2])),i=await t.json();if(i.teamId!==`team:${o.name}`)throw new oe(400,"runtime lead message body does not match route team");_w(t,n.id,i.context);let a=i.draft?.body;if(typeof a!="string"||a.length===0)throw new oe(400,"runtime lead message requires draft.body");return hw(o,i.context,a)}if(t.method==="POST"&&s.length===6&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"&&s[5]==="workflow-message"){la(t,n.id,s[2]);let o=fw(e.dal,s[4]),i=await t.json();if(i.workspaceId!==n.id||i.projectId!==o.name)throw new oe(400,"runtime request body does not match route workspace/project");let a=i.draft?.body;if(typeof a!="string"||a.length===0)throw new oe(400,"runtime workflow message requires draft.body");return kM(e.dal,o,a),dw(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/templates")return ks(t,n.id),e.dal.listWorkflows().map(o=>$M(o));if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="templates"){ks(t,n.id);let o=jM(e.dal,s[2]);return xM(o)}if(t.method==="GET"&&r.pathname==="/runtime/runs"){ks(t,n.id);let o=r.searchParams.get("project"),i=r.searchParams.get("template");if(o!==null&&i!==null)throw new oe(400,"conflicting_filters: ?project= and ?template= are mutually exclusive");return AM(e.dal,o,i).map(l=>yw(e.dal,l))}if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="runs"){ks(t,n.id);let o=gw(e.dal,s[2]);return yw(e.dal,o)}if(t.method==="GET"&&s.length===4&&s[0]==="runtime"&&s[1]==="runs"&&s[3]==="events"){ks(t,n.id);let o=gw(e.dal,s[2]),i=OM(e.dal,o);return{runId:td(o),events:i,...i.length>0?{cursor:i[i.length-1].id}:{}}}throw new oe(404,`unknown runtime request: ${t.method} ${r.pathname}`)}function bM(t,e){return{id:e.id,name:e.name,projects:t.listProjects().map(r=>bw(t,e,r))}}function dw(t,e,r){let n=bw(t,e,r);return{...n,managedWorkflow:{...n.managedWorkflow,instance:TM(t,r),composerTarget:{kind:"workflow-initial",label:`Project Workflow: ${r.workflow_name}`,templateId:`template:${r.workflow_name}`,runId:n.managedWorkflow.runId}},workflowMessages:SM(t,r)}}function bw(t,e,r){let n=Tw(t,r.id),s=Zu(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 TM(t,e){let r=Tw(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:Zu(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 SM(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 kM(t,e,r){let n=vM(t,e.id);if(n!==null){let s=ia(t,n.id);if(s?.kind==="workflow_escalation"){let o=t.resumeEscalation(s.attention_id,r);if(!o.resumed)throw new oe(409,`workflow escalation resume failed: ${o.reason}`);return}if(s?.kind==="interactive_waiting_operator"){let o=Et(t,s.attention_id);if(o?.step_id===null||o?.step_id===void 0)throw new oe(409,"interactive resume failed: missing step");let i=t.resumeInteractive(o.step_id,r,!0);if(!i.resumed)throw new oe(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 Tw(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 vM(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 Zu(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 fw(t,e){let r=t.findProjectByName(e);if(r===null)throw new oe(404,`project not found: ${e}`);return r}function mw(t,e){let r=t.listTeams().find(n=>n.name===e);if(r===void 0)throw new oe(404,`team not found: ${e}`);return r}function pw(t){return t.startsWith("team:")?t.slice(5):t}function IM(t){return{id:`team:${t.name}`,name:t.name,teamfile:"",hasLead:!0,kind:t.name.toLowerCase().includes("manager")?"global-manager":"custom-ai-led"}}function hw(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??ww}`,teamId:`team:${t.name}`,title:`${t.name} Lead`,messages:s,...e===void 0?{}:{context:e}}}function NM(t){let e=t.workspaceName??Ln()??wr.default;return{id:e,name:e}}function Yu(t){if(t.headers.get("x-lmctl-workspace-id")!==ww)throw new oe(400,"runtime request requires global-admin workspace identity")}function la(t,e,r){let n=t.headers.get("x-lmctl-workspace-id");if(n===null)throw new oe(400,"runtime request requires workspace identity");if(r!==e||n!==e)throw new oe(400,"runtime workspace identity does not match route")}function ks(t,e){let r=t.headers.get("x-lmctl-workspace-id");if(r===null)throw new oe(400,"runtime request requires workspace identity");if(r!==e)throw new oe(400,"runtime workspace identity does not match server workspace")}function _w(t,e,r){if(r?.scope==="workspace"){if(r.workspaceId===void 0)throw new oe(400,"workspace manager context requires workspace identity");la(t,e,r.workspaceId);return}Yu(t)}function Qu(t){return`${vn}${ed(t.name)}`}function ed(t){return t.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"item"}function td(t){return`${zu}${t.id}`}function $M(t){let e=ca(t.definition);return{id:Qu(t),name:t.name,...e.description===null?{}:{description:e.description}}}function xM(t){let e=ca(t.definition);return{id:Qu(t),name:t.name,...e.description===null?{}:{description:e.description},graph:e.graph}}function ca(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 jM(t,e){if(!e.startsWith(vn))throw new oe(404,`template not found: ${e}`);let r=e.slice(vn.length),n=t.listWorkflows().filter(s=>ed(s.name)===r);if(n.length===0)throw new oe(404,`template not found: ${e}`);if(n.length>1){let s=n.map(o=>o.name).join(", ");throw new oe(409,`template_id_ambiguous: ${e} matches multiple workflow names [${s}]; rename to ensure unique slugs`)}return n[0]}function gw(t,e){if(!e.startsWith(zu))throw new oe(404,`run not found: ${e}`);let r=e.slice(zu.length);if(!/^[1-9]\d*$/.test(r))throw new oe(404,`run not found: ${e}`);let n=Number.parseInt(r,10);if(!Number.isFinite(n)||n<=0||String(n)!==r)throw new oe(404,`run not found: ${e}`);let s=t.getRun(n);if(s===null)throw new oe(404,`run not found: ${e}`);return s}function AM(t,e,r){if(r!==null){if(!r.startsWith(vn))return[];let s=r.slice(vn.length),o=t.listWorkflows().filter(a=>ed(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 yw(t,e){let r=t.getWorkflow(e.workflow_id),n=Zu(e),s=RM(r,e);return{id:td(e),templateId:r===null?`${vn}unknown`:Qu(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 RM(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]:[ca(t.definition).nameToId.get(r)??r]}function OM(t,e){let r=t.getWorkflow(e.workflow_id),n=r===null?{stepIds:[],nameToId:new Map}:ca(r.definition),s=c=>n.nameToId.get(c)??c,o=td(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=LM(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 LM(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 ww,vn,zu,oe,Sw=b(()=>{"use strict";Ye();aa();Dt();ww="global-admin";vn="template:",zu="run:";oe=class extends Error{status;constructor(e,r){super(r),this.status=e}}});import{mkdirSync as CM,writeFileSync as MM}from"node:fs";import{randomUUID as kw}from"node:crypto";import{dirname as DM,resolve as ua,sep as vw}from"node:path";async function Nw(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(!BM(n))return t.text("missing image file",400);if(n.size>PM)return t.text("upload too large",413);let s=Buffer.from(await n.arrayBuffer()),o=qM(s);if(o===null||!(o in Iw))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=FM(e,r.project);if(typeof i=="string")return t.text(i,404);let a=i===null?ua(WM()):ua(i.local_path),l=ua(a,"uploads",kw()),c=ua(l,`${kw()}${Iw[o]}`);if(!UM(c,a))return t.text("invalid upload path",400);CM(l,{recursive:!0});let u=new Uint8Array(s.buffer,s.byteOffset,s.byteLength);MM(c,u);let d={path:c,size:s.byteLength,mime:o,project:i?.name??null};return t.json(d)}function FM(t,e){return e==null||e===""?null:typeof e!="string"?"invalid project":t.findProjectByName(e)??`project not found: ${e}`}function UM(t,e){let r=e.endsWith(vw)?e:`${e}${vw}`;return t.startsWith(r)}function WM(){return DM(ue())}function BM(t){return typeof File<"u"&&t instanceof File}function qM(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 PM,Iw,$w=b(()=>{"use strict";Ye();PM=10*1024*1024,Iw={"image/png":".png","image/jpeg":".jpg","image/webp":".webp","image/heic":".heic","application/pdf":".pdf"}});import{existsSync as da}from"node:fs";import{basename as HM,dirname as JM,extname as XM,isAbsolute as GM,join as KM,relative as VM}from"node:path";import{fileURLToPath as YM}from"node:url";import{Hono as zM}from"hono";import{serveStatic as Tt}from"@hono/node-server/serve-static";function Cw(t){let e=new zM,r=[],n=t.localWebui!==void 0?nd(t.localWebui.webuiDir):ZM();if(t.localWebui!==void 0&&Uy(e,{s3:t.localWebui.localMailbox.s3,commands:t.localWebui.localMailbox.commands}),n!==null){let s=QM();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,Tt({root:n})),e.use("/vendor/*",s,Tt({root:n})),e.use("/src/*",s,Tt({root:n})),e.get("/",s,Tt({root:n,path:"index.html"})),e.get("/admin",s,Tt({root:n,path:"index.html"})),e.get("/admin/*",s,Tt({root:n,path:"index.html"})),e.get("/terminal",s,Tt({root:n,path:"index.html"})),e.get("/terminal/*",s,Tt({root:n,path:"index.html"})),e.get("/chat",s,Tt({root:n,path:"index.html"})),e.get("/chat/*",s,Tt({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("*",v_()),e.get("/login",s=>s.html(Oe("Login",`
|
|
1713
|
+
ORDER BY id DESC LIMIT 1`,e);return r.length===0?null:{kind:r[0].kind,attention_id:r[0].id}}var aa=b(()=>{"use strict"});function Ey(t,e){t.all("/runtime/*",r=>yM(r.req.raw,e))}async function yM(t,e){try{return Response.json(await EM(t,e))}catch(r){if(r instanceof oe)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 EM(t,e){let r=new URL(t.url),n=NM(e),s=r.pathname.split("/").filter(Boolean).map(decodeURIComponent);if(t.method==="GET"&&r.pathname==="/runtime/workspaces")return Yu(t),[{id:n.id,name:n.name}];if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="workspaces")return la(t,n.id,s[2]),bM(e.dal,n);if(t.method==="GET"&&s.length===5&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"){la(t,n.id,s[2]);let o=fy(e.dal,s[4]);return dy(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/lead-teams")return Yu(t),e.dal.listTeams().map(o=>IM(o));if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="chat"){let o=my(e.dal,py(s[2])),i=await t.json();if(i.teamId!==`team:${o.name}`)throw new oe(400,"runtime lead chat body does not match route team");return _y(t,n.id,i.context),hy(o,i.context)}if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="messages"){let o=my(e.dal,py(s[2])),i=await t.json();if(i.teamId!==`team:${o.name}`)throw new oe(400,"runtime lead message body does not match route team");_y(t,n.id,i.context);let a=i.draft?.body;if(typeof a!="string"||a.length===0)throw new oe(400,"runtime lead message requires draft.body");return hy(o,i.context,a)}if(t.method==="POST"&&s.length===6&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"&&s[5]==="workflow-message"){la(t,n.id,s[2]);let o=fy(e.dal,s[4]),i=await t.json();if(i.workspaceId!==n.id||i.projectId!==o.name)throw new oe(400,"runtime request body does not match route workspace/project");let a=i.draft?.body;if(typeof a!="string"||a.length===0)throw new oe(400,"runtime workflow message requires draft.body");return kM(e.dal,o,a),dy(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/templates")return ks(t,n.id),e.dal.listWorkflows().map(o=>$M(o));if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="templates"){ks(t,n.id);let o=jM(e.dal,s[2]);return xM(o)}if(t.method==="GET"&&r.pathname==="/runtime/runs"){ks(t,n.id);let o=r.searchParams.get("project"),i=r.searchParams.get("template");if(o!==null&&i!==null)throw new oe(400,"conflicting_filters: ?project= and ?template= are mutually exclusive");return AM(e.dal,o,i).map(l=>wy(e.dal,l))}if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="runs"){ks(t,n.id);let o=gy(e.dal,s[2]);return wy(e.dal,o)}if(t.method==="GET"&&s.length===4&&s[0]==="runtime"&&s[1]==="runs"&&s[3]==="events"){ks(t,n.id);let o=gy(e.dal,s[2]),i=OM(e.dal,o);return{runId:td(o),events:i,...i.length>0?{cursor:i[i.length-1].id}:{}}}throw new oe(404,`unknown runtime request: ${t.method} ${r.pathname}`)}function bM(t,e){return{id:e.id,name:e.name,projects:t.listProjects().map(r=>by(t,e,r))}}function dy(t,e,r){let n=by(t,e,r);return{...n,managedWorkflow:{...n.managedWorkflow,instance:TM(t,r),composerTarget:{kind:"workflow-initial",label:`Project Workflow: ${r.workflow_name}`,templateId:`template:${r.workflow_name}`,runId:n.managedWorkflow.runId}},workflowMessages:SM(t,r)}}function by(t,e,r){let n=Ty(t,r.id),s=Zu(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 TM(t,e){let r=Ty(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:Zu(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 SM(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 kM(t,e,r){let n=vM(t,e.id);if(n!==null){let s=ia(t,n.id);if(s?.kind==="workflow_escalation"){let o=t.resumeEscalation(s.attention_id,r);if(!o.resumed)throw new oe(409,`workflow escalation resume failed: ${o.reason}`);return}if(s?.kind==="interactive_waiting_operator"){let o=Et(t,s.attention_id);if(o?.step_id===null||o?.step_id===void 0)throw new oe(409,"interactive resume failed: missing step");let i=t.resumeInteractive(o.step_id,r,!0);if(!i.resumed)throw new oe(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 Ty(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 vM(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 Zu(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 fy(t,e){let r=t.findProjectByName(e);if(r===null)throw new oe(404,`project not found: ${e}`);return r}function my(t,e){let r=t.listTeams().find(n=>n.name===e);if(r===void 0)throw new oe(404,`team not found: ${e}`);return r}function py(t){return t.startsWith("team:")?t.slice(5):t}function IM(t){return{id:`team:${t.name}`,name:t.name,teamfile:"",hasLead:!0,kind:t.name.toLowerCase().includes("manager")?"global-manager":"custom-ai-led"}}function hy(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??yy}`,teamId:`team:${t.name}`,title:`${t.name} Lead`,messages:s,...e===void 0?{}:{context:e}}}function NM(t){let e=t.workspaceName??Ln()??yr.default;return{id:e,name:e}}function Yu(t){if(t.headers.get("x-lmctl-workspace-id")!==yy)throw new oe(400,"runtime request requires global-admin workspace identity")}function la(t,e,r){let n=t.headers.get("x-lmctl-workspace-id");if(n===null)throw new oe(400,"runtime request requires workspace identity");if(r!==e||n!==e)throw new oe(400,"runtime workspace identity does not match route")}function ks(t,e){let r=t.headers.get("x-lmctl-workspace-id");if(r===null)throw new oe(400,"runtime request requires workspace identity");if(r!==e)throw new oe(400,"runtime workspace identity does not match server workspace")}function _y(t,e,r){if(r?.scope==="workspace"){if(r.workspaceId===void 0)throw new oe(400,"workspace manager context requires workspace identity");la(t,e,r.workspaceId);return}Yu(t)}function Qu(t){return`${vn}${ed(t.name)}`}function ed(t){return t.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"item"}function td(t){return`${zu}${t.id}`}function $M(t){let e=ca(t.definition);return{id:Qu(t),name:t.name,...e.description===null?{}:{description:e.description}}}function xM(t){let e=ca(t.definition);return{id:Qu(t),name:t.name,...e.description===null?{}:{description:e.description},graph:e.graph}}function ca(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 jM(t,e){if(!e.startsWith(vn))throw new oe(404,`template not found: ${e}`);let r=e.slice(vn.length),n=t.listWorkflows().filter(s=>ed(s.name)===r);if(n.length===0)throw new oe(404,`template not found: ${e}`);if(n.length>1){let s=n.map(o=>o.name).join(", ");throw new oe(409,`template_id_ambiguous: ${e} matches multiple workflow names [${s}]; rename to ensure unique slugs`)}return n[0]}function gy(t,e){if(!e.startsWith(zu))throw new oe(404,`run not found: ${e}`);let r=e.slice(zu.length);if(!/^[1-9]\d*$/.test(r))throw new oe(404,`run not found: ${e}`);let n=Number.parseInt(r,10);if(!Number.isFinite(n)||n<=0||String(n)!==r)throw new oe(404,`run not found: ${e}`);let s=t.getRun(n);if(s===null)throw new oe(404,`run not found: ${e}`);return s}function AM(t,e,r){if(r!==null){if(!r.startsWith(vn))return[];let s=r.slice(vn.length),o=t.listWorkflows().filter(a=>ed(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 wy(t,e){let r=t.getWorkflow(e.workflow_id),n=Zu(e),s=RM(r,e);return{id:td(e),templateId:r===null?`${vn}unknown`:Qu(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 RM(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]:[ca(t.definition).nameToId.get(r)??r]}function OM(t,e){let r=t.getWorkflow(e.workflow_id),n=r===null?{stepIds:[],nameToId:new Map}:ca(r.definition),s=c=>n.nameToId.get(c)??c,o=td(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=LM(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 LM(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 yy,vn,zu,oe,Sy=b(()=>{"use strict";Ye();aa();Dt();yy="global-admin";vn="template:",zu="run:";oe=class extends Error{status;constructor(e,r){super(r),this.status=e}}});import{mkdirSync as CM,writeFileSync as MM}from"node:fs";import{randomUUID as ky}from"node:crypto";import{dirname as DM,resolve as ua,sep as vy}from"node:path";async function Ny(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(!BM(n))return t.text("missing image file",400);if(n.size>PM)return t.text("upload too large",413);let s=Buffer.from(await n.arrayBuffer()),o=qM(s);if(o===null||!(o in Iy))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=FM(e,r.project);if(typeof i=="string")return t.text(i,404);let a=i===null?ua(WM()):ua(i.local_path),l=ua(a,"uploads",ky()),c=ua(l,`${ky()}${Iy[o]}`);if(!UM(c,a))return t.text("invalid upload path",400);CM(l,{recursive:!0});let u=new Uint8Array(s.buffer,s.byteOffset,s.byteLength);MM(c,u);let d={path:c,size:s.byteLength,mime:o,project:i?.name??null};return t.json(d)}function FM(t,e){return e==null||e===""?null:typeof e!="string"?"invalid project":t.findProjectByName(e)??`project not found: ${e}`}function UM(t,e){let r=e.endsWith(vy)?e:`${e}${vy}`;return t.startsWith(r)}function WM(){return DM(ue())}function BM(t){return typeof File<"u"&&t instanceof File}function qM(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 PM,Iy,$y=b(()=>{"use strict";Ye();PM=10*1024*1024,Iy={"image/png":".png","image/jpeg":".jpg","image/webp":".webp","image/heic":".heic","application/pdf":".pdf"}});import{existsSync as da}from"node:fs";import{basename as HM,dirname as JM,extname as XM,isAbsolute as GM,join as KM,relative as VM}from"node:path";import{fileURLToPath as YM}from"node:url";import{Hono as zM}from"hono";import{serveStatic as Tt}from"@hono/node-server/serve-static";function Cy(t){let e=new zM,r=[],n=t.localWebui!==void 0?nd(t.localWebui.webuiDir):ZM();if(t.localWebui!==void 0&&Uw(e,{s3:t.localWebui.localMailbox.s3,commands:t.localWebui.localMailbox.commands}),n!==null){let s=QM();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,Tt({root:n})),e.use("/vendor/*",s,Tt({root:n})),e.use("/src/*",s,Tt({root:n})),e.get("/",s,Tt({root:n,path:"index.html"})),e.get("/admin",s,Tt({root:n,path:"index.html"})),e.get("/admin/*",s,Tt({root:n,path:"index.html"})),e.get("/terminal",s,Tt({root:n,path:"index.html"})),e.get("/terminal/*",s,Tt({root:n,path:"index.html"})),e.get("/chat",s,Tt({root:n,path:"index.html"})),e.get("/chat/*",s,Tt({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("*",v_()),e.get("/login",s=>s.html(Oe("Login",`
|
|
1714
1714
|
<h1>Login</h1>
|
|
1715
1715
|
<form method="post" action="/login">
|
|
1716
1716
|
<label>Token <input name="token" type="password"></label>
|
|
1717
1717
|
<button type="submit">Login</button>
|
|
1718
1718
|
</form>
|
|
1719
|
-
`))),e.post("/login",async s=>{let o=await s.req.parseBody(),i=typeof o.token=="string"?o.token:"";return N_(i)?(du(s,i),s.redirect("/",302)):s.html(Oe("Login","<p>Invalid token</p>"),401)}),e.post("/logout",s=>($_(s),s.redirect("/login",302))),vy(e,{dal:t.dal}),Ew(e,{dal:t.dal}),By(e,{dal:t.dal}),Qy(e,{terminalSessionManager:t.terminalSessionManager}),ow(e,{persistentSessionManager:t.persistentSessionManager}),e.post("/api/teams/:team_name/refresh",async s=>{let o=Zn(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 fc(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 H(s,{team:o,seeded:u,failed:d},f=>`<p>refreshed team ${T(f.team)}: seeded [${f.seeded.map(m=>T(m)).join(", ")}]${f.failed.length>0?` failed [${f.failed.map(m=>`${T(m.alias)}: ${T(m.error)}`).join(", ")}]`:""}</p>`)}),C_(e,{dal:t.dal}),B_(e,{dal:t.dal}),e.get("/api/status",s=>H(s,Do(t.dal),iD)),e.get("/api/projects",s=>H(s,Po(t.dal),aD)),e.get("/api/teams",s=>H(s,Hp(t.dal),uD)),e.get("/api/workflows",s=>H(s,Fo(t.dal),dD)),e.get("/api/workflows/verify",s=>{let o=cy();return s.req.header("accept")?.includes("text/plain")?s.text(dy(o)):s.json(o)}),e.get("/api/jobs",s=>H(s,Jp(t.dal,{status:s.req.query("status")}),fD)),e.post("/api/uploads",s=>Nw(s,t.dal)),e.get("/api/jobs/:id",s=>{let o=Uo(t.dal,re(s,"id"));return o===null?s.notFound():H(s,o,ce)}),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 H(s,d,ce)}),e.post("/api/jobs/:id/run",async s=>{let{runJobById:o}=await Promise.resolve().then(()=>(Ss(),by)),i=Uo(t.dal,re(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():H(s,o,ce)}),e.get("/api/projects/:name/workflows",s=>{let o=t.dal.findProjectByName(s.req.param("name"));return o===null?s.notFound():H(s,t.dal.listProjectWorkflows(o.id),lD)}),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 In(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{ir(u)}catch{return s.text("invalid condition",400)}let d=rD(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 H(s,m,ce)}),e.get("/api/projects/workflows/:id",s=>{let o=t.dal.getProjectWorkflow(re(s,"id"));return o===null?s.notFound():H(s,o,ce)}),e.delete("/api/projects/workflows/:id",s=>t.dal.removeProjectWorkflow(re(s,"id"))?H(s,{removed:!0},ce):s.notFound()),e.post("/api/projects/workflows/:id/enable",s=>{let o=t.dal.setProjectWorkflowEnabled(re(s,"id"),!0);return o===null?s.notFound():H(s,o,ce)}),e.post("/api/projects/workflows/:id/disable",s=>{let o=t.dal.setProjectWorkflowEnabled(re(s,"id"),!1);return o===null?s.notFound():H(s,o,ce)}),e.get("/api/projects/:name/issues",s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=jw(s.req.query("status"),nD);if(typeof i=="string")return s.text(i,400);let a=jw(s.req.query("severity"),Dw);return typeof a=="string"?s.text(a,400):H(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")}:{}}),cD)}),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 In(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=sD(i.severity);if(typeof c=="object")return s.text(c.error,400);let u=oD(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 H(s,d,ce)}),e.get("/api/issues/:id",s=>{let o=t.dal.getIssue(re(s,"id"));return o===null?s.notFound():H(s,o,ce)}),e.post("/api/issues/:id/claim",async s=>{let o=re(s,"id"),i=t.dal.getIssue(o);if(i===null)return s.notFound();let a=await In(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):H(s,c,ce)}),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 In(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):H(s,l,ce)}),e.post("/api/issues/:id/close",async s=>{let o=t.dal.getIssue(re(s,"id"));if(o===null)return s.notFound();let i=await In(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 H(s,t.dal.closeIssue(re(s,"id"),a,typeof i.commit_hash=="string"?i.commit_hash:null),ce)}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(re(s,"id"));if(o===null)return s.notFound();let i=await In(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 H(s,t.dal.reopenIssue(re(s,"id"),a),ce)}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 H(s,{...o,owner:a,repo:l},ce)}),e.get("/api/runs/:run_id/artifacts",s=>{let o=re(s,"run_id"),i=s.req.query("kind"),a=$r(t.dal,o,i);return H(s,a,ce)}),e.get("/api/runs/:run_id/artifacts/:kind",async s=>{let o=re(s,"run_id"),i=s.req.param("kind"),a=$r(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):H(s,l,ce);if(l.path!==null&&l.path!==void 0){if(c)try{let{readFileSync:u}=await import("node:fs"),d=eD(l.path);if(tD(d)){let h=u(l.path,"utf8");return s.body(h,200,{"Content-Type":d})}let f=u(l.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength),p=HM(l.path);return s.body(m,200,{"Content-Type":d,"Content-Disposition":`attachment; filename="${p}"`})}catch(u){return s.text(`failed to read artifact path: ${u.message}`,500)}return H(s,l,ce)}return H(s,l,ce)}),e.get("/api/runs",s=>H(s,en(t.dal,{limit:rd(s,"limit")??100}),mD)),e.get("/api/runs/:id",s=>{let o=Nr(t.dal,re(s,"id"));return o===null?s.notFound():H(s,o,pD)}),e.get("/api/runs/:id/where",s=>{let o=tn(t.dal,re(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Bo(o)):s.json(o)}),e.get("/api/runs/:id/timeline",s=>{let o=qo(t.dal,re(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Ho(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(re(s,"id"),o);return!i.resumed&&i.reason==="run_not_found"?s.notFound():i.resumed?(fa(t.daemon),H(s,i,Aw)):H(s,i,Aw,400)}),e.post("/api/interactive/:step_id/respond",async s=>{let o=re(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?(fa(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=>xw(s,t.dal,o=>H(s,o,_D))),e.get("/api/runs/:id/steps/:step_id/transcript",s=>{let o=Vp(t.dal,re(s,"id"),re(s,"step_id"));return o===null?s.notFound():Mw(s)?s.html(`<pre>${T(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=>xw(s,t.dal,o=>{let i=lw(o);return H(s,i,a=>fe(["role","text"],a.map(l=>[T(l.role),T(l.text)])))})),e.get("/api/external-objects",s=>H(s,Yp(t.dal,{type:s.req.query("type")}),gD)),e.get("/api/external-signals",s=>H(s,zp(t.dal,{unhandled:s.req.query("unhandled")==="true"}),yD)),e.get("/api/attentions",s=>H(s,tr(t.dal,{unacked:s.req.query("unacked")==="true"}),wD)),e.post("/api/attentions/:id/ack",s=>{let o=t.dal.acknowledgeAttention(re(s,"id"));return o===null?s.notFound():H(s,o,i=>`<p>acknowledged attention ${T(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=Wo(t.dal,l);return H(s,c,u=>`<h1>Escalations</h1>${fe(["attention_id","project","run","workflow","state","prompt"],u.map(d=>[T(d.attention_id),T(d.project),T(d.run_id),T(d.workflow_name),T(d.state_name),T((d.prompt??"").slice(0,120))]))}`)}),e.get("/api/escalations/:id",s=>{let o=Et(t.dal,re(s,"id"));return o===null?s.notFound():H(s,o,ce)}),e.post("/api/escalations/:id/respond",async s=>{let o=re(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=Et(t.dal,o);if(c===null)return s.notFound();let u=tr(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);fa(t.daemon);let p=tr(t.dal).find(h=>h.id===o);return s.json({ok:!0,attention_id:o,run_id:m.run.id,decision:i,session_status:"escalation_resumed",acknowledged_at:p?.acknowledged_at??null})}if(u.kind!=="interactive_waiting_operator")return s.json({ok:!1,reason:"wrong_kind",kind:u.kind},400);if(u.acknowledged_at!==null)return s.json({ok:!1,reason:"already_acked"},400);if(c.step_id===null)return s.json({ok:!1,reason:"no_step"},400);let d=t.dal.resumeInteractive(c.step_id,i,a);if(!d.resumed)return s.json({ok:!1,reason:d.reason,step_id:c.step_id},400);let f=t.dal.acknowledgeAttention(o);return fa(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=Xp(t.dal,{status:i,pr_url:o});return H(s,a,ED)}),e.get("/api/submitted-prs/:id",s=>{let o=re(s,"id"),i=Gp(t.dal,o);return i===null?s.notFound():H(s,i,bD)}),e.get("/api/sessions",s=>H(s,t.dal.latestSessionSizes(),Rw)),e.get("/api/sessions/:team_name/:alias/history",s=>{let o=Zn(s.req.param("team_name"));return H(s,t.dal.sessionSizeHistory(o,s.req.param("alias")),Rw)}),e.post("/api/sessions/:team_name/:alias/compact",async s=>{let o=Zn(s.req.param("team_name"));try{let i=await Dp(t.dal,o,s.req.param("alias"));return H(s,i,a=>Ow("compacted",a.row))}catch(i){if(i instanceof zn)return s.text(i.message,409);throw i}}),e.post("/api/sessions/:team_name/:alias/refresh",async s=>{let o=Zn(s.req.param("team_name")),i=await fc(t.dal,o,s.req.param("alias"));return H(s,i,a=>Ow(`refreshed ${a.sessionid}`,a.row))}),e.get("/api/intake/state",s=>H(s,r,Lw)),e.post("/api/intake/scan",async s=>(r=await _n(t.dal),H(s,r,Lw))),e.get("/api/stats/run-throughput",s=>H(s,eh(t.dal),TD)),e.get("/api/daemon/state",s=>H(s,t.daemon?.state??null,SD)),e.post("/api/daemon/cycle",async s=>{if(t.daemon===void 0)return H(s,{disabled:!0},ce);let o=await t.daemon.runCycle();return H(s,{state:t.daemon.state,result:o},ce)}),e.get("/metrics/:project_id",s=>{let o=re(s,"project_id"),i=t.dal.getProject(o);if(i===null)return s.notFound();let a=wc(t.dal,o),l=Ec(t.dal,{project_id:o});return s.html(Oe(`Metrics \u2014 ${i.name}`,kD(i.name,a,l)))}),e.get("/api/metrics/reviewer/:project_id",s=>{let o=re(s,"project_id");if(t.dal.getProject(o)===null)return s.notFound();let i=rd(s,"since_days");return s.json(wc(t.dal,o,i))}),e.get("/api/metrics/tools/:project_id",s=>{let o=re(s,"project_id");if(t.dal.getProject(o)===null)return s.notFound();let i=rd(s,"since_days");return s.json(Ec(t.dal,{project_id:o,since_days:i}))}),e.post("/api/drift/:id/ack",s=>{let o=t.dal.acknowledgeDriftSignal(re(s,"id"));return o===null?s.notFound():s.json({id:o.id,acknowledged_at:o.acknowledged_at})}),e}function xw(t,e,r){let n=yc(e,re(t,"id"),re(t,"step_id"));return n===null?t.notFound():r(n)}function fa(t){t!==void 0&&t.runCycle().catch(()=>{})}function H(t,e,r,n=200){return Mw(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 Mw(t){let e=t.req.header("accept")??"";return e.includes("text/html")&&!e.includes("application/json")}function ZM(){let t=process.env.LMCTL_WEBUI_DIST;if(t!==void 0)return da(`${t}/index.html`)?nd(t):null;let e="src/serve/webui-dist";if(da(`${e}/index.html`))return e;let r="dist/serve/webui-dist";if(da(`${r}/index.html`))return r;let n=KM(JM(YM(import.meta.url)),"webui-dist");return da(`${n}/index.html`)?nd(n):null}function nd(t){if(!GM(t))return t;let e=VM(process.cwd(),t);return e.length===0?".":e}function QM(){return async(t,e)=>{await e(),t.header("Cache-Control","no-store")}}function re(t,e){return Number(t.req.param(e))}function rd(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 eD(t){switch(XM(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 tD(t){return!!(t.startsWith("text/")||t.startsWith("application/json")||t.startsWith("application/xml"))}async function In(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 rD(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 jw(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 sD(t){if(t!=null)return typeof t=="string"&&Dw.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function oD(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 iD(t){return`<h1>Status</h1><div class="grid">
|
|
1719
|
+
`))),e.post("/login",async s=>{let o=await s.req.parseBody(),i=typeof o.token=="string"?o.token:"";return N_(i)?(du(s,i),s.redirect("/",302)):s.html(Oe("Login","<p>Invalid token</p>"),401)}),e.post("/logout",s=>($_(s),s.redirect("/login",302))),vw(e,{dal:t.dal}),Ey(e,{dal:t.dal}),Bw(e,{dal:t.dal}),Qw(e,{terminalSessionManager:t.terminalSessionManager}),oy(e,{persistentSessionManager:t.persistentSessionManager}),e.post("/api/teams/:team_name/refresh",async s=>{let o=Zn(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 fc(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 H(s,{team:o,seeded:u,failed:d},f=>`<p>refreshed team ${T(f.team)}: seeded [${f.seeded.map(m=>T(m)).join(", ")}]${f.failed.length>0?` failed [${f.failed.map(m=>`${T(m.alias)}: ${T(m.error)}`).join(", ")}]`:""}</p>`)}),C_(e,{dal:t.dal}),B_(e,{dal:t.dal}),e.get("/api/status",s=>H(s,Do(t.dal),iD)),e.get("/api/projects",s=>H(s,Po(t.dal),aD)),e.get("/api/teams",s=>H(s,Hp(t.dal),uD)),e.get("/api/workflows",s=>H(s,Fo(t.dal),dD)),e.get("/api/workflows/verify",s=>{let o=cw();return s.req.header("accept")?.includes("text/plain")?s.text(dw(o)):s.json(o)}),e.get("/api/jobs",s=>H(s,Jp(t.dal,{status:s.req.query("status")}),fD)),e.post("/api/uploads",s=>Ny(s,t.dal)),e.get("/api/jobs/:id",s=>{let o=Uo(t.dal,re(s,"id"));return o===null?s.notFound():H(s,o,ce)}),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 H(s,d,ce)}),e.post("/api/jobs/:id/run",async s=>{let{runJobById:o}=await Promise.resolve().then(()=>(Ss(),bw)),i=Uo(t.dal,re(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():H(s,o,ce)}),e.get("/api/projects/:name/workflows",s=>{let o=t.dal.findProjectByName(s.req.param("name"));return o===null?s.notFound():H(s,t.dal.listProjectWorkflows(o.id),lD)}),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 In(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{ir(u)}catch{return s.text("invalid condition",400)}let d=rD(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 H(s,m,ce)}),e.get("/api/projects/workflows/:id",s=>{let o=t.dal.getProjectWorkflow(re(s,"id"));return o===null?s.notFound():H(s,o,ce)}),e.delete("/api/projects/workflows/:id",s=>t.dal.removeProjectWorkflow(re(s,"id"))?H(s,{removed:!0},ce):s.notFound()),e.post("/api/projects/workflows/:id/enable",s=>{let o=t.dal.setProjectWorkflowEnabled(re(s,"id"),!0);return o===null?s.notFound():H(s,o,ce)}),e.post("/api/projects/workflows/:id/disable",s=>{let o=t.dal.setProjectWorkflowEnabled(re(s,"id"),!1);return o===null?s.notFound():H(s,o,ce)}),e.get("/api/projects/:name/issues",s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=jy(s.req.query("status"),nD);if(typeof i=="string")return s.text(i,400);let a=jy(s.req.query("severity"),Dy);return typeof a=="string"?s.text(a,400):H(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")}:{}}),cD)}),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 In(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=sD(i.severity);if(typeof c=="object")return s.text(c.error,400);let u=oD(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 H(s,d,ce)}),e.get("/api/issues/:id",s=>{let o=t.dal.getIssue(re(s,"id"));return o===null?s.notFound():H(s,o,ce)}),e.post("/api/issues/:id/claim",async s=>{let o=re(s,"id"),i=t.dal.getIssue(o);if(i===null)return s.notFound();let a=await In(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):H(s,c,ce)}),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 In(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):H(s,l,ce)}),e.post("/api/issues/:id/close",async s=>{let o=t.dal.getIssue(re(s,"id"));if(o===null)return s.notFound();let i=await In(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 H(s,t.dal.closeIssue(re(s,"id"),a,typeof i.commit_hash=="string"?i.commit_hash:null),ce)}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(re(s,"id"));if(o===null)return s.notFound();let i=await In(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 H(s,t.dal.reopenIssue(re(s,"id"),a),ce)}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 H(s,{...o,owner:a,repo:l},ce)}),e.get("/api/runs/:run_id/artifacts",s=>{let o=re(s,"run_id"),i=s.req.query("kind"),a=$r(t.dal,o,i);return H(s,a,ce)}),e.get("/api/runs/:run_id/artifacts/:kind",async s=>{let o=re(s,"run_id"),i=s.req.param("kind"),a=$r(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):H(s,l,ce);if(l.path!==null&&l.path!==void 0){if(c)try{let{readFileSync:u}=await import("node:fs"),d=eD(l.path);if(tD(d)){let h=u(l.path,"utf8");return s.body(h,200,{"Content-Type":d})}let f=u(l.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength),p=HM(l.path);return s.body(m,200,{"Content-Type":d,"Content-Disposition":`attachment; filename="${p}"`})}catch(u){return s.text(`failed to read artifact path: ${u.message}`,500)}return H(s,l,ce)}return H(s,l,ce)}),e.get("/api/runs",s=>H(s,en(t.dal,{limit:rd(s,"limit")??100}),mD)),e.get("/api/runs/:id",s=>{let o=Nr(t.dal,re(s,"id"));return o===null?s.notFound():H(s,o,pD)}),e.get("/api/runs/:id/where",s=>{let o=tn(t.dal,re(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Bo(o)):s.json(o)}),e.get("/api/runs/:id/timeline",s=>{let o=qo(t.dal,re(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Ho(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(re(s,"id"),o);return!i.resumed&&i.reason==="run_not_found"?s.notFound():i.resumed?(fa(t.daemon),H(s,i,Ay)):H(s,i,Ay,400)}),e.post("/api/interactive/:step_id/respond",async s=>{let o=re(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?(fa(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=>xy(s,t.dal,o=>H(s,o,_D))),e.get("/api/runs/:id/steps/:step_id/transcript",s=>{let o=Vp(t.dal,re(s,"id"),re(s,"step_id"));return o===null?s.notFound():My(s)?s.html(`<pre>${T(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=>xy(s,t.dal,o=>{let i=ly(o);return H(s,i,a=>fe(["role","text"],a.map(l=>[T(l.role),T(l.text)])))})),e.get("/api/external-objects",s=>H(s,Yp(t.dal,{type:s.req.query("type")}),gD)),e.get("/api/external-signals",s=>H(s,zp(t.dal,{unhandled:s.req.query("unhandled")==="true"}),wD)),e.get("/api/attentions",s=>H(s,tr(t.dal,{unacked:s.req.query("unacked")==="true"}),yD)),e.post("/api/attentions/:id/ack",s=>{let o=t.dal.acknowledgeAttention(re(s,"id"));return o===null?s.notFound():H(s,o,i=>`<p>acknowledged attention ${T(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=Wo(t.dal,l);return H(s,c,u=>`<h1>Escalations</h1>${fe(["attention_id","project","run","workflow","state","prompt"],u.map(d=>[T(d.attention_id),T(d.project),T(d.run_id),T(d.workflow_name),T(d.state_name),T((d.prompt??"").slice(0,120))]))}`)}),e.get("/api/escalations/:id",s=>{let o=Et(t.dal,re(s,"id"));return o===null?s.notFound():H(s,o,ce)}),e.post("/api/escalations/:id/respond",async s=>{let o=re(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=Et(t.dal,o);if(c===null)return s.notFound();let u=tr(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);fa(t.daemon);let p=tr(t.dal).find(h=>h.id===o);return s.json({ok:!0,attention_id:o,run_id:m.run.id,decision:i,session_status:"escalation_resumed",acknowledged_at:p?.acknowledged_at??null})}if(u.kind!=="interactive_waiting_operator")return s.json({ok:!1,reason:"wrong_kind",kind:u.kind},400);if(u.acknowledged_at!==null)return s.json({ok:!1,reason:"already_acked"},400);if(c.step_id===null)return s.json({ok:!1,reason:"no_step"},400);let d=t.dal.resumeInteractive(c.step_id,i,a);if(!d.resumed)return s.json({ok:!1,reason:d.reason,step_id:c.step_id},400);let f=t.dal.acknowledgeAttention(o);return fa(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=Xp(t.dal,{status:i,pr_url:o});return H(s,a,ED)}),e.get("/api/submitted-prs/:id",s=>{let o=re(s,"id"),i=Gp(t.dal,o);return i===null?s.notFound():H(s,i,bD)}),e.get("/api/sessions",s=>H(s,t.dal.latestSessionSizes(),Ry)),e.get("/api/sessions/:team_name/:alias/history",s=>{let o=Zn(s.req.param("team_name"));return H(s,t.dal.sessionSizeHistory(o,s.req.param("alias")),Ry)}),e.post("/api/sessions/:team_name/:alias/compact",async s=>{let o=Zn(s.req.param("team_name"));try{let i=await Dp(t.dal,o,s.req.param("alias"));return H(s,i,a=>Oy("compacted",a.row))}catch(i){if(i instanceof zn)return s.text(i.message,409);throw i}}),e.post("/api/sessions/:team_name/:alias/refresh",async s=>{let o=Zn(s.req.param("team_name")),i=await fc(t.dal,o,s.req.param("alias"));return H(s,i,a=>Oy(`refreshed ${a.sessionid}`,a.row))}),e.get("/api/intake/state",s=>H(s,r,Ly)),e.post("/api/intake/scan",async s=>(r=await _n(t.dal),H(s,r,Ly))),e.get("/api/stats/run-throughput",s=>H(s,eh(t.dal),TD)),e.get("/api/daemon/state",s=>H(s,t.daemon?.state??null,SD)),e.post("/api/daemon/cycle",async s=>{if(t.daemon===void 0)return H(s,{disabled:!0},ce);let o=await t.daemon.runCycle();return H(s,{state:t.daemon.state,result:o},ce)}),e.get("/metrics/:project_id",s=>{let o=re(s,"project_id"),i=t.dal.getProject(o);if(i===null)return s.notFound();let a=yc(t.dal,o),l=Ec(t.dal,{project_id:o});return s.html(Oe(`Metrics \u2014 ${i.name}`,kD(i.name,a,l)))}),e.get("/api/metrics/reviewer/:project_id",s=>{let o=re(s,"project_id");if(t.dal.getProject(o)===null)return s.notFound();let i=rd(s,"since_days");return s.json(yc(t.dal,o,i))}),e.get("/api/metrics/tools/:project_id",s=>{let o=re(s,"project_id");if(t.dal.getProject(o)===null)return s.notFound();let i=rd(s,"since_days");return s.json(Ec(t.dal,{project_id:o,since_days:i}))}),e.post("/api/drift/:id/ack",s=>{let o=t.dal.acknowledgeDriftSignal(re(s,"id"));return o===null?s.notFound():s.json({id:o.id,acknowledged_at:o.acknowledged_at})}),e}function xy(t,e,r){let n=wc(e,re(t,"id"),re(t,"step_id"));return n===null?t.notFound():r(n)}function fa(t){t!==void 0&&t.runCycle().catch(()=>{})}function H(t,e,r,n=200){return My(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 My(t){let e=t.req.header("accept")??"";return e.includes("text/html")&&!e.includes("application/json")}function ZM(){let t=process.env.LMCTL_WEBUI_DIST;if(t!==void 0)return da(`${t}/index.html`)?nd(t):null;let e="src/serve/webui-dist";if(da(`${e}/index.html`))return e;let r="dist/serve/webui-dist";if(da(`${r}/index.html`))return r;let n=KM(JM(YM(import.meta.url)),"webui-dist");return da(`${n}/index.html`)?nd(n):null}function nd(t){if(!GM(t))return t;let e=VM(process.cwd(),t);return e.length===0?".":e}function QM(){return async(t,e)=>{await e(),t.header("Cache-Control","no-store")}}function re(t,e){return Number(t.req.param(e))}function rd(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 eD(t){switch(XM(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 tD(t){return!!(t.startsWith("text/")||t.startsWith("application/json")||t.startsWith("application/xml"))}async function In(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 rD(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 jy(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 sD(t){if(t!=null)return typeof t=="string"&&Dy.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function oD(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 iD(t){return`<h1>Status</h1><div class="grid">
|
|
1720
1720
|
<div class="metric"><strong>${t.jobs.queued}</strong><br>queued jobs</div>
|
|
1721
1721
|
<div class="metric"><strong>${t.jobs.done}</strong><br>done jobs</div>
|
|
1722
1722
|
<div class="metric"><strong>${t.runs.active}</strong><br>active runs</div>
|
|
@@ -1736,7 +1736,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
|
|
|
1736
1736
|
</fieldset>
|
|
1737
1737
|
</form>
|
|
1738
1738
|
<div id="pause-result" style="margin-top:0.6em;"></div>
|
|
1739
|
-
</section>`}function _D(t){return`<section><h3>${T(t.state_name)}</h3>${ce(t)}<p><a hx-get="/api/runs/${t.run_id}/steps/${t.id}/transcript" hx-target="closest section" hx-swap="beforeend">Transcript</a> <a hx-get="/api/runs/${t.run_id}/steps/${t.id}/messages" hx-target="closest section" hx-swap="beforeend">Messages</a></p></section>`}function
|
|
1739
|
+
</section>`}function _D(t){return`<section><h3>${T(t.state_name)}</h3>${ce(t)}<p><a hx-get="/api/runs/${t.run_id}/steps/${t.id}/transcript" hx-target="closest section" hx-swap="beforeend">Transcript</a> <a hx-get="/api/runs/${t.run_id}/steps/${t.id}/messages" hx-target="closest section" hx-swap="beforeend">Messages</a></p></section>`}function Ay(t){return t.resumed?`<p>resumed run ${T(t.run.id)}</p>`:`<p>resume failed: ${T(t.reason)}</p>`}function gD(t){return`<h1>External Objects</h1>${fe(["id","type","provider","external_id","status","url"],t.map(e=>[T(e.id),T(e.type),T(e.provider),T(e.external_id),T(e.status),T(e.url)]))}`}function wD(t){return`<h1>External Signals</h1>${fe(["id","object","kind","handled"],t.map(e=>[T(e.id),T(e.object_id),T(e.kind),T(e.handled_at)]))}`}function yD(t){let e=`<style>
|
|
1740
1740
|
@keyframes attn-flicker { 0%,100%{background:#fff8e6;} 50%{background:#ffd766;} }
|
|
1741
1741
|
tr.requires-user { animation: attn-flicker 1.4s ease-in-out infinite; font-weight:600; }
|
|
1742
1742
|
tr.requires-user td:first-child::before { content:"\u2605 "; color:#d28e00; }
|
|
@@ -1750,7 +1750,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
|
|
|
1750
1750
|
<dt>submitted_at</dt><dd>${T(t.submitted_at)}</dd>
|
|
1751
1751
|
<dt>last_scanned_at</dt><dd>${T(t.last_scanned_at??"\u2014")}</dd>
|
|
1752
1752
|
<dt>last_known_state</dt><dd>${T(t.last_known_state??"\u2014")}</dd>
|
|
1753
|
-
</dl>`}function
|
|
1753
|
+
</dl>`}function Ry(t){return`<h1>Sessions</h1>${fe(["team","alias","session","input","cache","output","total","observed","actions"],t.map(e=>{let r=Ro(e.team_name),n=encodeURIComponent(e.alias);return[T(e.team_name),T(e.alias),T(e.sessionid),T(e.input_tokens),T(e.cache_tokens),T(e.output_tokens),T(e.total_tokens),T(e.observed_at),`<button hx-post="/api/sessions/${r}/${n}/compact" hx-swap="outerHTML">Compact</button> <button hx-post="/api/sessions/${r}/${n}/refresh" hx-swap="outerHTML">Refresh</button>`]}))}`}function Oy(t,e){return e===null?`<span>${T(t)}</span>`:`<span>${T(t)} ${T(e.team_name)}/${T(e.alias)}</span>`}function TD(t){return`<h1>Run Throughput</h1>${fe(["workflow","terminal","count"],t.map(e=>[T(e.workflow_name),T(e.terminal_state),T(e.count)]))}`}function Ly(t){return`<h1>Intake</h1><button hx-post="/api/intake/scan" hx-target="main" hx-swap="innerHTML">Scan now</button>${fe(["project","scanned","new jobs","error"],t.map(e=>[T(e.project_name),T(e.scanned),T(e.new_jobs),T(e.error)]))}`}function SD(t){return`<h1>Daemon</h1>${t===null?"<p>disabled</p>":`${ce(t)}<button hx-post="/api/daemon/cycle" hx-target="main" hx-swap="beforeend">Run cycle now</button>`}`}function kD(t,e,r){let n=e.request_changes_rate,s=n.by_state.map(l=>[T(l.state_name),T(l.total),T(l.request_changes),T(l.rate_pct)]),o=e.step_duration_histogram.map(l=>[T(l.state_name),T(l.lt_5min),T(l.btw_5_15min),T(l.btw_15_60min),T(l.gt_60min),T(l.no_end)]),i=e.retry_counts.map(l=>[T(l.state_name),T(l.retried_runs),T(l.avg_retries)]),a=r.map(l=>[T(l.tool_name),T(l.invocations),T(l.successes),T(l.hit_rate_pct),T(l.avg_latency_ms??"n/a"),T(l.p50_latency_ms??"n/a"),T(l.p95_latency_ms??"n/a")]);return`<h1>Metrics \u2014 ${T(t)}</h1>
|
|
1754
1754
|
<h2>Request-changes rate</h2>
|
|
1755
1755
|
<p>Total: ${T(n.request_changes)} of ${T(n.total)} steps (${T(n.rate_pct)})</p>
|
|
1756
1756
|
${fe(["state","total steps","request_changes","rate"],s)}
|
|
@@ -1759,31 +1759,31 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
|
|
|
1759
1759
|
<h2>Retry counts (runs with >1 attempt per state)</h2>
|
|
1760
1760
|
${fe(["state","retried runs","avg attempts"],i)}
|
|
1761
1761
|
<h2>Tool efficacy</h2>
|
|
1762
|
-
${fe(["tool","invocations","successes (status=ok)","hit rate","avg latency ms","p50 ms","p95 ms"],a)}`}var nD,
|
|
1762
|
+
${fe(["tool","invocations","successes (status=ok)","hit rate","avg latency ms","p50 ms","p95 ms"],a)}`}var nD,Dy,Py=b(()=>{"use strict";Ni();dn();j_();M_();q_();Dt();gu();Ow();Ww();Gw();ey();iy();cy();Sy();Oo();$y();Hi();nD=["open","assigned","closed","reopened"],Dy=["low","medium","high","critical"]});function vD(t){return Math.floor(t/6e4)*6e4}function ID(t){t.db.transaction(()=>{let e=t.getRollupCursor(),r=t.listSessionEventsSince(e);if(r.length!==0){for(let n of r)ND(t,n);t.setRollupCursor(r[r.length-1].id)}})()}function ND(t,e){let r=Date.now(),n=vD(e.timestamp_ms),s=n+6e4;if(e.kind==="tool_use"){t.addRollupValue({run_id:e.run_id,step_id:e.step_id,metric_kind:"tool_calls_count",value:1,bucket_start_ms:n,bucket_end_ms:s,updated_at:r});return}if(e.kind==="tool_result"){let o={};try{o=JSON.parse(e.payload)}catch{}let i=typeof o.elapsedMs=="number"&&o.elapsedMs>0?o.elapsedMs:0;i>0&&t.addRollupValue({run_id:e.run_id,step_id:e.step_id,metric_kind:"time_in_tool_use_ms",value:i,bucket_start_ms:n,bucket_end_ms:s,updated_at:r});return}if(e.kind==="text"){let o=Buffer.byteLength(e.payload,"utf8");t.addRollupValue({run_id:e.run_id,step_id:e.step_id,metric_kind:"message_delta_bytes",value:o,bucket_start_ms:n,bucket_end_ms:s,updated_at:r})}}function Fy(t,e=250){let r=setInterval(()=>{try{ID(t)}catch{}},e);return{stop(){clearInterval(r)}}}var Uy=b(()=>{"use strict"});function xD({dal:t}){let e=t.listProjects();for(let r of e){let n=t.query(`SELECT r.id, r.team_id
|
|
1763
1763
|
FROM run r
|
|
1764
1764
|
JOIN job j ON j.id = r.job_id
|
|
1765
1765
|
WHERE j.project_id = ?
|
|
1766
1766
|
AND r.terminal_state IS NOT NULL
|
|
1767
1767
|
ORDER BY r.id DESC
|
|
1768
|
-
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,$D).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,Ww)||t.insertDriftSignal({team_member_id:a.id,project_id:r.id,signal_kind:Ww,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 Bw(t){for(let e of jD)try{e(t)}catch{}}var $D,Ww,jD,qw=b(()=>{"use strict";$D="request_changes",Ww="reviewer_rejection_rate_high";jD=[xD]});function vs(){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 Hw(t){let e=t.intervalMs??vs(),r=t.runOnceFn??Lr,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??Fw)(t.dal));let c=f=>{n.running&&(s=setTimeout(()=>{d.runCycle().finally(()=>c(e))},f))},u=f=>{n.running&&(o=setTimeout(()=>{a===null&&(a=Jw(t.dal,t.monitorSessionActivityFn??mc,e,n).finally(()=>{a=null})),a.finally(()=>u(pc(t.dal,e)))},f))},d={state:n,runCycle:async()=>(i!==null||(i=AD(t.dal,r,t.collectSessionSizesFn??Mp,t.scanIntakeFn??_n,t.monitorSessionActivityFn??mc,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 AD(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(hy({dal:t}),Bw({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 Jw(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 Jw(t,e,r,n){let s=pc(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 sd=b(()=>{"use strict";Ni();Ss();Lu();Oo();Uw();qw();hc()});function Xw(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 Gw=b(()=>{"use strict"});import{mkdirSync as RD,readFileSync as OD,readdirSync as LD,statSync as CD,writeFileSync as MD}from"node:fs";import{dirname as DD,join as Vw,sep as Kw}from"node:path";function ma(t){return{s3:{async send(n){let s=n;switch(s._localfsTag){case Yw:return PD(t,s.input);case zw:return FD(t,s.input);case Zw:return UD(t,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:ad,GetObjectCommand:id,PutObjectCommand:od}}}function PD(t,e){let r=Qw(t,e.Key);return RD(DD(r),{recursive:!0}),MD(r,e.Body),{}}function FD(t,e){let r=Qw(t,e.Key),n;try{n=OD(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 UD(t,e){let r=e.Prefix??"";eE(r);let s=WD(t).sort((u,d)=>u.key<d.key?-1:u.key>d.key?1:0).filter(u=>u.key.startsWith(r)),o=e.ContinuationToken;o!==void 0&&o!==""&&(s=s.filter(u=>u.key>o));let i=typeof e.MaxKeys=="number"&&Number.isFinite(e.MaxKeys)&&e.MaxKeys>0?Math.floor(e.MaxKeys):void 0,a=s,l=!1;i!==void 0&&s.length>i&&(a=s.slice(0,i),l=!0);let c={Contents:a.map(u=>({Key:u.key,LastModified:u.lastModified})),IsTruncated:l};return l&&(c.NextContinuationToken=a[a.length-1].key),c}function Qw(t,e){return eE(e),Vw(t,e)}function eE(t){if(t.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${t}`)}function WD(t){let e=[],r=(n,s)=>{let o;try{o=LD(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=Vw(n,i.name);if(i.isDirectory())r(l,a);else if(i.isFile()){let c=Kw==="/"?a:a.split(Kw).join("/");e.push({key:c,lastModified:CD(l).mtime})}}};return r(t,""),e}var Yw,zw,Zw,od,id,ad,ld=b(()=>{"use strict";Yw="localfs-put",zw="localfs-get",Zw="localfs-list",od=class{input;_localfsTag=Yw;constructor(e){this.input=e}},id=class{input;_localfsTag=zw;constructor(e){this.input=e}},ad=class{input;_localfsTag=Zw;constructor(e){this.input=e}}});function tE(){return{put:0,get:0,list:0}}function cd(t,e=BD){return t.put*e.putUsd+t.get*e.getUsd+t.list*e.listUsd}function ud(t){let e=new Date(t),r=e.getUTCFullYear(),n=String(e.getUTCMonth()+1).padStart(2,"0");return`${r}-${n}`}var BD,pa,dd=b(()=>{"use strict";BD={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};pa=class{counts=tE();record(e,r=1){this.counts[e]+=r}peek(){return{...this.counts}}drain(){let e={...this.counts};return this.counts=tE(),e}estimateCostUsd(e){return cd(this.counts,e)}}});function rE(t){let e=t.now??Date.now,r=t.timers??qD,n=null,s=null;async function o(){let l=e(),c=ud(l),u=t.meter.drain();(u.put>0||u.get>0||u.list>0)&&t.store.addUsage({user_id:t.userId,device_id:t.deviceId,period:c,put:u.put,get:u.get,list:u.list,updated_at:new Date(l).toISOString()});let d=t.store.loadUsage(t.userId,t.deviceId,c),f=d?{put:d.put_count,get:d.get_count,list:d.list_count}:{put:0,get:0,list:0};if(t.publishOwnRollup!==void 0)try{await t.publishOwnRollup(c,f)}catch(h){t.log?.(`[usage] publish rollup failed: ${h instanceof Error?h.message:String(h)}`)}let m=f;if(t.readUserTotal!==void 0)try{m=await t.readUserTotal(c)}catch(h){t.log?.(`[usage] read user total failed: ${h instanceof Error?h.message:String(h)}`),m=f}let p=cd(m);if(n!==c&&p>=t.ceilingUsd){n=c,t.log?.(`[usage] quota exceeded period=${c} cost=$${p.toFixed(4)} >= ceiling $${t.ceilingUsd}`);try{t.onQuotaExceeded({period:c,costUsd:p,ceilingUsd:t.ceilingUsd})}catch(h){t.log?.(`[usage] onQuotaExceeded threw: ${h instanceof Error?h.message:String(h)}`)}}}function i(){return s=(s??Promise.resolve()).then(()=>o()).catch(()=>{}),s}let a=r.setInterval(()=>{i()},t.intervalMs);return{stop(){r.clearInterval(a)},flushNow(){return i()},isOverQuota(){return n!==null&&n===ud(e())}}}var qD,nE=b(()=>{"use strict";dd();qD={setInterval:(t,e)=>setInterval(t,e),clearInterval:t=>clearInterval(t)}});var fd=b(()=>{"use strict";zi();Qi();Qi()});function HD(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 JD(t){return t.reply_to!==void 0&&t.response!==void 0}function XD(t){if(typeof t!="object"||t===null)return;let e=t.conversation_id;return typeof e=="string"?e:void 0}function sE(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 ha,Is,oE=b(()=>{"use strict";fd();ha=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(e="MailboxFetchClient stopped before a response arrived"){super(e)}},Is=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 ha("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=qt(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(sE(c));return}u=()=>{this.pending.has(s)&&(this.pending.delete(s),l(sE(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 ha;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=HD(e);if(n===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(JD(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??XD(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:qt(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 md(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 iE=b(()=>{"use strict"});function pd(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 aE=b(()=>{"use strict"});function _d(t){if(typeof t!="object"||t===null||Array.isArray(t))return!1;let e=t;if(e.kind!=="daemon_event"||typeof e.event!="string"||e.event===""||typeof e.ts!="number")return!1;if(e.event==="workflows"){if(!Array.isArray(e.workflows))return!1;for(let r of e.workflows){if(typeof r!="object"||r===null||Array.isArray(r))return!1;let n=r;if(typeof n.teamfile_path!="string"||n.teamfile_path===""||n.name!==null&&typeof n.name!="string"||typeof n.registered_at!="string"||n.registered_at===""||n.last_seeded_at!==null&&typeof n.last_seeded_at!="string")return!1}}else if(e.event==="chat_log"){if(typeof e.entry!="object"||e.entry===null||Array.isArray(e.entry))return!1;let r=e.entry;if(typeof r.id!="number"||typeof r.root_teamfile!="string"||r.root_teamfile===""||typeof r.sender_teamfile!="string"||r.sender_teamfile===""||typeof r.sender_alias!="string"||r.sender_alias===""||typeof r.receiver_teamfile!="string"||r.receiver_teamfile===""||typeof r.receiver_alias!="string"||r.receiver_alias===""||typeof r.message!="string"||r.response!==null&&typeof r.response!="string"||typeof r.status!="string"||r.status===""||typeof r.created_at!="string"||r.created_at==="")return!1}return!0}var hd,lE=b(()=>{"use strict";hd="daemon:events"});function uE(t){return{kind:"prompt",prompt_id:t.prompt_id??qt(t.now?.()??Date.now(),t.random??Math.random),root_teamfile:t.root_teamfile,text:t.text}}function gd(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 cE,yd=b(()=>{"use strict";fd();cE="prompt:root"});function Ns(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(fE(e[1]));return typeof r.sub=="string"&&r.sub!==""?r.sub:null}catch{return null}}function GD(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(fE(e[1]));return typeof r.exp=="number"&&Number.isFinite(r.exp)?r.exp:null}catch{return null}}function dE(t,e=60){if(typeof t!="string"||t==="")return!0;let r=GD(t);return r===null?!0:Date.now()/1e3>=r-e}function fE(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 wd=b(()=>{"use strict"});async function _a(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":KD},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 KD,Ed=b(()=>{"use strict";KD="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as mE,mkdirSync as pE,readFileSync as hE,writeFileSync as _E}from"node:fs";import{homedir as gE}from"node:os";import{dirname as yE,join as wE}from"node:path";function $s(){return process.env.LMCTL_DEVICE_AUTH_PATH??wE(gE(),".lmctl","device-auth.json")}function EE(){return process.env.LMCTL_TOKEN_PATH??wE(gE(),".lmctl","cli-tokens.json")}function bd(t=$s()){try{let e=JSON.parse(hE(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 bE(t,e=$s()){pE(yE(e),{recursive:!0,mode:448}),_E(e,JSON.stringify(t,null,2));try{mE(e,384)}catch{}}function Td(t,e=EE()){let r={};try{r=JSON.parse(hE(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};pE(yE(e),{recursive:!0,mode:448}),_E(e,JSON.stringify(s,null,2));try{mE(e,384)}catch{}}async function TE(t){let e=t.deviceAuthPath??$s(),r=bd(e);if(r===null)throw new Error("device_auth_not_found: no ~/.lmctl/device-auth.json; run `lmctl device login` first");let n=await _a({region:t.region,clientId:t.clientId,refreshToken:r.refreshToken,...t.fetchImpl!==void 0?{fetchImpl:t.fetchImpl}:{}});return Td({idToken:n.idToken,...n.accessToken!==void 0?{accessToken:n.accessToken}:{},refreshToken:r.refreshToken,...n.expiresAt!==void 0?{expiresAt:n.expiresAt}:{}},t.cliTokensPath??EE()),{idToken:n.idToken,userId:r.userId}}var Sd=b(()=>{"use strict";Ed()});function SE(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(`
|
|
1769
|
-
`);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(!VD.has(c))throw new St(`unknown frontmatter key "${c}" \u2014 allowed keys: ${ga.join(", ")}`);r[c]=u}if(n===-1)throw new St("frontmatter not closed (missing trailing `---` on its own line)");for(let i of ga)if(r[i]===void 0)throw new St(`missing required frontmatter key "${i}" \u2014 required: ${ga.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 ga,VD,St,kE=b(()=>{"use strict";ga=["title","description","members"],VD=new Set(ga),St=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});import{readFileSync as YD,writeFileSync as
|
|
1768
|
+
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,$D).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,Wy)||t.insertDriftSignal({team_member_id:a.id,project_id:r.id,signal_kind:Wy,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 By(t){for(let e of jD)try{e(t)}catch{}}var $D,Wy,jD,qy=b(()=>{"use strict";$D="request_changes",Wy="reviewer_rejection_rate_high";jD=[xD]});function vs(){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 Hy(t){let e=t.intervalMs??vs(),r=t.runOnceFn??Lr,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??Fy)(t.dal));let c=f=>{n.running&&(s=setTimeout(()=>{d.runCycle().finally(()=>c(e))},f))},u=f=>{n.running&&(o=setTimeout(()=>{a===null&&(a=Jy(t.dal,t.monitorSessionActivityFn??mc,e,n).finally(()=>{a=null})),a.finally(()=>u(pc(t.dal,e)))},f))},d={state:n,runCycle:async()=>(i!==null||(i=AD(t.dal,r,t.collectSessionSizesFn??Mp,t.scanIntakeFn??_n,t.monitorSessionActivityFn??mc,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 AD(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(hw({dal:t}),By({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 Jy(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 Jy(t,e,r,n){let s=pc(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 sd=b(()=>{"use strict";Ni();Ss();Lu();Oo();Uy();qy();hc()});function Xy(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 Gy=b(()=>{"use strict"});import{mkdirSync as RD,readFileSync as OD,readdirSync as LD,statSync as CD,writeFileSync as MD}from"node:fs";import{dirname as DD,join as Vy,sep as Ky}from"node:path";function ma(t){return{s3:{async send(n){let s=n;switch(s._localfsTag){case Yy:return PD(t,s.input);case zy:return FD(t,s.input);case Zy:return UD(t,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:ad,GetObjectCommand:id,PutObjectCommand:od}}}function PD(t,e){let r=Qy(t,e.Key);return RD(DD(r),{recursive:!0}),MD(r,e.Body),{}}function FD(t,e){let r=Qy(t,e.Key),n;try{n=OD(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 UD(t,e){let r=e.Prefix??"";eE(r);let s=WD(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 Qy(t,e){return eE(e),Vy(t,e)}function eE(t){if(t.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${t}`)}function WD(t){let e=[],r=(n,s)=>{let o;try{o=LD(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=Vy(n,i.name);if(i.isDirectory())r(l,a);else if(i.isFile()){let c=Ky==="/"?a:a.split(Ky).join("/");e.push({key:c,lastModified:CD(l).mtime})}}};return r(t,""),e}var Yy,zy,Zy,od,id,ad,ld=b(()=>{"use strict";Yy="localfs-put",zy="localfs-get",Zy="localfs-list",od=class{input;_localfsTag=Yy;constructor(e){this.input=e}},id=class{input;_localfsTag=zy;constructor(e){this.input=e}},ad=class{input;_localfsTag=Zy;constructor(e){this.input=e}}});function tE(){return{put:0,get:0,list:0}}function cd(t,e=BD){return t.put*e.putUsd+t.get*e.getUsd+t.list*e.listUsd}function ud(t){let e=new Date(t),r=e.getUTCFullYear(),n=String(e.getUTCMonth()+1).padStart(2,"0");return`${r}-${n}`}var BD,pa,dd=b(()=>{"use strict";BD={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};pa=class{counts=tE();record(e,r=1){this.counts[e]+=r}peek(){return{...this.counts}}drain(){let e={...this.counts};return this.counts=tE(),e}estimateCostUsd(e){return cd(this.counts,e)}}});function rE(t){let e=t.now??Date.now,r=t.timers??qD,n=null,s=null;async function o(){let l=e(),c=ud(l),u=t.meter.drain();(u.put>0||u.get>0||u.list>0)&&t.store.addUsage({user_id:t.userId,device_id:t.deviceId,period:c,put:u.put,get:u.get,list:u.list,updated_at:new Date(l).toISOString()});let d=t.store.loadUsage(t.userId,t.deviceId,c),f=d?{put:d.put_count,get:d.get_count,list:d.list_count}:{put:0,get:0,list:0};if(t.publishOwnRollup!==void 0)try{await t.publishOwnRollup(c,f)}catch(h){t.log?.(`[usage] publish rollup failed: ${h instanceof Error?h.message:String(h)}`)}let m=f;if(t.readUserTotal!==void 0)try{m=await t.readUserTotal(c)}catch(h){t.log?.(`[usage] read user total failed: ${h instanceof Error?h.message:String(h)}`),m=f}let p=cd(m);if(n!==c&&p>=t.ceilingUsd){n=c,t.log?.(`[usage] quota exceeded period=${c} cost=$${p.toFixed(4)} >= ceiling $${t.ceilingUsd}`);try{t.onQuotaExceeded({period:c,costUsd:p,ceilingUsd:t.ceilingUsd})}catch(h){t.log?.(`[usage] onQuotaExceeded threw: ${h instanceof Error?h.message:String(h)}`)}}}function i(){return s=(s??Promise.resolve()).then(()=>o()).catch(()=>{}),s}let a=r.setInterval(()=>{i()},t.intervalMs);return{stop(){r.clearInterval(a)},flushNow(){return i()},isOverQuota(){return n!==null&&n===ud(e())}}}var qD,nE=b(()=>{"use strict";dd();qD={setInterval:(t,e)=>setInterval(t,e),clearInterval:t=>clearInterval(t)}});var fd=b(()=>{"use strict";zi();Qi();Qi()});function HD(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 JD(t){return t.reply_to!==void 0&&t.response!==void 0}function XD(t){if(typeof t!="object"||t===null)return;let e=t.conversation_id;return typeof e=="string"?e:void 0}function sE(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 ha,Is,oE=b(()=>{"use strict";fd();ha=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(e="MailboxFetchClient stopped before a response arrived"){super(e)}},Is=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 ha("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=qt(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(sE(c));return}u=()=>{this.pending.has(s)&&(this.pending.delete(s),l(sE(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 ha;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=HD(e);if(n===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(JD(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??XD(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:qt(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 md(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 iE=b(()=>{"use strict"});function pd(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 aE=b(()=>{"use strict"});function _d(t){if(typeof t!="object"||t===null||Array.isArray(t))return!1;let e=t;if(e.kind!=="daemon_event"||typeof e.event!="string"||e.event===""||typeof e.ts!="number")return!1;if(e.event==="workflows"){if(!Array.isArray(e.workflows))return!1;for(let r of e.workflows){if(typeof r!="object"||r===null||Array.isArray(r))return!1;let n=r;if(typeof n.teamfile_path!="string"||n.teamfile_path===""||n.name!==null&&typeof n.name!="string"||typeof n.registered_at!="string"||n.registered_at===""||n.last_seeded_at!==null&&typeof n.last_seeded_at!="string")return!1}}else if(e.event==="chat_log"){if(typeof e.entry!="object"||e.entry===null||Array.isArray(e.entry))return!1;let r=e.entry;if(typeof r.id!="number"||typeof r.root_teamfile!="string"||r.root_teamfile===""||typeof r.sender_teamfile!="string"||r.sender_teamfile===""||typeof r.sender_alias!="string"||r.sender_alias===""||typeof r.receiver_teamfile!="string"||r.receiver_teamfile===""||typeof r.receiver_alias!="string"||r.receiver_alias===""||typeof r.message!="string"||r.response!==null&&typeof r.response!="string"||typeof r.status!="string"||r.status===""||typeof r.created_at!="string"||r.created_at==="")return!1}return!0}var hd,lE=b(()=>{"use strict";hd="daemon:events"});function uE(t){return{kind:"prompt",prompt_id:t.prompt_id??qt(t.now?.()??Date.now(),t.random??Math.random),root_teamfile:t.root_teamfile,text:t.text}}function gd(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 cE,wd=b(()=>{"use strict";fd();cE="prompt:root"});function Ns(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(fE(e[1]));return typeof r.sub=="string"&&r.sub!==""?r.sub:null}catch{return null}}function GD(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(fE(e[1]));return typeof r.exp=="number"&&Number.isFinite(r.exp)?r.exp:null}catch{return null}}function dE(t,e=60){if(typeof t!="string"||t==="")return!0;let r=GD(t);return r===null?!0:Date.now()/1e3>=r-e}function fE(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 yd=b(()=>{"use strict"});async function _a(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":KD},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 KD,Ed=b(()=>{"use strict";KD="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as mE,mkdirSync as pE,readFileSync as hE,writeFileSync as _E}from"node:fs";import{homedir as gE}from"node:os";import{dirname as wE,join as yE}from"node:path";function $s(){return process.env.LMCTL_DEVICE_AUTH_PATH??yE(gE(),".lmctl","device-auth.json")}function EE(){return process.env.LMCTL_TOKEN_PATH??yE(gE(),".lmctl","cli-tokens.json")}function bd(t=$s()){try{let e=JSON.parse(hE(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 bE(t,e=$s()){pE(wE(e),{recursive:!0,mode:448}),_E(e,JSON.stringify(t,null,2));try{mE(e,384)}catch{}}function Td(t,e=EE()){let r={};try{r=JSON.parse(hE(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};pE(wE(e),{recursive:!0,mode:448}),_E(e,JSON.stringify(s,null,2));try{mE(e,384)}catch{}}async function TE(t){let e=t.deviceAuthPath??$s(),r=bd(e);if(r===null)throw new Error("device_auth_not_found: no ~/.lmctl/device-auth.json; run `lmctl device login` first");let n=await _a({region:t.region,clientId:t.clientId,refreshToken:r.refreshToken,...t.fetchImpl!==void 0?{fetchImpl:t.fetchImpl}:{}});return Td({idToken:n.idToken,...n.accessToken!==void 0?{accessToken:n.accessToken}:{},refreshToken:r.refreshToken,...n.expiresAt!==void 0?{expiresAt:n.expiresAt}:{}},t.cliTokensPath??EE()),{idToken:n.idToken,userId:r.userId}}var Sd=b(()=>{"use strict";Ed()});function SE(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(`
|
|
1769
|
+
`);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(!VD.has(c))throw new St(`unknown frontmatter key "${c}" \u2014 allowed keys: ${ga.join(", ")}`);r[c]=u}if(n===-1)throw new St("frontmatter not closed (missing trailing `---` on its own line)");for(let i of ga)if(r[i]===void 0)throw new St(`missing required frontmatter key "${i}" \u2014 required: ${ga.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 ga,VD,St,kE=b(()=>{"use strict";ga=["title","description","members"],VD=new Set(ga),St=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});import{readFileSync as YD,writeFileSync as Y8,renameSync as z8,existsSync as IE}from"node:fs";import{basename as zD,resolve as Nn,dirname as kd}from"node:path";function QD(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 eP(t){return/^\s*_MEMBER_\s+\S/.test(t)}function tP(t){return/^\s*_SESSION_\s+\S/.test(t)}function rP(t){return/^\s*_CONNECT_(?:\s|$)/.test(t)}function nP(t){return/^\s*_SKILL_(?:\s|$)/.test(t)}function wa(t){let e=zD(t);return e.endsWith(".lmctl")?e.slice(0,-6):e}function Le(t){let e=YD(t,"utf-8"),r=kd(Nn(t)),n=Id(e,wa(t),{baseDir:r,sourcePath:Nn(t)});for(let s of n.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=Nn(r,s.sessiondir));return n}function Id(t,e,r={}){let n=[],s=[],o=[],i=[];r.sourcePath,r.baseDir;let a=t;if(a.startsWith("#teamfile:")){let u=a.indexOf(`
|
|
1770
1770
|
`);a=u>=0?a.slice(u+1):""}let l=null;if(a.startsWith("---"))try{l=SE(a)}catch(u){if(u instanceof St)i.push(`frontmatter: ${u.message}`);else throw u}let c=t.split(`
|
|
1771
1771
|
`);for(let u=0;u<c.length;u++){let d=c[u],f=u+1;if(tP(d))throw new Error(`line ${f}: _SESSION_ is the legacy prefix. Rename to _MEMBER_. (line: ${d.trim()})`);if(rP(d)){s.push(f);continue}if(nP(d)){let g=d.replace(/^\s*_SKILL_\s*/,"").trim(),_=g.length===0?[]:g.split(/\s+/u);if(_.length!==1){i.push(`line ${f}: _SKILL_ requires exactly one https:// URL or local path: ${d.trim()}`);continue}let S=_[0];try{if(new URL(S).protocol!=="https:"){i.push(`line ${f}: _SKILL_ URL must use https:// or a local path: ${S}`);continue}}catch{if(/^[A-Za-z][A-Za-z0-9+.-]*:/u.test(S)&&!/^[A-Za-z]:[\\/]/u.test(S)){i.push(`line ${f}: _SKILL_ URL must use https:// or a local path: ${S}`);continue}}o.push(S);continue}if(!eP(d))continue;let m=QD(d);for(let g of Object.keys(m))if(!vE.includes(g))throw new Error(`line ${f}: unknown key "${g}" on _MEMBER_ line: ${d.trim()}
|
|
1772
|
-
allowed keys: ${vE.join(", ")}`);if(!m.provider&&!m.teamfile){i.push(`line ${f}: member line missing provider (or teamfile): ${d.trim()}`);continue}let h={alias:m.alias||`member${n.length+1}`,provider:m.provider||"",extra:{}};m.sessionid&&(h.session=m.sessionid),Object.prototype.hasOwnProperty.call(m,"sessiondir")&&(h.sessiondir=m.sessiondir),m.teamfile&&(h.teamfile=m.teamfile),m.model&&(h.model=m.model),m.effort&&(h.effort=m.effort),n.push(h)}return{name:e,members:n,deprecatedConnectLines:s,skillUrls:o,rawText:t,parseErrors:i,frontmatter:l}}function Nd(t,e){let r=[];for(let o of t.parseErrors){let i=o.includes("_CONNECT_")?"connect":o.includes("_SKILL_")?"skill":"session";r.push({field:i,message:o})}let n=t.members.filter(o=>o.alias.toLowerCase()===vd.toLowerCase());n.length>1&&r.push({field:vd,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?Nn(e,o.teamfile):Nn(o.teamfile);if(!IE(a))r.push({field:o.alias,message:`Teamfile not found: ${a}`});else{let l=Le(a),c=kt(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 ZD.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 kt(t){return t.members.find(e=>e.alias.toLowerCase()===vd.toLowerCase())}function $d(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=Nn(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),!IE(o))throw new Error(`Teamfile not found: ${o} (referenced by alias "${t.alias}")`);let a=Le(o),l=kt(a);if(!l)throw new Error(`Team at ${o} has no lead session`);if(l.teamfile)return $d(l,kd(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||kd(o),alias:t.alias,resolvedFrom:o,model:l.model,effort:l.effort}}function wa(t,e){return t.members.find(r=>r.alias===e)??t.members.find(r=>r.alias.toLowerCase()===e.toLowerCase())}var vd,ZD,vE,Ht=b(()=>{"use strict";kE();vd="Lead",ZD=new Set(["claude","codex","opencode","gemini","copilot","qwen","agy","ClaudeMock"]);vE=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});import{existsSync as sP,realpathSync as oP}from"node:fs";import{dirname as iP}from"node:path";function xd(t){aP(t).catch(e=>{t.log?.(`[mailbox] prompt trigger failed: ${e instanceof Error?e.message:String(e)}`)})}async function aP(t){let e=t.payload.root_teamfile;try{e=oP(t.payload.root_teamfile)}catch(o){let i=`prompt root missing/unreadable: ${t.payload.root_teamfile}: ${o instanceof Error?o.message:String(o)}`;return await $n(t.store,{rootTeamfile:t.payload.root_teamfile,receiverTeamfile:t.payload.root_teamfile,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:i,log:t.log}),t.log?.(`[mailbox] ${i}`),{status:"error",response:null,error_detail:i}}if(t.store.getRootTeam(e)===null){let o=`prompt root is not registered: ${e}`;return await $n(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:o,log:t.log}),t.log?.(`[mailbox] ${o}`),{status:"error",response:null,error_detail:o}}let r=lP(e);if("error"in r)return await $n(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:r.error,log:t.log}),t.log?.(`[mailbox] ${r.error}`),{status:"error",response:null,error_detail:r.error};let n={receiver_teamfile:e,receiver_alias:r.alias,sender_teamfile:`prompt:${t.payload.prompt_id}`,sender_alias:"operator",started_at:new Date().toISOString()},s=t.store.tryAcquireAgentInflight(n,{stale_before:new Date(Date.now()-dP(t.env??process.env)).toISOString()});if(!s.acquired){let o=uP(r.alias,s.current);return await $n(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:null,status:"error",error_detail:o,log:t.log}),t.log?.(`[mailbox] prompt rejected: ${o}`),{status:"error",response:null,error_detail:o}}try{let i=await(t.chat??Mt)({provider:r.provider,sessionId:r.sessionid,cwd:r.sessiondir,prompt:t.payload.text,env:t.env??process.env,alias:r.alias,permissionMode:"yolo",...t.timeoutMs!==void 0?{timeoutMs:t.timeoutMs}:{}}),a=i.status==="stalled",l=!a&&i.text.trim()==="",c=a?`provider stalled${i.stalledAfterMs!==void 0?` after ${i.stalledAfterMs}ms`:""}`:l?"provider returned empty response":null,u=a||l?"error":"ok";return await $n(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:u==="error"?null:i.text,status:u,error_detail:c,log:t.log}),{status:u,response:u==="error"?null:i.text,error_detail:c}}catch(o){let i=o instanceof Error?o.message:String(o);return await $n(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:null,status:"error",error_detail:i,log:t.log}),t.log?.(`[mailbox] prompt provider error: ${i}`),{status:"error",response:null,error_detail:i}}finally{try{t.store.releaseAgentInflight(n)}catch(o){t.log?.(`[mailbox] failed to release prompt in-flight slot: ${o instanceof Error?o.message:String(o)}`)}}}function lP(t){if(!sP(t))return{error:`prompt root missing/unreadable: ${t}`};let e=Le(t);if(e.parseErrors.length>0)return{error:`prompt root parse error: ${e.parseErrors.join("; ")}`};let r=kt(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??iP(t)}}async function $n(t,e){let r=xE(e.message),n=e.response===null?null:xE(e.response);try{t.insertTeamChatLog({root_teamfile:e.rootTeamfile,sender_teamfile:e.rootTeamfile,sender_alias:"operator",receiver_teamfile:e.receiverTeamfile,receiver_alias:e.receiverAlias,message:r.text,response:n?.text??null,status:e.status,error_detail:e.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()})}catch(s){e.log?.(`[mailbox] warning: failed to record prompt chat log: ${s instanceof Error?s.message:String(s)}`)}}function xE(t){return t.length<=NE?{text:t,truncated:!1}:{text:t.slice(0,NE),truncated:!0}}function cP(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function uP(t,e){return e.sender_teamfile.startsWith("prompt:")?`${t} is busy servicing another prompt since ${e.started_at}`:cP(t,e)}function dP(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return $E;let r=Number(e);return!Number.isFinite(r)||r<=0?$E:r}var NE,$E,jE=b(()=>{"use strict";wt();Ht();NE=256*1024,$E=30*60*1e3});import{chmodSync as ME,existsSync as fP,mkdirSync as DE,readFileSync as Sa,writeFileSync as PE}from"node:fs";import{dirname as jd,resolve as Ea,join as FE}from"node:path";import{fileURLToPath as mP}from"node:url";import{homedir as UE}from"node:os";import{CognitoIdentityClient as pP,GetIdCommand as hP}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as AE}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as _P,ListObjectsV2Command as gP,PutObjectCommand as yP,S3Client as RE}from"@aws-sdk/client-s3";function js(t={}){let e=t.env??process.env,r=t.tfstatePath!==void 0?[t.tfstatePath]:SP(t.selfUrl),n={},s;for(let x of r)if(fP(x)){n=TP(x),s=x;break}let o=(...x)=>{for(let N of x)if(typeof N=="string"&&N!=="")return N},i=o(e.LMCTL_NEXT_IDENTITY_POOL_ID,n.LMCTL_NEXT_IDENTITY_POOL_ID)??wP,a=o(e.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??EP,l=o(e.LMCTL_NEXT_MAILBOX_BUCKET,e.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??bP,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)??ka,d=[];i===void 0&&d.push("LMCTL_NEXT_IDENTITY_POOL_ID"),a===void 0&&d.push("LMCTL_NEXT_COGNITO_USER_POOL_ID"),l===void 0&&d.push("LMCTL_NEXT_MAILBOX_BUCKET");let f={missing:d,tfstateCandidatesChecked:r,...s!==void 0?{tfstatePathUsed:s}:{}};if(d.length>0)return f;let m=e.LMCTL_MAILBOX_POLL_MS,p=m!==void 0&&m.length>0?Number(m):void 0,h=Ta(e.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),g=Ta(e.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),_=Ta(e.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),S=Ta(e.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),E=o(e.LMCTL_MAILBOX_KEY),k=o(e.LMCTL_TOKEN_PATH);return f.config={identityPoolId:i,cognitoUserPoolId:a,cognitoClientId:u,region:c,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},...h!==void 0?{readIntervalMs:h}:{},...g!==void 0?{heartbeatIdleMs:g}:{},..._!==void 0?{backoffReadIntervalMs:_}:{},...S!==void 0?{chatLogPollIntervalMs:S}:{},...E!==void 0?{mailboxKey:E}:{},...k!==void 0?{tokenPath:k}:{}},f}function TP(t){try{let e=Sa(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 SP(t){let e=jd(mP(t??import.meta.url));return[Ea(e,"..","..","..","..","infra","terraform","terraform.tfstate"),Ea(e,"..","..","..","..","..","infra","terraform","terraform.tfstate"),Ea(e,"..","..","..","infra","terraform","terraform.tfstate"),Ea(e,"..","..","infra","terraform","terraform.tfstate")]}function Ta(t){if(t===void 0||t==="")return;let e=Number(t);if(!(!Number.isFinite(e)||e<=0))return e*1e3}function kP(t){let e=vP(t.intervalMs)??WE,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 vP(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}async function BE(t){let e=t.tokenPath??FE(UE(),".lmctl","cli-tokens.json"),r=LE(t.tokenPath);if(dE(r.cognito?.idToken)&&bd()!==null)try{await TE({region:t.region,clientId:t.cognitoClientId??ka,cliTokensPath:e}),r=LE(t.tokenPath),t.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(R){let W=R instanceof Error?R.message:String(R);t.log?.(`[mx-mailbox] device-auth refresh failed: ${W}`)}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 CE({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=AE({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new RE({region:t.region,credentials:a}),c={ListObjectsV2Command:gP,GetObjectCommand:_P,PutObjectCommand:yP},u=Ns(n),d=u??o,f=t.deviceId,m=Tn({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey}),p=t.cursorStore,h;if(p!==void 0){let R=p.loadMailboxCursor(d,m);if(R!==null)h=R.last_processed_seq??void 0,t.log?.(`[mx-mailbox] resumed seq cursor=${h??"(sentinel)"} for user_id=${d}`);else{let W=!1,z=0;for(;!W&&z<2;){z+=1;try{let v=Vi(m,"web"),I=0,O;do{let X=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:v,MaxKeys:1e3,...O!==void 0?{ContinuationToken:O}:{}}));for(let q of X.Contents??[]){let P=Yi(q.Key??"",m,"web");P!==void 0&&P>I&&(I=P)}O=X.IsTruncated===!0?X.NextContinuationToken:void 0}while(O!==void 0);h=I,t.log?.(`[mx-mailbox] cold start: seeded seq cursor=${I} for user_id=${d}`),W=!0}catch(v){let I=v instanceof Error?v.message:String(v);if(i&&z===1&&$P(v)){t.log?.(`[mx-mailbox] cached identityId rejected by cognito (${I}); clearing + refreshing`),NP(e),i=!1,o=await CE({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}),a=AE({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new RE({region:t.region,credentials:a}),m=Tn({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey});continue}t.log?.(`[mx-mailbox] cold start seq probe failed: ${I}`);break}}p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:h??null,last_processed_at:new Date().toISOString()})}}let g=null,_=t.terminalSessionManager,S=t.persistentSessionManager,E=t.promptTriggerStore,k=new pa,x=new Cr({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:R=>k.record(R),onMessage:async R=>{if(_!==void 0&&md(R.payload)){_.onInbound(R.payload);return}if(S!==void 0&&pd(R.payload)){await S.onInbound(R.payload);return}if(!_d(R.payload)){if(E!==void 0&&gd(R.payload)){xd({store:E,payload:R.payload,log:t.log});return}g!==null&&await g.handleIncoming(R.payload,R)}},...p!==void 0?{onCursorAdvance:R=>{p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:R,last_processed_at:new Date().toISOString()})}}:{},...h!==void 0?{cursor:h}:{},...t.pollIntervalMs!==void 0?{pollIntervalMs:t.pollIntervalMs}:{},...t.readIntervalMs!==void 0?{readIntervalMs:t.readIntervalMs}:{},...t.heartbeatIdleMs!==void 0?{heartbeatIdleMs:t.heartbeatIdleMs}:{},...t.backoffReadIntervalMs!==void 0?{backoffReadIntervalMs:t.backoffReadIntervalMs}:{}});g=new Is({client:x,...t.log!==void 0?{log:t.log}:{}}),_!==void 0&&_.setPublish(async R=>x.putMessage({conversation_id:`terminal:${R.session_id}`,payload:R})),S!==void 0&&S.setPublish(async R=>x.putMessage({conversation_id:`provider:${R.session_id}`,payload:R}));let N=R=>x.putMessage({conversation_id:hd,payload:R});x.start();let A=t.chatLogTailStore===void 0?void 0:kP({store:t.chatLogTailStore,publishDaemonEvent:N,cursorKey:m,intervalMs:t.chatLogPollIntervalMs??t.readIntervalMs??t.pollIntervalMs??WE,log:t.log});t.log?.(`[mx-mailbox] agent polling ${m} (bucket=${t.mailboxBucket})`);let U=t.deviceId??o,F=`${d}/usage/`,J;return J=t.usageStore===void 0?void 0:rE({meter:k,store:t.usageStore,userId:d,deviceId:U,ceilingUsd:t.usageQuotaUsd??1/0,onQuotaExceeded:({period:R,costUsd:W,ceilingUsd:z})=>{t.log?.(`[usage] month ${R} cost $${W.toFixed(4)} >= ceiling $${z} \u2014 blocking mailbox`),x.stop().catch(()=>{}),J?.stop()},publishOwnRollup:async(R,W)=>{await l.send(new c.PutObjectCommand({Bucket:t.mailboxBucket,Key:`${F}${U}-${R}.json`,Body:JSON.stringify({...W,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async R=>{let W={put:0,get:0,list:0},z;do{let v=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:F,MaxKeys:1e3,...z!==void 0?{ContinuationToken:z}:{}}));for(let I of v.Contents??[]){let O=I.Key??"";if(O.endsWith(`-${R}.json`))try{let X=await l.send(new c.GetObjectCommand({Bucket:t.mailboxBucket,Key:O}));if(X.Body===void 0)continue;let q=JSON.parse(await X.Body.transformToString("utf-8"));W.put+=q.put??0,W.get+=q.get??0,W.list+=q.list??0}catch{}}z=v.IsTruncated===!0?v.NextContinuationToken:void 0}while(z!==void 0);return W},intervalMs:t.usageFlushIntervalMs??36e5,...t.log!==void 0?{log:t.log}:{}}),{identityId:o,mailbox:x,fetchClient:g,publishDaemonEvent:N,async stop(){A?.stop(),J!==void 0&&(await J.flushNow().catch(()=>{}),J.stop()),await g.stop().catch(()=>{}),await x.stop().catch(()=>{})}}}async function qE(t){let e=t.s3!==void 0&&t.commands!==void 0?{s3:t.s3,commands:t.commands}:ma(t.rootDir),r=Tn({identityId:xs,userId:xs,deviceId:OE}),n=null,s=t.terminalSessionManager,o=t.persistentSessionManager,i=t.promptTriggerStore,a=new Cr({bucket:"local",identityId:xs,userId:xs,deviceId:OE,s3:e.s3,commands:e.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&md(c.payload)){s.onInbound(c.payload);return}if(o!==void 0&&pd(c.payload)){await o.onInbound(c.payload);return}if(!_d(c.payload)){if(i!==void 0&&gd(c.payload)){xd({store:i,payload:c.payload,log:t.log});return}n!==null&&await n.handleIncoming(c.payload,c)}},pollIntervalMs:t.pollIntervalMs??ba,readIntervalMs:t.readIntervalMs??ba,heartbeatIdleMs:t.heartbeatIdleMs??ba,backoffReadIntervalMs:t.backoffReadIntervalMs??ba});n=new Is({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:hd,payload:c});return a.start(),t.log?.(`[local-webui] agent polling ${r} (local-fs ${t.rootDir})`),{identityId:xs,mailbox:a,fetchClient:n,publishDaemonEvent:l,async stop(){await n.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function LE(t){let e=t??FE(UE(),".lmctl","cli-tokens.json");try{let r=Sa(e,"utf8");return JSON.parse(r)}catch{return{}}}function IP(t,e){if(e===void 0||e==="")return;let r={};try{let s=Sa(t,"utf8");r=JSON.parse(s)}catch{}if(r.cognito===void 0)return;let n={...r,cognito:{...r.cognito,identityId:e}};DE(jd(t),{recursive:!0,mode:448}),PE(t,JSON.stringify(n,null,2));try{ME(t,384)}catch{}}function NP(t){let e={};try{let n=Sa(t,"utf8");e=JSON.parse(n)}catch{return}if(e.cognito===void 0)return;let r={...e,cognito:{...e.cognito}};delete r.cognito.identityId,DE(jd(t),{recursive:!0,mode:448}),PE(t,JSON.stringify(r,null,2));try{ME(t,384)}catch{}}async function CE(t){t.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new pP({region:t.region}).send(new hP({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{IP(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 $P(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 WE,ba,ka,wP,EP,bP,xs,OE,Ad=b(()=>{"use strict";ea();ld();dd();nE();oE();iE();aE();lE();yd();zi();wd();Sd();jE();WE=3e3,ba=1e3,ka="79u5jhkk46qofog661c9i0bdcs",wP="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",EP="us-east-1_4iUdFggDn",bP="lmctl-next-preview-mailbox-254332045686";xs="local",OE="local"});import{spawn as Cd}from"node:child_process";import{createInterface as HE}from"node:readline";var Rd,Od,Ld,JE,XE=b(()=>{"use strict";po();Ne();Rd=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=Cd(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=HE({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+`
|
|
1772
|
+
allowed keys: ${vE.join(", ")}`);if(!m.provider&&!m.teamfile){i.push(`line ${f}: member line missing provider (or teamfile): ${d.trim()}`);continue}let h={alias:m.alias||`member${n.length+1}`,provider:m.provider||"",extra:{}};m.sessionid&&(h.session=m.sessionid),Object.prototype.hasOwnProperty.call(m,"sessiondir")&&(h.sessiondir=m.sessiondir),m.teamfile&&(h.teamfile=m.teamfile),m.model&&(h.model=m.model),m.effort&&(h.effort=m.effort),n.push(h)}return{name:e,members:n,deprecatedConnectLines:s,skillUrls:o,rawText:t,parseErrors:i,frontmatter:l}}function Nd(t,e){let r=[];for(let o of t.parseErrors){let i=o.includes("_CONNECT_")?"connect":o.includes("_SKILL_")?"skill":"session";r.push({field:i,message:o})}let n=t.members.filter(o=>o.alias.toLowerCase()===vd.toLowerCase());n.length>1&&r.push({field:vd,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?Nn(e,o.teamfile):Nn(o.teamfile);if(!IE(a))r.push({field:o.alias,message:`Teamfile not found: ${a}`});else{let l=Le(a),c=kt(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 ZD.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 kt(t){return t.members.find(e=>e.alias.toLowerCase()===vd.toLowerCase())}function $d(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=Nn(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),!IE(o))throw new Error(`Teamfile not found: ${o} (referenced by alias "${t.alias}")`);let a=Le(o),l=kt(a);if(!l)throw new Error(`Team at ${o} has no lead session`);if(l.teamfile)return $d(l,kd(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||kd(o),alias:t.alias,resolvedFrom:o,model:l.model,effort:l.effort}}function ya(t,e){return t.members.find(r=>r.alias===e)??t.members.find(r=>r.alias.toLowerCase()===e.toLowerCase())}var vd,ZD,vE,Ht=b(()=>{"use strict";kE();vd="Lead",ZD=new Set(["claude","codex","opencode","gemini","copilot","qwen","agy","ClaudeMock"]);vE=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});import{existsSync as sP,realpathSync as oP}from"node:fs";import{dirname as iP}from"node:path";function xd(t){aP(t).catch(e=>{t.log?.(`[mailbox] prompt trigger failed: ${e instanceof Error?e.message:String(e)}`)})}async function aP(t){let e=t.payload.root_teamfile;try{e=oP(t.payload.root_teamfile)}catch(o){let i=`prompt root missing/unreadable: ${t.payload.root_teamfile}: ${o instanceof Error?o.message:String(o)}`;return await $n(t.store,{rootTeamfile:t.payload.root_teamfile,receiverTeamfile:t.payload.root_teamfile,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:i,log:t.log}),t.log?.(`[mailbox] ${i}`),{status:"error",response:null,error_detail:i}}if(t.store.getRootTeam(e)===null){let o=`prompt root is not registered: ${e}`;return await $n(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:o,log:t.log}),t.log?.(`[mailbox] ${o}`),{status:"error",response:null,error_detail:o}}let r=lP(e);if("error"in r)return await $n(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:r.error,log:t.log}),t.log?.(`[mailbox] ${r.error}`),{status:"error",response:null,error_detail:r.error};let n={receiver_teamfile:e,receiver_alias:r.alias,sender_teamfile:`prompt:${t.payload.prompt_id}`,sender_alias:"operator",started_at:new Date().toISOString()},s=t.store.tryAcquireAgentInflight(n,{stale_before:new Date(Date.now()-dP(t.env??process.env)).toISOString()});if(!s.acquired){let o=uP(r.alias,s.current);return await $n(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:null,status:"error",error_detail:o,log:t.log}),t.log?.(`[mailbox] prompt rejected: ${o}`),{status:"error",response:null,error_detail:o}}try{let i=await(t.chat??Mt)({provider:r.provider,sessionId:r.sessionid,cwd:r.sessiondir,prompt:t.payload.text,env:t.env??process.env,alias:r.alias,permissionMode:"yolo",...t.timeoutMs!==void 0?{timeoutMs:t.timeoutMs}:{}}),a=i.status==="stalled",l=!a&&i.text.trim()==="",c=a?`provider stalled${i.stalledAfterMs!==void 0?` after ${i.stalledAfterMs}ms`:""}`:l?"provider returned empty response":null,u=a||l?"error":"ok";return await $n(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:u==="error"?null:i.text,status:u,error_detail:c,log:t.log}),{status:u,response:u==="error"?null:i.text,error_detail:c}}catch(o){let i=o instanceof Error?o.message:String(o);return await $n(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:null,status:"error",error_detail:i,log:t.log}),t.log?.(`[mailbox] prompt provider error: ${i}`),{status:"error",response:null,error_detail:i}}finally{try{t.store.releaseAgentInflight(n)}catch(o){t.log?.(`[mailbox] failed to release prompt in-flight slot: ${o instanceof Error?o.message:String(o)}`)}}}function lP(t){if(!sP(t))return{error:`prompt root missing/unreadable: ${t}`};let e=Le(t);if(e.parseErrors.length>0)return{error:`prompt root parse error: ${e.parseErrors.join("; ")}`};let r=kt(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??iP(t)}}async function $n(t,e){let r=xE(e.message),n=e.response===null?null:xE(e.response);try{t.insertTeamChatLog({root_teamfile:e.rootTeamfile,sender_teamfile:e.rootTeamfile,sender_alias:"operator",receiver_teamfile:e.receiverTeamfile,receiver_alias:e.receiverAlias,message:r.text,response:n?.text??null,status:e.status,error_detail:e.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()})}catch(s){e.log?.(`[mailbox] warning: failed to record prompt chat log: ${s instanceof Error?s.message:String(s)}`)}}function xE(t){return t.length<=NE?{text:t,truncated:!1}:{text:t.slice(0,NE),truncated:!0}}function cP(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function uP(t,e){return e.sender_teamfile.startsWith("prompt:")?`${t} is busy servicing another prompt since ${e.started_at}`:cP(t,e)}function dP(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return $E;let r=Number(e);return!Number.isFinite(r)||r<=0?$E:r}var NE,$E,jE=b(()=>{"use strict";yt();Ht();NE=256*1024,$E=30*60*1e3});import{chmodSync as ME,existsSync as fP,mkdirSync as DE,readFileSync as Sa,writeFileSync as PE}from"node:fs";import{dirname as jd,resolve as Ea,join as FE}from"node:path";import{fileURLToPath as mP}from"node:url";import{homedir as UE}from"node:os";import{CognitoIdentityClient as pP,GetIdCommand as hP}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as AE}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as _P,ListObjectsV2Command as gP,PutObjectCommand as wP,S3Client as RE}from"@aws-sdk/client-s3";function js(t={}){let e=t.env??process.env,r=t.tfstatePath!==void 0?[t.tfstatePath]:SP(t.selfUrl),n={},s;for(let x of r)if(fP(x)){n=TP(x),s=x;break}let o=(...x)=>{for(let N of x)if(typeof N=="string"&&N!=="")return N},i=o(e.LMCTL_NEXT_IDENTITY_POOL_ID,n.LMCTL_NEXT_IDENTITY_POOL_ID)??yP,a=o(e.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??EP,l=o(e.LMCTL_NEXT_MAILBOX_BUCKET,e.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??bP,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)??ka,d=[];i===void 0&&d.push("LMCTL_NEXT_IDENTITY_POOL_ID"),a===void 0&&d.push("LMCTL_NEXT_COGNITO_USER_POOL_ID"),l===void 0&&d.push("LMCTL_NEXT_MAILBOX_BUCKET");let f={missing:d,tfstateCandidatesChecked:r,...s!==void 0?{tfstatePathUsed:s}:{}};if(d.length>0)return f;let m=e.LMCTL_MAILBOX_POLL_MS,p=m!==void 0&&m.length>0?Number(m):void 0,h=Ta(e.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),g=Ta(e.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),_=Ta(e.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),S=Ta(e.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),E=o(e.LMCTL_MAILBOX_KEY),k=o(e.LMCTL_TOKEN_PATH);return f.config={identityPoolId:i,cognitoUserPoolId:a,cognitoClientId:u,region:c,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},...h!==void 0?{readIntervalMs:h}:{},...g!==void 0?{heartbeatIdleMs:g}:{},..._!==void 0?{backoffReadIntervalMs:_}:{},...S!==void 0?{chatLogPollIntervalMs:S}:{},...E!==void 0?{mailboxKey:E}:{},...k!==void 0?{tokenPath:k}:{}},f}function TP(t){try{let e=Sa(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 SP(t){let e=jd(mP(t??import.meta.url));return[Ea(e,"..","..","..","..","infra","terraform","terraform.tfstate"),Ea(e,"..","..","..","..","..","infra","terraform","terraform.tfstate"),Ea(e,"..","..","..","infra","terraform","terraform.tfstate"),Ea(e,"..","..","infra","terraform","terraform.tfstate")]}function Ta(t){if(t===void 0||t==="")return;let e=Number(t);if(!(!Number.isFinite(e)||e<=0))return e*1e3}function kP(t){let e=vP(t.intervalMs)??WE,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 vP(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}async function BE(t){let e=t.tokenPath??FE(UE(),".lmctl","cli-tokens.json"),r=LE(t.tokenPath);if(dE(r.cognito?.idToken)&&bd()!==null)try{await TE({region:t.region,clientId:t.cognitoClientId??ka,cliTokensPath:e}),r=LE(t.tokenPath),t.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(R){let W=R instanceof Error?R.message:String(R);t.log?.(`[mx-mailbox] device-auth refresh failed: ${W}`)}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 CE({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=AE({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new RE({region:t.region,credentials:a}),c={ListObjectsV2Command:gP,GetObjectCommand:_P,PutObjectCommand:wP},u=Ns(n),d=u??o,f=t.deviceId,m=Tn({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey}),p=t.cursorStore,h;if(p!==void 0){let R=p.loadMailboxCursor(d,m);if(R!==null)h=R.last_processed_seq??void 0,t.log?.(`[mx-mailbox] resumed seq cursor=${h??"(sentinel)"} for user_id=${d}`);else{let W=!1,z=0;for(;!W&&z<2;){z+=1;try{let v=Vi(m,"web"),I=0,O;do{let X=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:v,MaxKeys:1e3,...O!==void 0?{ContinuationToken:O}:{}}));for(let q of X.Contents??[]){let P=Yi(q.Key??"",m,"web");P!==void 0&&P>I&&(I=P)}O=X.IsTruncated===!0?X.NextContinuationToken:void 0}while(O!==void 0);h=I,t.log?.(`[mx-mailbox] cold start: seeded seq cursor=${I} for user_id=${d}`),W=!0}catch(v){let I=v instanceof Error?v.message:String(v);if(i&&z===1&&$P(v)){t.log?.(`[mx-mailbox] cached identityId rejected by cognito (${I}); clearing + refreshing`),NP(e),i=!1,o=await CE({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}),a=AE({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new RE({region:t.region,credentials:a}),m=Tn({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey});continue}t.log?.(`[mx-mailbox] cold start seq probe failed: ${I}`);break}}p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:h??null,last_processed_at:new Date().toISOString()})}}let g=null,_=t.terminalSessionManager,S=t.persistentSessionManager,E=t.promptTriggerStore,k=new pa,x=new Cr({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:R=>k.record(R),onMessage:async R=>{if(_!==void 0&&md(R.payload)){_.onInbound(R.payload);return}if(S!==void 0&&pd(R.payload)){await S.onInbound(R.payload);return}if(!_d(R.payload)){if(E!==void 0&&gd(R.payload)){xd({store:E,payload:R.payload,log:t.log});return}g!==null&&await g.handleIncoming(R.payload,R)}},...p!==void 0?{onCursorAdvance:R=>{p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:R,last_processed_at:new Date().toISOString()})}}:{},...h!==void 0?{cursor:h}:{},...t.pollIntervalMs!==void 0?{pollIntervalMs:t.pollIntervalMs}:{},...t.readIntervalMs!==void 0?{readIntervalMs:t.readIntervalMs}:{},...t.heartbeatIdleMs!==void 0?{heartbeatIdleMs:t.heartbeatIdleMs}:{},...t.backoffReadIntervalMs!==void 0?{backoffReadIntervalMs:t.backoffReadIntervalMs}:{}});g=new Is({client:x,...t.log!==void 0?{log:t.log}:{}}),_!==void 0&&_.setPublish(async R=>x.putMessage({conversation_id:`terminal:${R.session_id}`,payload:R})),S!==void 0&&S.setPublish(async R=>x.putMessage({conversation_id:`provider:${R.session_id}`,payload:R}));let N=R=>x.putMessage({conversation_id:hd,payload:R});x.start();let A=t.chatLogTailStore===void 0?void 0:kP({store:t.chatLogTailStore,publishDaemonEvent:N,cursorKey:m,intervalMs:t.chatLogPollIntervalMs??t.readIntervalMs??t.pollIntervalMs??WE,log:t.log});t.log?.(`[mx-mailbox] agent polling ${m} (bucket=${t.mailboxBucket})`);let U=t.deviceId??o,F=`${d}/usage/`,J;return J=t.usageStore===void 0?void 0:rE({meter:k,store:t.usageStore,userId:d,deviceId:U,ceilingUsd:t.usageQuotaUsd??1/0,onQuotaExceeded:({period:R,costUsd:W,ceilingUsd:z})=>{t.log?.(`[usage] month ${R} cost $${W.toFixed(4)} >= ceiling $${z} \u2014 blocking mailbox`),x.stop().catch(()=>{}),J?.stop()},publishOwnRollup:async(R,W)=>{await l.send(new c.PutObjectCommand({Bucket:t.mailboxBucket,Key:`${F}${U}-${R}.json`,Body:JSON.stringify({...W,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async R=>{let W={put:0,get:0,list:0},z;do{let v=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:F,MaxKeys:1e3,...z!==void 0?{ContinuationToken:z}:{}}));for(let I of v.Contents??[]){let O=I.Key??"";if(O.endsWith(`-${R}.json`))try{let X=await l.send(new c.GetObjectCommand({Bucket:t.mailboxBucket,Key:O}));if(X.Body===void 0)continue;let q=JSON.parse(await X.Body.transformToString("utf-8"));W.put+=q.put??0,W.get+=q.get??0,W.list+=q.list??0}catch{}}z=v.IsTruncated===!0?v.NextContinuationToken:void 0}while(z!==void 0);return W},intervalMs:t.usageFlushIntervalMs??36e5,...t.log!==void 0?{log:t.log}:{}}),{identityId:o,mailbox:x,fetchClient:g,publishDaemonEvent:N,async stop(){A?.stop(),J!==void 0&&(await J.flushNow().catch(()=>{}),J.stop()),await g.stop().catch(()=>{}),await x.stop().catch(()=>{})}}}async function qE(t){let e=t.s3!==void 0&&t.commands!==void 0?{s3:t.s3,commands:t.commands}:ma(t.rootDir),r=Tn({identityId:xs,userId:xs,deviceId:OE}),n=null,s=t.terminalSessionManager,o=t.persistentSessionManager,i=t.promptTriggerStore,a=new Cr({bucket:"local",identityId:xs,userId:xs,deviceId:OE,s3:e.s3,commands:e.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&md(c.payload)){s.onInbound(c.payload);return}if(o!==void 0&&pd(c.payload)){await o.onInbound(c.payload);return}if(!_d(c.payload)){if(i!==void 0&&gd(c.payload)){xd({store:i,payload:c.payload,log:t.log});return}n!==null&&await n.handleIncoming(c.payload,c)}},pollIntervalMs:t.pollIntervalMs??ba,readIntervalMs:t.readIntervalMs??ba,heartbeatIdleMs:t.heartbeatIdleMs??ba,backoffReadIntervalMs:t.backoffReadIntervalMs??ba});n=new Is({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:hd,payload:c});return a.start(),t.log?.(`[local-webui] agent polling ${r} (local-fs ${t.rootDir})`),{identityId:xs,mailbox:a,fetchClient:n,publishDaemonEvent:l,async stop(){await n.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function LE(t){let e=t??FE(UE(),".lmctl","cli-tokens.json");try{let r=Sa(e,"utf8");return JSON.parse(r)}catch{return{}}}function IP(t,e){if(e===void 0||e==="")return;let r={};try{let s=Sa(t,"utf8");r=JSON.parse(s)}catch{}if(r.cognito===void 0)return;let n={...r,cognito:{...r.cognito,identityId:e}};DE(jd(t),{recursive:!0,mode:448}),PE(t,JSON.stringify(n,null,2));try{ME(t,384)}catch{}}function NP(t){let e={};try{let n=Sa(t,"utf8");e=JSON.parse(n)}catch{return}if(e.cognito===void 0)return;let r={...e,cognito:{...e.cognito}};delete r.cognito.identityId,DE(jd(t),{recursive:!0,mode:448}),PE(t,JSON.stringify(r,null,2));try{ME(t,384)}catch{}}async function CE(t){t.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new pP({region:t.region}).send(new hP({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{IP(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 $P(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 WE,ba,ka,yP,EP,bP,xs,OE,Ad=b(()=>{"use strict";ea();ld();dd();nE();oE();iE();aE();lE();wd();zi();yd();Sd();jE();WE=3e3,ba=1e3,ka="79u5jhkk46qofog661c9i0bdcs",yP="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",EP="us-east-1_4iUdFggDn",bP="lmctl-next-preview-mailbox-254332045686";xs="local",OE="local"});import{spawn as Cd}from"node:child_process";import{createInterface as HE}from"node:readline";var Rd,Od,Ld,JE,XE=b(()=>{"use strict";po();Ne();Rd=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=Cd(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=HE({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+`
|
|
1773
1773
|
`)}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+`
|
|
1774
1774
|
`)}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}}}},Od=class{child;ctx;buffer="";sessionIdSeen;closed=!1;async start(e,r){this.ctx=r;let n=Cd(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(`
|
|
1775
1775
|
`);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+`
|
|
1776
1776
|
`)}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}})}},Ld=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{mo(n)}catch(a){Z({event:"opencode_config_install_failed",cwd:n,error_message:a instanceof Error?a.message:String(a)})}let s=Cd(e.command,e.args,{cwd:n,env:e.env??process.env,stdio:["pipe","pipe","pipe"]});this.child=s,this.rl=HE({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+`
|
|
1777
1777
|
`)}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+`
|
|
1778
1778
|
`)}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+`
|
|
1779
|
-
`)}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}})}}},JE=t=>{switch(t){case"codex":return new Rd;case"claude":case"qwen":return new Od;case"gemini":case"copilot":case"opencode":return new Ld;default:throw new Error(`no_persistent_adapter_for_provider: ${t}`)}}});import{randomUUID as xP}from"node:crypto";import{existsSync as
|
|
1779
|
+
`)}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}})}}},JE=t=>{switch(t){case"codex":return new Rd;case"claude":case"qwen":return new Od;case"gemini":case"copilot":case"opencode":return new Ld;default:throw new Error(`no_persistent_adapter_for_provider: ${t}`)}}});import{randomUUID as xP}from"node:crypto";import{existsSync as LY,mkdirSync as jP,readFileSync as AP,writeFileSync as RP}from"node:fs";import{homedir as OP}from"node:os";import{dirname as LP,join as CP}from"node:path";function va(){return process.env.LMCTL_DEVICE_FILE??CP(OP(),".lmctl","device.json")}function Mr(t=va()){let e=process.env.LMCTL_DEVICE_ID;if(e!==void 0&&e!=="")return{device_id:e,created_at:"env"};try{let r=JSON.parse(AP(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 Md(t=va()){let e=Mr(t);if(e!==null&&e.created_at!=="env")return e;let r={device_id:xP(),created_at:new Date().toISOString()};return jP(LP(t),{recursive:!0}),RP(t,`${JSON.stringify(r,null,2)}
|
|
1780
1780
|
`,{encoding:"utf8",mode:384}),r}var Dd=b(()=>{"use strict"});import*as GE from"node:child_process";function DP(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 Pd(t,e={}){let r=e.spawnSync===void 0&&process.env[PP]==="1",n=e.spawnSync??GE.spawnSync,s=new Set,o=[];for(let i of t){if(s.has(i))continue;s.add(i);let a=Ia[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=DP(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 KE(t){if(t.binary==="<unknown>")return`unknown provider "${t.provider}" \u2014 no binary mapping (allowed: ${Object.keys(Ia).join(", ")})`;let e=MP[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 Ia,MP,PP,VE=b(()=>{"use strict";Ia={claude:"claude",codex:"codex",copilot:"copilot",gemini:"gemini",opencode:"opencode",qwen:"qwen",agy:"agy"},MP={claude:"https://docs.claude.com/code",codex:"https://github.com/openai/codex",copilot:"https://docs.github.com/copilot/cli",gemini:"https://github.com/google-gemini/gemini-cli",opencode:"https://opencode.ai",qwen:"https://github.com/QwenLM/qwen-code",agy:"https://antigravity.google"};PP="LMCTL_SKIP_BINARY_CHECK"});var ob={};le(ob,{ProviderBinaryPreflightError:()=>Na,__setProviderBinaryCheckForTest:()=>GP,bootstrapAgentRestMailbox:()=>ZE,publishRegisteredWorkflowsOnStart:()=>zE,resolveLocalMailboxDir:()=>nb,resolveLocalWebuiDir:()=>rb,resolveServeConfig:()=>QE,runProviderBinaryPreflight:()=>tb,runServe:()=>qP,validateServeArgs:()=>sb});import{randomBytes as FP}from"node:crypto";import{existsSync as UP}from"node:fs";import{homedir as WP}from"node:os";import{isAbsolute as YE,resolve as Fd}from"node:path";async function qP(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(BP),0;let r=sb(t,process.env);if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
1781
1781
|
`),2;try{tb(e)}catch(E){return 1}let n=pe({path:ue()}),s={portCli:KP(t)},o;try{o=QE({dal:n,cli:s,env:process.env,parsed:r,io:e})}catch(E){return n.close(),e.stderr.write(`error: ${E instanceof Error?E.message:String(E)}
|
|
1782
|
-
`),2}process.env.LMCTL_API_URL=o.apiUrl,process.env.LMCTL_API_TOKEN=o.apiToken,process.env.LMCTL_API_PORT=String(o.port),
|
|
1783
|
-
`)}let a=r.noDaemon?void 0:
|
|
1782
|
+
`),2}process.env.LMCTL_API_URL=o.apiUrl,process.env.LMCTL_API_TOKEN=o.apiToken,process.env.LMCTL_API_PORT=String(o.port),Xy(n);let i;if(r.localWebui!==void 0){let E=rb(r.localWebui.dir,process.env);if(E===null)return e.stderr.write("error: --webui requires a local SPA build directory: pass `lmctl serve --webui <dir>` or set LMCTL_LOCAL_WEBUI_DIR to a directory containing index.html\n"),n.close(),2;let k=nb(process.env),{s3:x,commands:N}=ma(k);i={webuiDir:E,rootDir:k,s3:x,commands:N},e.stdout.write(`local webui: serving SPA from ${E}; mailbox store ${k}
|
|
1783
|
+
`)}let a=r.noDaemon?void 0:Hy({dal:n,intervalMs:vs()}),l=i!==void 0?{missing:[],tfstateCandidatesChecked:[]}:js({env:process.env});l.missing.length>0&&e.stderr.write(`[lmctl-next-agent] mailbox transport not configured: missing ${l.missing.join(", ")}; running without cloud sync`+(l.tfstatePathUsed===void 0?` (no terraform.tfstate found; checked ${l.tfstateCandidatesChecked.length} candidate path${l.tfstateCandidatesChecked.length===1?"":"s"})`:` (terraform.tfstate at ${l.tfstatePathUsed} did not supply the missing fields)`)+`
|
|
1784
1784
|
`);let c=await XP({log:E=>e.stderr.write(`${E}
|
|
1785
1785
|
`)}),u=new oa({adapterFactory:JE,publish:async()=>{throw new Error("persistent_publish_not_wired: mailbox runtime has not bound the publish hook yet")},log:E=>e.stderr.write(`${E}
|
|
1786
|
-
`)}),d=Mr()?.device_id,f=
|
|
1786
|
+
`)}),d=Mr()?.device_id,f=Cy({dal:n,daemon:a,...l.config!==void 0?{webuiRuntimeConfig:HP(l.config,d)}:{},...c!==void 0?{terminalSessionManager:c}:{},persistentSessionManager:u,...i!==void 0?{localWebui:{webuiDir:i.webuiDir,localMailbox:{s3:i.s3,commands:i.commands}}}:{}}),m=process.env.LMCTL_USAGE_QUOTA_USD,p=m!==void 0&&m!==""?Number(m):NaN,h=Number.isFinite(p)&&p>0?p:void 0,g=await ZE({dal:n,app:f,io:e,mailbox:l.config===void 0?void 0:{...l.config,cursorStore:n,chatLogTailStore:n,promptTriggerStore:n,usageStore:n,...h!==void 0?{usageQuotaUsd:h}:{},...d!==void 0?{deviceId:d}:{}},...i!==void 0?{localMailbox:{rootDir:i.rootDir,s3:i.s3,commands:i.commands,promptTriggerStore:n}}:{},...c!==void 0?{terminalSessionManager:c}:{},persistentSessionManager:u});await zE({dal:n,mailbox:g.mailbox,io:e});let{serve:_}=await import("@hono/node-server"),S=_({fetch:f.fetch,port:o.port,hostname:r.bind});return e.stdout.write(`listening on ${r.bind}:${o.port}
|
|
1787
1787
|
`),await new Promise(E=>{let k=()=>{(async()=>(a!==void 0&&await a.stop(),S.close(),await g.stop(),c!==void 0&&await c.stop(),await u.stop(),n.close(),E()))()};process.once("SIGTERM",k),process.once("SIGINT",k)}),0}function HP(t,e){return{identityPoolId:t.identityPoolId,cognitoUserPoolId:t.cognitoUserPoolId,cognitoRegion:t.region,mailboxBucket:t.mailboxBucket,workspaceFetchMode:"mailbox",...e!==void 0?{deviceId:e}:{},...t.mailboxKey!==void 0?{mailboxKey:t.mailboxKey}:{},mailboxPolling:{...t.readIntervalMs!==void 0?{readIntervalSeconds:t.readIntervalMs/1e3}:{},...t.heartbeatIdleMs!==void 0?{heartbeatIdleSeconds:t.heartbeatIdleMs/1e3}:{},...t.backoffReadIntervalMs!==void 0?{backoffReadIntervalSeconds:t.backoffReadIntervalMs/1e3}:{}}}}async function zE(t){if(t.mailbox===void 0)return;let e={kind:"daemon_event",event:"workflows",ts:Date.now(),workflows:t.dal.listRootTeams().map(r=>({teamfile_path:r.teamfile_path,name:r.name,registered_at:r.registered_at,last_seeded_at:r.last_seeded_at}))};try{await t.mailbox.publishDaemonEvent(e)}catch(r){t.io?.stderr.write(`[mailbox] daemon_event workflows push failed: ${r instanceof Error?r.message:String(r)}
|
|
1788
1788
|
`)}}async function ZE(t){let e;if(t.mailbox!==void 0||t.localMailbox!==void 0)try{e=t.localMailbox!==void 0?await qE({...t.localMailbox,log:r=>t.io?.stderr.write(`${r}
|
|
1789
1789
|
`),...t.terminalSessionManager!==void 0?{terminalSessionManager:t.terminalSessionManager}:{},...t.persistentSessionManager!==void 0?{persistentSessionManager:t.persistentSessionManager}:{}}):await BE({...t.mailbox,log:r=>t.io?.stderr.write(`${r}
|
|
@@ -1794,7 +1794,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
|
|
|
1794
1794
|
`);return{port:a,apiUrl:d,apiToken:c}}function JP(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 XP(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 sa({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 GP(t){eb=t??Pd}function tb(t){let e=Object.keys(Ia),r=eb(e),n=r.filter(o=>!o.found);if(n.length>0){for(let o of n)t.stderr.write(`error: ${KE(o)}
|
|
1795
1795
|
`);throw t.stderr.write(`error: agent refusing to start; ensure missing provider CLIs are on PATH
|
|
1796
1796
|
`),new Na(n)}let s=r.map(o=>o.provider).join(", ");t.stdout.write(`providers ready: ${s}
|
|
1797
|
-
`)}function rb(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=YE(r)?r:Fd(process.cwd(),r);return UP(`${n}/index.html`)?n:null}function nb(t){let e=t.LMCTL_LOCAL_MAILBOX_DIR;return e!==void 0&&e!==""?YE(e)?e:Fd(process.cwd(),e):Fd(WP(),".lmctl","local-mailbox")}function KP(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 sb(t,e=process.env){let r=VP(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 VP(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 BP,Na,eb,ib=b(()=>{"use strict";Ue();
|
|
1797
|
+
`)}function rb(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=YE(r)?r:Fd(process.cwd(),r);return UP(`${n}/index.html`)?n:null}function nb(t){let e=t.LMCTL_LOCAL_MAILBOX_DIR;return e!==void 0&&e!==""?YE(e)?e:Fd(process.cwd(),e):Fd(WP(),".lmctl","local-mailbox")}function KP(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 sb(t,e=process.env){let r=VP(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 VP(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 BP,Na,eb,ib=b(()=>{"use strict";Ue();Py();sd();Gy();cu();Ad();ld();Ku();Vu();XE();Dd();VE();Ye();BP=`usage: lmctl serve [--port N] [--bind HOST] [--no-daemon] [--insecure-no-auth] [--webui [DIR]]
|
|
1798
1798
|
|
|
1799
1799
|
Start the local HTTP API, web UI, queue daemon, terminal manager, and agent
|
|
1800
1800
|
services. Help exits before any port binding or daemon startup.
|
|
@@ -1805,25 +1805,25 @@ services. Help exits before any port binding or daemon startup.
|
|
|
1805
1805
|
local identity. Mailbox store defaults to
|
|
1806
1806
|
~/.lmctl/local-mailbox/ ($LMCTL_LOCAL_MAILBOX_DIR overrides).
|
|
1807
1807
|
`;Na=class extends Error{missing;constructor(e){let r=e.map(n=>n.provider).join(", ");super(`provider binary pre-flight failed: ${r}`),this.name="ProviderBinaryPreflightError",this.missing=e}},eb=Pd});var ab={};le(ab,{runIntake:()=>zP});async function zP(t,e){let[r,...n]=t;return r==="--help"||r==="-h"||r==="help"?(e.stdout.write(YP),0):r==="scan"?ZP(n,e):r==="config"?QP(n,e):(e.stderr.write(`usage: lmctl intake <scan|config> ...
|
|
1808
|
-
`),1)}async function ZP(t,e){let r=D(t,["--project"],["--json"]);if(r.error!==void 0)return
|
|
1808
|
+
`),1)}async function ZP(t,e){let r=D(t,["--project"],["--json"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,`unknown argument: ${r.positionals[0]}`);let n=$(r,"--project");return L(e,async s=>{if(n!==void 0){let o=s.findProjectByName(n);if(o===null)return w(e,`project not found: ${n}`);let i=await au({dal:s,project:o});return B(e,{project_id:o.id,project_name:o.name,...i}),0}return B(e,await _n(s)),0})}async function QP(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return w(e,"usage: lmctl intake config <project-name> --scan-github-issues true|false [--labels csv] [--state open|closed|all]");let s=D(n,["--scan-github-issues","--labels","--state"],["--json"]);if(s.error!==void 0)return w(e,s.error);let o=$(s,"--scan-github-issues");if(o!=="true"&&o!=="false")return w(e,"missing or invalid --scan-github-issues true|false");let i=$(s,"--state");if(i!==void 0&&i!=="open"&&i!=="closed"&&i!=="all")return w(e,"invalid --state: expected open, closed, or all");let a=$(s,"--labels"),l={scan_github_issues:o==="true",labels:a===void 0?void 0:a.split(",").map(c=>c.trim()).filter(Boolean),state:i};return L(e,c=>{let u=c.findProjectByName(r);if(u===null)return w(e,`project not found: ${r}`);let d=c.setProjectIntakeConfig(u.id,JSON.stringify(l));return B(e,d),0})}var YP,lb=b(()=>{"use strict";Ni();Se();YP=`usage: lmctl intake <scan|config> ...
|
|
1809
1809
|
|
|
1810
1810
|
Scan configured project GitHub issues into lmctl, or update per-project
|
|
1811
1811
|
intake settings such as enabled state, labels, and issue state filters.
|
|
1812
|
-
`});import{createHash as e1}from"node:crypto";import{existsSync as As,mkdirSync as t1,readFileSync as db,realpathSync as r1,writeFileSync as n1}from"node:fs";import{basename as cb,dirname as fb,resolve as mb}from"node:path";function Ae(t,e){let r=mb(t);if(As(r))return r1(r);if(e!==void 0){let n=i1(t,r,e);if(n!==null)return n}return r}function ub(t,e){let r=fb(e),n=Id(t,
|
|
1812
|
+
`});import{createHash as e1}from"node:crypto";import{existsSync as As,mkdirSync as t1,readFileSync as db,realpathSync as r1,writeFileSync as n1}from"node:fs";import{basename as cb,dirname as fb,resolve as mb}from"node:path";function Ae(t,e){let r=mb(t);if(As(r))return r1(r);if(e!==void 0){let n=i1(t,r,e);if(n!==null)return n}return r}function ub(t,e){let r=fb(e),n=Id(t,wa(e),{baseDir:r});for(let s of n.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=mb(r,s.sessiondir));return n}function Dr(t,e){let r=Ae(t,o1(e)?e:void 0);if(e!==void 0){let n=e.getRootTeam(r);if(n!==null)return!As(r)&&"upsertRootTeam"in e&&(t1(fb(r),{recursive:!0}),n1(r,n.raw_text,"utf8")),ub(n.raw_text,r);if(As(r)){let s=db(r,"utf8"),o=ub(s,r);return"upsertRootTeam"in e&&a1(o)&&l1(e,r,o,s),o}throw new Error(`teamfile not found: ${t}`)}if(!As(r))throw new Error(`teamfile not found: ${t}`);return Le(r)}function pb(t,e,r){let n=Ae(t,e),s=e.getRootTeam(n);s===null||!As(n)||db(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 o1(t){return typeof t=="object"&&t!==null&&"getRootTeam"in t&&"listRootTeams"in t}function i1(t,e,r){let n=r.getRootTeam(t)??r.getRootTeam(e);if(n!==null)return n.teamfile_path;let s=cb(t),o=wa(t),i=r.listRootTeams().filter(l=>cb(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 a1(t){return t.parseErrors.length>0?!1:t.members.every(e=>e.teamfile!==void 0?!0:e.session!==void 0&&e.session.length>=s1)}function l1(t,e,r,n){let s=new Date().toISOString(),o={teamfile_path:e,name:r.name,raw_text:n,raw_sha256:e1("sha256").update(n).digest("hex"),registered_at:s,last_seeded_at:s};t.upsertRootTeam(o)}var s1,fr=b(()=>{"use strict";Ht();s1=5});import{existsSync as c1}from"node:fs";import{dirname as hb}from"node:path";function f1(t){return u1.test(t)||d1.test(t)}function _b(t){return $a.test(t)}function Rs(t){if(!t.includes(":"))return null;let e=t.lastIndexOf(":"),r=t.slice(0,e),n=t.slice(e+1);return!r.endsWith(".lmctl")||!$a.test(n)?null:{teamfile:r,alias:n}}function vt(t,e,r){if(!t.endsWith(".lmctl"))throw new ge(`lmctl: "${t}" doesn't look like a teamfile (expected .lmctl extension).`);if(!_b(e))throw new ge(`lmctl: "${e}" is not a valid alias (must match ${$a.source}).`);let n=Ae(t,r);if(r===void 0&&!c1(n))throw new ge(`lmctl: teamfile not found: ${t}`);let s;try{s=Dr(n,r)}catch(i){throw new ge(`lmctl: ${t}: ${i instanceof Error?i.message:String(i)}`)}if(s.parseErrors.length>0)throw new ge(`lmctl: ${t}: ${s.parseErrors.join("; ")}`);let o=ya(s,e);if(o===void 0){let i=s.members.map(a=>a.alias).join(", ")||"(none)";throw new ge(`lmctl: alias "${e}" not found in ${t}.
|
|
1813
1813
|
Known aliases: ${i}`)}if(o.teamfile!==void 0){let i=$d(o,hb(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 ge(`lmctl: alias "${o.alias}" in ${t} has no session ID yet.
|
|
1814
1814
|
Run: lmctl seed ${t}`);return{teamfile:n,alias:o.alias,provider:o.provider,sessionid:o.session,sessiondir:o.sessiondir??hb(n),isLead:kt(s)?.alias===o.alias,...o.model!==void 0?{model:o.model}:{},...o.effort!==void 0?{effort:o.effort}:{}}}function mr(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=Rs(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?_b(n)?{mode:"ai-team",teamfile:r,alias:n}:{mode:"error",message:`lmctl ${t.name}: "${n}" is not a valid alias (must match ${$a.source}).`}:t.allowsBareTeamfile?{mode:"ai-team",teamfile:r}:{mode:"error",message:`lmctl ${t.name}: alias required.
|
|
1815
1815
|
Use: lmctl ${t.name} ${r}:<alias> or lmctl ${t.name} ${r} <alias>`};if(f1(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.
|
|
1816
1816
|
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}".
|
|
1817
1817
|
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.
|
|
1818
|
-
Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var ge,u1,d1,$a,Pr=b(()=>{"use strict";Ht();fr();ge=class extends Error{constructor(e){super(e),this.name="ChatTargetError"}},u1=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,d1=/^ses_[A-Za-z0-9_-]+$/,$a=/^[A-Za-z][A-Za-z0-9_-]*$/});function
|
|
1819
|
-
`}),ai(r,o.isLead,o.alias,o.provider,o.sessiondir);try{li(r,Le(i),i)}catch{}if(n={root_teamfile:l,sender_teamfile:a.teamfile,sender_alias:a.alias,receiver_teamfile:i,receiver_alias:o.alias,policy:c},t.fromFlag!==void 0&&a.teamfile!==i){let k=await L(r,x=>Sb(x,{root:l,sender:a,receiverTeamfile:i,receiverAlias:o.alias,now:new Date}));if(k.stop){let x=vb(k.chain),N=await Aa(r,{...n,message:t.prompt,response:null,status:"error",error_detail:x});return{status:"error",errorKind:"cycle",message:x,teamChatLogId:N}}}let u=await k1(r,{receiver_teamfile:i,receiver_alias:o.alias,sender_teamfile:a.teamfile,sender_alias:a.alias,force:t.force===!0});if(!u.acquired){let k=$1(o.alias,u.current),x=await Aa(r,{...n,message:t.prompt,response:null,status:"error",error_detail:k});return{status:"busy",message:k,teamChatLogId:x}}s=u.lease;let d=!1,f=
|
|
1818
|
+
Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var ge,u1,d1,$a,Pr=b(()=>{"use strict";Ht();fr();ge=class extends Error{constructor(e){super(e),this.name="ChatTargetError"}},u1=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,d1=/^ses_[A-Za-z0-9_-]+$/,$a=/^[A-Za-z][A-Za-z0-9_-]*$/});function yb(t){let e=gb(t.registry,t.fromTeamfile);if(e===void 0)return xn(`sender team is not registered in policy graph: ${t.fromTeamfile}`);if(!wb(e,t.fromAlias))return xn(`sender alias "${t.fromAlias}" not found in ${t.fromTeamfile}`);let r=gb(t.registry,t.toTeamfile);return r===void 0?xn(`target team is not registered in policy graph: ${t.toTeamfile}`):wb(r,t.toAlias)?t.toTeamfile===t.fromTeamfile?{allowed:!0,outOfPolicy:!1,reason:"same team"}:e.leadAlias===null?xn(`sender team has no Lead: ${t.fromTeamfile}`):t.fromAlias!==e.leadAlias?xn(`cross-team sends may only originate from Lead; got "${t.fromAlias}" in ${t.fromTeamfile}`):{allowed:!0,outOfPolicy:!1,reason:"cross-team send from Lead"}:xn(`target alias "${t.toAlias}" not found in ${t.toTeamfile}`)}function gb(t,e){return t.teams.find(r=>r.teamfile===e)}function wb(t,e){return t.aliases.some(r=>r===e)}function xn(t){return{allowed:!1,outOfPolicy:!0,reason:t}}var Eb=b(()=>{"use strict"});import{basename as m1}from"node:path";function Sb(t,e){let r=new Date(e.now.getTime()-xa()).toISOString(),n=Ib(t,r).filter(f=>!f.sender.teamfile.startsWith("prompt:")),s=_1(e.sender,n),o=g1(e.sender,n);o!==null&&o.teamfile===e.root&&!Tb(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=>Tb(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<p1;return{stop:l.length>=1&&u,chain:w1(a)}}function kb(t,e){let r=new Date(e.now.getTime()-xa()).toISOString(),n=Ib(t,r),s=Nb(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 xa(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return bb;let r=Number(e);return!Number.isFinite(r)||r<=0?bb:r}function vb(t){return`cross-team cycle detected (${t}); stopping to prevent a runaway loop.`}function h1(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 Ib(t,e){return t.clearAgentInflightOlderThan(e),t.listAgentInflight().map(h1).filter(r=>Number.isFinite(r.at)&&new Date(r.at).toISOString()>=e).sort((r,n)=>r.at-n.at)}function _1(t,e,r={}){let n=new Map;for(let a of e)n.set(Fr(a.receiver),a);let s=[{...t,at:null}],o=t,i=new Set([Fr(t)]);for(let a=0;a<64;a+=1){let l=n.get(Fr(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=Fr(l.sender);if(i.has(u))break;s.unshift(c),i.add(u),o=l.sender}return s}function Nb(t,e){let r=Fr(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=Fr(l.sender),u=Fr(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 g1(t,e){let r=Nb(t,e);if(r.length===0)return null;let n=r[0];return n.sender.teamfile.startsWith("prompt:")?n.receiver:n.sender}function Tb(t,e){return t.teamfile===e.teamfile&&t.alias===e.alias}function Fr(t){return`${t.teamfile}\0${t.alias}`}function w1(t){return t.map(e=>`${m1(e.teamfile)}:${e.alias}`).join(" \u2192 ")}var p1,bb,$b=b(()=>{"use strict";p1=6e4,bb=8*60*60*1e3});async function Ab(t){let e=Rb(t.io,()=>{}),r=await L(e,i=>vt(t.teamfile,t.alias,i)),n=r.teamfile,s=t.fromFlag!==void 0?await L(e,i=>Ob(t.fromFlag,n,i)):await E1(e,t.selfSessionId,n),o=await Lb(e,{explicitRoot:t.rootFlag,sender:s,receiverTeamfile:n,operatorOrigin:s.alias==="operator"});return{teamfile:n,alias:r.alias,fromIdentity:`${s.teamfile}:${s.alias}`,rootTeamfile:o}}async function Ra(t){let e=t.onEvent??(()=>{}),r=Rb(t.io,e),n=null,s=null;try{let o=await L(r,k=>vt(t.teamfile,t.alias,k)),i=o.teamfile,a=await L(r,k=>Ob(t.fromFlag,i,k)),l=await Lb(r,{explicitRoot:t.rootFlag,sender:a,receiverTeamfile:i,operatorOrigin:t.fromFlag===void 0}),c=t.fromFlag===void 0?null:await b1(r,{rootTeamfile:l,sender:a,receiverTeamfile:i,receiverAlias:o.alias});c!==null&&!c.allowed&&e({kind:"warning",message:`warning: out-of-policy chat send: ${c.reason}
|
|
1819
|
+
`}),ai(r,o.isLead,o.alias,o.provider,o.sessiondir);try{li(r,Le(i),i)}catch{}if(n={root_teamfile:l,sender_teamfile:a.teamfile,sender_alias:a.alias,receiver_teamfile:i,receiver_alias:o.alias,policy:c},t.fromFlag!==void 0&&a.teamfile!==i){let k=await L(r,x=>Sb(x,{root:l,sender:a,receiverTeamfile:i,receiverAlias:o.alias,now:new Date}));if(k.stop){let x=vb(k.chain),N=await Aa(r,{...n,message:t.prompt,response:null,status:"error",error_detail:x});return{status:"error",errorKind:"cycle",message:x,teamChatLogId:N}}}let u=await k1(r,{receiver_teamfile:i,receiver_alias:o.alias,sender_teamfile:a.teamfile,sender_alias:a.alias,force:t.force===!0});if(!u.acquired){let k=$1(o.alias,u.current),x=await Aa(r,{...n,message:t.prompt,response:null,status:"error",error_detail:k});return{status:"busy",message:k,teamChatLogId:x}}s=u.lease;let d=!1,f=we(),m=0,p=0,h=0,g={provider:o.provider,sessionId:o.sessionid,cwd:o.sessiondir,prompt:t.prompt,permissionMode:t.permissionMode,env:t.env??process.env,onDelta:k=>{d=!0,f&&(m+=1,h=Buffer.byteLength(k,"utf8"),p+=h),e({kind:"delta",chunk:k})},onProgress:k=>e({kind:"progress",alias:o.alias,event:k})};o.model!==void 0&&(g.model=o.model),o.effort!==void 0&&(g.effort=o.effort),g.alias=o.alias,g.isLead=o.isLead,t.idleTimeoutMs!==void 0&&(g.timeoutMs=t.idleTimeoutMs);let _=await Mt(g);f&&Je(JSON.stringify({event:"chat_return",alias:o.alias,provider:o.provider,streamed:d,blockCount:m,streamedBytes:p,resultTextBytes:Buffer.byteLength(_.text,"utf8"),lastChunkBytes:h,tailPreview:y1(_.text,200)}));let S=_.status==="stalled",E=await Aa(r,{...n,message:t.prompt,response:S?null:_.text,status:n.policy?.outOfPolicy===!0?"out_of_policy":S?"error":"ok",error_detail:n.policy?.outOfPolicy===!0?n.policy.reason:S?`provider stalled${_.stalledAfterMs!==void 0?` after ${_.stalledAfterMs}ms`:""}`:null});return{status:S?"stalled":"ok",replyText:_.text,wroteDelta:d,teamChatLogId:E,durationMs:_.durationMs}}catch(o){let i=o instanceof Error?o.message:String(o),a=n===null?null:await Aa(r,{...n,message:t.prompt,response:null,status:n.policy?.outOfPolicy===!0?"out_of_policy":"error",error_detail:n.policy?.outOfPolicy===!0?`${n.policy.reason}; provider error: ${i}`:i});return{status:"error",errorKind:o instanceof ge?"target":"provider",message:i,teamChatLogId:a}}finally{s!==null&&await N1(r,s)}}function Rb(t,e){return{...t,stdout:{write:()=>{}},stderr:{write:r=>{e({kind:"warning",message:r})}}}}function y1(t,e){return t.slice(-e)}function Ob(t,e,r){if(t===void 0)return{teamfile:e,alias:"operator"};let n=Rs(t);if(n===null)throw new ge("--from must be <teamfile.lmctl>:<alias>");let s=Ae(n.teamfile,r),o=Dr(s,r);if(o.parseErrors.length>0)throw new ge(`--from ${n.teamfile}: ${o.parseErrors.join("; ")}`);let i=ya(o,n.alias);if(i===void 0)throw new ge(`--from alias "${n.alias}" not found in ${n.teamfile}`);return{teamfile:s,alias:i.alias}}async function E1(t,e,r){if(e===void 0||e.length===0)return{teamfile:r,alias:"operator"};let n=await L(t,o=>{let i=[];for(let a of o.listRootTeams()){let l=Dr(a.teamfile_path,o);for(let c of l.members)c.teamfile===void 0&&c.session===e&&i.push({teamfile:a.teamfile_path,alias:c.alias})}if(i.length===0){let a=Dr(r,o);for(let l of a.members)l.teamfile===void 0&&l.session===e&&i.push({teamfile:r,alias:l.alias})}return i});if(n.length===0)return{teamfile:r,alias:"operator"};let s=new Map(n.map(o=>[`${o.teamfile}:${o.alias}`,o]));if(s.size>1)throw new ge("LMCTL_SELF_SESSIONID matches multiple team members; pass --from explicitly");return[...s.values()][0]}async function Lb(t,e){return e.explicitRoot!==void 0?await L(t,r=>Ae(e.explicitRoot,r)):e.operatorOrigin?e.receiverTeamfile:await L(t,r=>kb(r,{sender:e.sender,now:new Date})??e.receiverTeamfile)}async function b1(t,e){return await L(t,r=>yb({rootTeamfile:e.rootTeamfile,fromTeamfile:e.sender.teamfile,fromAlias:e.sender.alias,toTeamfile:e.receiverTeamfile,toAlias:e.receiverAlias,registry:T1(r,e.sender.teamfile,e.receiverTeamfile)}))}function T1(t,e,r){return{teams:[e,r].map(s=>S1(s,t))}}function S1(t,e){let r=Dr(t,e),n=kt(r);return{teamfile:t,aliases:r.members.map(s=>s.alias),leadAlias:n?.alias??null}}async function k1(t,e){let r=new Date().toISOString(),n=new Date(Date.now()-xa()).toISOString(),s={receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,started_at:r};return await L(t,o=>{let i=we(),a=i?o.getAgentInflight(e.receiver_teamfile,e.receiver_alias):null,l=o.tryAcquireAgentInflight(s,{stale_before:n,force:e.force});if(l.acquired){if(i){let c=a===null?null:e.force?"force":a.started_at<n?"stale":null;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:c===null?"acquired":"reclaimed",...c===null?{}:{reclaim_reason:c,holder:ja(a)}}))}return{acquired:!0,lease:l.current??s}}if(!l.acquired&&v1(l.current,n)){let c=o.tryAcquireAgentInflight(s,{stale_before:n,reclaim_observed:{sender_teamfile:l.current.sender_teamfile,sender_alias:l.current.sender_alias,started_at:l.current.started_at,holder_pid:l.current.holder_pid}});return c.acquired?(i&&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:"reclaimed",reclaim_reason:l.current.holder_pid===null?"null-holder":"dead-pid",holder:ja(l.current)})),{acquired:!0,lease:c.current??s}):(i&&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:ja(c.current)})),{acquired:!1,current:c.current})}return i&&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:ja(l.current)})),{acquired:!1,current:l.current}})}function ja(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}}function v1(t,e){return t.holder_pid===null?t.started_at<e:!I1(t.holder_pid)}function I1(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"}}async function N1(t,e){try{await L(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)}
|
|
1820
1820
|
`)}}function $1(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}async function Aa(t,e){let r=jb(e.message),n=e.response===null?null:jb(e.response);try{return await L(t,s=>s.insertTeamChatLog({root_teamfile:e.root_teamfile,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,message:r.text,response:n?.text??null,status:e.status,error_detail:e.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()}))}catch(s){return t.stderr.write(`warning: failed to record chat log: ${s instanceof Error?s.message:String(s)}
|
|
1821
|
-
`),null}}function jb(t){return t.length<=xb?{text:t,truncated:!1}:{text:t.slice(0,xb),truncated:!0}}var xb,Ud=b(()=>{"use strict";
|
|
1821
|
+
`),null}}function jb(t){return t.length<=xb?{text:t,truncated:!1}:{text:t.slice(0,xb),truncated:!0}}var xb,Ud=b(()=>{"use strict";yt();Pr();Ht();as();Eb();fr();$b();Ne();Se();xb=256*1024});var Fb={};le(Fb,{parseIdleTimeoutMs:()=>Mb,runChat:()=>A1});import{spawn as x1}from"node:child_process";async function A1(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.length===0||t[0]==="--help"||t[0]==="-h")return e.stdout.write(`${Cb}
|
|
1822
1822
|
`),t.length===0?2:0;let r=R1(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
1823
1823
|
${Cb}
|
|
1824
1824
|
`),2;if(r.runFlag!==void 0){let u=Number.parseInt(r.runFlag,10);return!Number.isFinite(u)||u<=0||String(u)!==r.runFlag?(e.stderr.write(`error: invalid --run "${r.runFlag}" (expected a positive integer run id)
|
|
1825
1825
|
`),2):await L(e,async d=>{let f=d.getRun(u);if(f===null)return e.stderr.write(`error: run ${u}: not found
|
|
1826
|
-
`),1;if(f.terminal_state!==null&&f.terminal_state.length>0)return
|
|
1826
|
+
`),1;if(f.terminal_state!==null&&f.terminal_state.length>0)return w(e,`run ${u}: already terminal (${f.terminal_state}); chat --run cannot resume a terminated run`);let m=ia(d,u);if(m===null)return e.stderr.write(`error: run ${u}: no pending operator-answerable attention (chat --run only resumes paused runs)
|
|
1827
1827
|
`),1;if(m.kind==="workflow_escalation"){if(r.done)return e.stderr.write(`error: --done is not valid for workflow_escalation (the decision itself is terminal)
|
|
1828
1828
|
`),2;let p=d.resumeEscalation(m.attention_id,r.prompt);return p.resumed===!0?(e.stdout.write(`run ${u}: escalation resumed (decision: ${r.prompt})
|
|
1829
1829
|
`),0):(e.stderr.write(`error: run ${u}: resumeEscalation failed (${p.reason})
|
|
@@ -1847,7 +1847,7 @@ ${Cb}
|
|
|
1847
1847
|
`)?"":`
|
|
1848
1848
|
`}`),u.status==="stalled"?1:0)}else{if(r.force===!0)return e.stderr.write(`error: --force is only valid for AI-team chat
|
|
1849
1849
|
`),2;if(n.provider===void 0)return e.stderr.write(`error: chat raw mode (bare sessionid / --session) requires --provider <name>
|
|
1850
|
-
`),2;s={provider:n.provider,sessionId:n.sessionid,cwd:process.cwd()}}let o=!1,i=
|
|
1850
|
+
`),2;s={provider:n.provider,sessionId:n.sessionid,cwd:process.cwd()}}let o=!1,i=we(),a=0,l=0,c=0;try{let u={provider:s.provider,sessionId:s.sessionId,cwd:s.cwd,prompt:r.prompt,permissionMode:r.permissionMode,env:process.env,onDelta:m=>{o=!0,i&&(a+=1,c=Buffer.byteLength(m,"utf8"),l+=c),e.stdout.write(m)},onProgress:m=>Db(e,s.alias??"(raw)",m)};s.model!==void 0&&(u.model=s.model),s.effort!==void 0&&(u.effort=s.effort),s.alias!==void 0&&(u.alias=s.alias),s.isLead!==void 0&&(u.isLead=s.isLead),r.idleTimeoutMs!==void 0&&(u.timeoutMs=r.idleTimeoutMs);let d=await Mt(u);i&&Je(JSON.stringify({event:"chat_return",alias:s.alias??"(raw)",provider:s.provider,streamed:o,blockCount:a,streamedBytes:l,resultTextBytes:Buffer.byteLength(d.text,"utf8"),lastChunkBytes:c,tailPreview:O1(d.text,200)}));let f=d.status==="stalled";return o?d.text.endsWith(`
|
|
1851
1851
|
`)||e.stdout.write(`
|
|
1852
1852
|
`):e.stdout.write(`${d.text}${d.text.endsWith(`
|
|
1853
1853
|
`)?"":`
|
|
@@ -1855,7 +1855,7 @@ ${Cb}
|
|
|
1855
1855
|
`),1}}function R1(t){let e=[],r="yolo",n,s,o,i,a,l=!1,c,u=!1,d=!1;for(let g=0;g<t.length;g+=1){let _=t[g];if(_==="--permission-mode"){let S=t[++g];if(S===void 0||S.startsWith("--"))return"missing value for --permission-mode";if(S!=="plan"&&S!=="yolo")return`--permission-mode must be one of plan|yolo (got "${S}")`;r=S;continue}if(_==="--idle-timeout"){let S=t[++g];if(S===void 0||S.startsWith("--"))return"missing value for --idle-timeout";let E=Mb(S);if(typeof E=="string")return E;n=E;continue}if(_==="--session"){let S=t[++g];if(S===void 0||S.startsWith("--"))return"missing value for --session";s=S;continue}if(_==="--provider"){let S=t[++g];if(S===void 0||S.startsWith("--"))return"missing value for --provider";o=S;continue}if(_==="--from"){let S=t[++g];if(S===void 0||S.startsWith("--"))return"missing value for --from";i=S;continue}if(_==="--root"){let S=t[++g];if(S===void 0||S.startsWith("--"))return"missing value for --root";a=S;continue}if(_==="--force"){l=!0;continue}if(_==="--run"){let S=t[++g];if(S===void 0||S.startsWith("--"))return"missing value for --run";c=S;continue}if(_==="--done"){u=!0;continue}if(_==="--detach"){d=!0;continue}if(_.startsWith("--"))return`unknown flag: ${_}`;e.push(_)}if(c!==void 0)return d?"--run is mutually exclusive with --detach":s!==void 0?"--run is mutually exclusive with --session":o!==void 0?"--run is mutually exclusive with --provider":i!==void 0?"--run is mutually exclusive with --from":a!==void 0?"--run is mutually exclusive with --root":l?"--run is mutually exclusive with --force":e.length===0?"a prompt (answer) is required with --run":e.length>1?`--run takes exactly one positional (the answer); got ${e.length}`:{prompt:e[0],permissionMode:r,runFlag:c,done:u};let f,m,p;if(e.length===0)return"a prompt is required";if(e.length===1){if(s===void 0)return'expected <teamfile>:<alias> "<prompt>" | <teamfile> <alias> "<prompt>" | <sessionid> "<prompt>" | --session <id> "<prompt>"';p=e[0]}else if(e.length===2)f=e[0],p=e[1];else if(e.length===3)f=e[0],m=e[1],p=e[2];else return`too many positionals (${e.length}); expected at most <teamfile> <alias> <prompt>`;if(u)return"--done requires --run";if(d&&l)return"--force is not allowed with --detach";let h={prompt:p,permissionMode:r};return f!==void 0&&(h.target=f),m!==void 0&&(h.alias=m),n!==void 0&&(h.idleTimeoutMs=n),s!==void 0&&(h.sessionFlag=s),o!==void 0&&(h.providerFlag=o),i!==void 0&&(h.fromFlag=i),a!==void 0&&(h.rootFlag=a),l&&(h.force=!0),d&&(h.detach=!0),h}function Mb(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 Db(t,e,r){r.kind==="tool_use"?t.stderr.write(`[${e}] tool_use ${r.tool??"tool"}${r.summary?`: ${r.summary}`:""}
|
|
1856
1856
|
`):r.kind==="tool_result"?t.stderr.write(`[${e}] tool_result${r.status?` ${r.status}`:""}${r.summary?`: ${r.summary}`:""}
|
|
1857
1857
|
`):r.kind==="api_retry"&&t.stderr.write(`[${e}] api_retry${r.summary?`: ${r.summary}`:""}
|
|
1858
|
-
`)}function O1(t,e){return t.slice(-e)}function L1(t,e){e.kind==="delta"?t.stdout.write(e.chunk):e.kind==="progress"?Db(t,e.alias,e.event):t.stderr.write(e.message)}function C1(t){Pb();let e=process.argv[1];x1(process.execPath,[e,"jobs","run",String(t)],{detached:!0,stdio:"ignore",env:process.env}).unref()}function Pb(){let t=process.argv[1];if(t===void 0||t.length===0)throw new Error("cannot start detached worker: CLI entrypoint is unavailable")}var j1,Cb,Ub=b(()=>{"use strict";
|
|
1858
|
+
`)}function O1(t,e){return t.slice(-e)}function L1(t,e){e.kind==="delta"?t.stdout.write(e.chunk):e.kind==="progress"?Db(t,e.alias,e.event):t.stderr.write(e.message)}function C1(t){Pb();let e=process.argv[1];x1(process.execPath,[e,"jobs","run",String(t)],{detached:!0,stdio:"ignore",env:process.env}).unref()}function Pb(){let t=process.argv[1];if(t===void 0||t.length===0)throw new Error("cannot start detached worker: CLI entrypoint is unavailable")}var j1,Cb,Ub=b(()=>{"use strict";yt();Se();Pr();Ud();Ne();At();aa();Dt();j1={name:"chat",allowsBareTeamfile:!1,supportsRaw:!0},Cb=`usage: lmctl chat <teamfile>:<alias> "<prompt>"
|
|
1859
1859
|
lmctl chat <teamfile> <alias> "<prompt>"
|
|
1860
1860
|
lmctl chat <sessionid> "<prompt>" --provider <name>
|
|
1861
1861
|
lmctl chat --provider <name> --session <id> "<prompt>"
|
|
@@ -1864,7 +1864,7 @@ ${Cb}
|
|
|
1864
1864
|
[--from <teamfile>:<alias>] [--root <teamfile>] [--force]
|
|
1865
1865
|
|
|
1866
1866
|
Send a prompt to a team member or raw provider session, or answer a paused run.`});var Gb={};le(Gb,{applyMaxBytes:()=>pr,renderMessage:()=>Jb,runTail:()=>U1});async function U1(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${F1}
|
|
1867
|
-
`),0;let r=D(t,["--lines","--max-bytes","--watch-interval","--provider","--session","--run"],["--watch","--help"]);if(r.error!==void 0)return
|
|
1867
|
+
`),0;let r=D(t,["--lines","--max-bytes","--watch-interval","--provider","--session","--run"],["--watch","--help"]);if(r.error!==void 0)return w(e,r.error);let n=$(r,"--lines"),s=$(r,"--max-bytes");if(n!==void 0&&s!==void 0)return w(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 w(e,`invalid --lines "${n}" (expected a positive integer)`);o={kind:"lines",lines:m}}else{let m=s===void 0?D1:Number.parseInt(s,10);if(!Number.isFinite(m)||m<0||s!==void 0&&String(m)!==s)return w(e,`invalid --max-bytes "${s}" (expected a non-negative integer)`);o={kind:"bytes",maxBytes:m}}let i=M(r,"--watch"),a=$(r,"--watch-interval"),l=a===void 0?P1:Number.parseInt(a.replace(/s$/,""),10);if(!Number.isFinite(l)||l<1)return w(e,`invalid --watch-interval "${a}" (expected <N>s, N\u22651)`);if(r.positionals.length>2)return w(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let c=$(r,"--run");if(c!==void 0){if(r.positionals.length>0)return w(e,"--run is mutually exclusive with positional [target] [alias]");if($(r,"--session")!==void 0)return w(e,"--run is mutually exclusive with --session");if($(r,"--provider")!==void 0)return w(e,"--run is mutually exclusive with --provider");let m=Number.parseInt(c,10);if(!Number.isFinite(m)||m<=0||String(m)!==c)return w(e,`invalid --run "${c}" (expected a positive integer run id)`);try{return await L(e,async p=>W1(e,p,m,o,i,l))}catch(p){return me(e,p)}}let u=mr(M1,{target:r.positionals[0],alias:r.positionals[1],flags:{session:$(r,"--session"),provider:$(r,"--provider")}});if(u.mode==="error")return w(e,u.message);if(u.mode==="managed")return w(e,"tail managed mode requires --run <id>");let d;if(u.mode==="ai-team")if(u.alias===void 0){let m;try{m=await L(e,g=>Ae(u.teamfile,g))}catch(g){return w(e,`tail: ${g instanceof Error?g.message:String(g)}`)}let p;try{p=Le(m)}catch(g){return w(e,`tail: ${g instanceof Error?g.message:String(g)}`)}let h=kt(p);if(h===void 0)return w(e,`tail: ${u.teamfile} has no Lead member; pass <tf>:<alias>`);try{let g=await L(e,_=>vt(u.teamfile,h.alias,_));d={provider:g.provider,sessionId:g.sessionid,cwd:g.sessiondir}}catch(g){return g instanceof ge?w(e,g.message):me(e,g)}}else try{let m=await L(e,p=>vt(u.teamfile,u.alias,p));d={provider:m.provider,sessionId:m.sessionid,cwd:m.sessiondir}}catch(m){return m instanceof ge?w(e,m.message):me(e,m)}else{let m=u.sessionid,p=u.provider;if(p===void 0){let h=await Qo(m);if(h.length===0)return w(e,`tail: session "${m}" not found in any provider store`);if(h.length>1)return w(e,`tail: session "${m}" matches multiple providers (${h.join(", ")}); pass --provider`);p=h[0]}d={provider:p,sessionId:m}}let f=await Wb(e,d.provider,d.sessionId,o,-1);return f<0?1:i?await new Promise(m=>{let p=async()=>{try{let _=await Wb(e,d.provider,d.sessionId,o,f);_>=0&&(f=_)}catch(_){e.stderr.write(`tail: ${_ instanceof Error?_.message:String(_)}
|
|
1868
1868
|
`)}},h=setInterval(()=>{p()},l*1e3),g=()=>{clearInterval(h),m(0)};process.once("SIGINT",g),process.once("SIGTERM",g)}):0}async function Wb(t,e,r,n,s){let o;try{o=await jr(r,e)}catch(c){return t.stderr.write(`tail: failed to load session: ${c instanceof Error?c.message:String(c)}
|
|
1869
1869
|
`),-1}if(o===null)return t.stderr.write(`tail: session not found: ${r} (provider=${e})
|
|
1870
1870
|
`),-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+=`${Jb(i[c])}
|
|
@@ -1873,7 +1873,7 @@ Send a prompt to a team member or raw provider session, or answer a paused run.`
|
|
|
1873
1873
|
`).split(`
|
|
1874
1874
|
`),o=s[0]??"",i=s.slice(1);return i.length===0?`${r}: ${o}`:`${r}: ${o}
|
|
1875
1875
|
${i.map(a=>` ${a}`).join(`
|
|
1876
|
-
`)}`}async function W1(t,e,r,n,s,o){if(e.getRun(r)===null)return
|
|
1876
|
+
`)}`}async function W1(t,e,r,n,s,o){if(e.getRun(r)===null)return w(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=>`${Hb(d)}
|
|
1877
1877
|
`).join("");t.stdout.write(n.kind==="bytes"?pr(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 h=e.listSessionEvents(r,u),g="";for(let _ of h)g+=`${Hb(_)}
|
|
1878
1878
|
`,u=_.id;g.length>0&&t.stdout.write(n.kind==="bytes"?pr(g,n.maxBytes):g)}catch(h){t.stderr.write(`tail: ${h instanceof Error?h.message:String(h)}
|
|
1879
1879
|
`)}},o*1e3),p=()=>{clearInterval(m),d(0)};process.once("SIGINT",p),process.once("SIGTERM",p)}):0}function pr(t,e){if(e===0||Buffer.byteLength(t,"utf8")<=e)return t;let n=Buffer.byteLength(Bb,"utf8");if(n>=e)return qb(t,e);let s=e-n,o=qb(t,s);return`${Bb}${o}`}function qb(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 Hb(t){let e=Xb(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 Xb(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 M1,D1,P1,F1,Bb,Wd=b(()=>{"use strict";on();Se();Pr();Ht();fr();M1={name:"tail",allowsBareTeamfile:!0,supportsRaw:!0},D1=4096,P1=2,F1=`usage: lmctl tail [target] [alias]
|
|
@@ -1884,10 +1884,10 @@ ${i.map(a=>` ${a}`).join(`
|
|
|
1884
1884
|
Print or watch provider session messages, or follow a managed run timeline.
|
|
1885
1885
|
--lines and --max-bytes are mutually exclusive. Default: --max-bytes 4096.`;Bb=`\u2026 [truncated older output \u2014 raise with --max-bytes]
|
|
1886
1886
|
`});var Qb={};le(Qb,{runJobs:()=>G1});async function G1(t,e={stdout:process.stdout,stderr:process.stderr}){let[r,...n]=t;return r==="--help"||r==="-h"||r==="help"?(e.stdout.write(Kb),0):r===void 0?Bd([],e):r.startsWith("--")?Bd(t,e):r==="list"?Bd(n,e):r==="watch"?Y1(n,e):r==="show"?K1(n,e):r==="cancel"?V1(n,e):r==="run"?oF(n,e):(e.stderr.write(`error: unknown jobs subcommand: ${r}
|
|
1887
|
-
${Kb}`),2)}async function Bd(t,e){let r=D(t,["--team","--from","--status","--limit"],["--json"]);if(r.error!==void 0)return
|
|
1887
|
+
${Kb}`),2)}async function Bd(t,e){let r=D(t,["--team","--from","--status","--limit"],["--json"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,`unexpected positional: ${r.positionals[0]}`);let n=$(r,"--status");if(n!==void 0&&!X1.has(n))return w(e,`invalid --status "${n}" (expected pending|running|done|error|busy|cancelled)`);let s=n,o=$(r,"--limit"),i=o===void 0?void 0:z1(o,"--limit");return typeof i=="string"?w(e,i):await L(e,async a=>{let l,c=$(r,"--team");if(c!==void 0)try{l=await Ae(c,a)}catch(d){return w(e,`jobs list: ${d instanceof Error?d.message:String(d)}`)}let u=a.listDelegationJobs({...l!==void 0?{teamfile:l}:{},...$(r,"--from")!==void 0?{from:$(r,"--from")}:{},...s!==void 0?{status:s}:{},...typeof i=="number"?{limit:i}:{}});return M(r,"--json")?B(e,u):e.stdout.write(Q1(u)),0})}async function K1(t,e){let r=D(t,[],["--json"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length!==1)return w(e,"usage: lmctl jobs show <id> [--json]");let n=qd(r.positionals[0]);return typeof n=="string"?w(e,n):await L(e,s=>{let o=s.getDelegationJob(n);if(o===null)return w(e,`job ${n}: not found`);let i=s.listDelegationEvents(n);return M(r,"--json")?B(e,{...o,event_count:i.length}):e.stdout.write(eF(o,i.length)),0})}async function V1(t,e){let r=D(t,[],[]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length!==1)return w(e,"usage: lmctl jobs cancel <id>");let n=qd(r.positionals[0]);return typeof n=="string"?w(e,n):await L(e,s=>{let o=s.getDelegationJob(n);if(o===null)return w(e,`job ${n}: not found`);let i=s.cancelDelegationJob(n);return o.status==="pending"&&i.status==="cancelled"?e.stdout.write(`job ${n} cancelled before it ran
|
|
1888
1888
|
`):o.status==="running"&&i.status==="cancelled"?e.stdout.write(`job ${n} marked cancelled; running provider turn cannot be aborted and its result will be discarded
|
|
1889
1889
|
`):e.stdout.write(`job ${n} already ${o.status}; not cancelled
|
|
1890
|
-
`),0})}async function Y1(t,e){let r=D(t,["--max-bytes"],["--once"]);if(r.error!==void 0)return
|
|
1890
|
+
`),0})}async function Y1(t,e){let r=D(t,["--max-bytes"],["--once"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length!==1)return w(e,"usage: lmctl jobs watch <id> [--once] [--max-bytes N]");let n=qd(r.positionals[0]);if(typeof n=="string")return w(e,n);let s=$(r,"--max-bytes"),o=s===void 0?H1:Z1(s,"--max-bytes");return typeof o=="string"?w(e,o):await L(e,async i=>{if(i.getDelegationJob(n)===null)return w(e,`job ${n}: not found`);let l=Vb(e,i.listDelegationEvents(n),0,o),c=i.getDelegationJob(n);return zb(c.status)?(Yb(e,c,o),0):M(r,"--once")?0:await new Promise(u=>{let f=setInterval(()=>{try{let p=i.listDelegationEvents(n,l);l=Vb(e,p,l,o);let h=i.getDelegationJob(n);if(h===null){e.stderr.write(`error: job ${n}: not found
|
|
1891
1891
|
`),clearInterval(f),u(1);return}zb(h.status)&&(Yb(e,h,o),clearInterval(f),u(0))}catch(p){e.stderr.write(`jobs watch: ${p instanceof Error?p.message:String(p)}
|
|
1892
1892
|
`)}},q1),m=()=>{clearInterval(f),u(0)};process.once("SIGINT",m),process.once("SIGTERM",m)})})}function qd(t){let e=Number.parseInt(t,10);return!Number.isFinite(e)||e<=0||String(e)!==t?`invalid job id "${t}"`:e}function z1(t,e){let r=Number.parseInt(t,10);return!Number.isFinite(r)||r<1||String(r)!==t?`invalid ${e} "${t}" (expected a positive integer)`:r}function Z1(t,e){let r=Number.parseInt(t,10);return!Number.isFinite(r)||r<0||String(r)!==t?`invalid ${e} "${t}" (expected a non-negative integer)`:r}function Q1(t){if(t.length===0)return`no delegation jobs
|
|
1893
1893
|
`;let e=["ID STATUS TO FROM SUBMITTED PROMPT"];for(let r of t)e.push(`${r.id} ${r.status} \u2192 ${r.alias} ${r.from_identity} ${nF(r.created_at)} ${Zb(r.prompt,80)}`);return`${e.join(`
|
|
@@ -1911,12 +1911,12 @@ List, inspect, watch, or cancel tracked background delegations.
|
|
|
1911
1911
|
Statuses: pending, running, done, error, busy, cancelled.
|
|
1912
1912
|
Cancelling a pending job prevents it from running. Cancelling a running job
|
|
1913
1913
|
marks it cancelled; the provider turn cannot be aborted and its result is discarded.
|
|
1914
|
-
`,B1=8*60*60*1e3,q1=1e3,H1=4096,J1=new Set(["done","error","busy","cancelled"]),X1=new Set(["pending","running","done","error","busy","cancelled"])});var Os,
|
|
1915
|
-
`).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 hF(t){let e=t.LMCTL_MCP_CHAT_TIMEOUT_MS;if(e===void 0||e.trim().length===0)return tT;let r=Number(e);return!Number.isFinite(r)||r<=0?tT:r}function Jd(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:uF),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 uF,tT,dF,Xd=b(()=>{"use strict";Hd();Ne();uF="http://127.0.0.1:8787",tT=30*60*1e3,dF=new Map(Os.map(t=>[t.name,t]))});async function
|
|
1916
|
-
`}async function nT(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(Gd({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
|
|
1914
|
+
`,B1=8*60*60*1e3,q1=1e3,H1=4096,J1=new Set(["done","error","busy","cancelled"]),X1=new Set(["pending","running","done","error","busy","cancelled"])});var Os,Jz,Hd=b(()=>{"use strict";Os=[{name:"lmctl_chat",description:'Synchronous/blocking fallback: 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 tracked background delegation for batch or long-running work: `lmctl chat <team.lmctl> <alias> "<prompt>" --detach`, then use `lmctl jobs` or `lmctl jobs watch <id>`.',inputSchema:{type:"object",properties:{team:{type:"string",description:"Path to .lmctl teamfile"},alias:{type:"string",description:"Target alias; omitted means Lead"},from:{type:"string",description:"Optional self-asserted sender identity: <teamfile.lmctl>:<alias>"},prompt:{type:"string",description:"Prompt text to send"}},required:["team","prompt"]},local:!0}],Jz=Os.length});import{spawn as cF}from"node:child_process";async function rT(t,e,r){let n=dF.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 fF(n.name,s)}function fF(t,e){return t==="lmctl_chat"?mF(e):{status:"error",code:404,message:`unknown local tool: ${t}`}}function mF(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=typeof t.from=="string"&&t.from.length>0?t.from:void 0,o=["chat",r,n,e];return s!==void 0&&o.push("--from",s),we()&&Je(JSON.stringify({event:"mcp_chat_spawn",team:r,alias:n,from:s??null})),pF(o,process.cwd())}function pF(t,e){return new Promise(r=>{let n=!1,s,o=u=>{n||(n=!0,s!==void 0&&clearTimeout(s),r(u))},i=cF("lmctl",t,{cwd:e,env:process.env,stdio:["ignore","pipe","pipe"]}),a=hF(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){we()&&Je(JSON.stringify({event:"mcp_chat_payload",bytes:Buffer.byteLength(l,"utf8"),lines:l.split(`
|
|
1915
|
+
`).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 hF(t){let e=t.LMCTL_MCP_CHAT_TIMEOUT_MS;if(e===void 0||e.trim().length===0)return tT;let r=Number(e);return!Number.isFinite(r)||r<=0?tT:r}function Jd(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:uF),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 uF,tT,dF,Xd=b(()=>{"use strict";Hd();Ne();uF="http://127.0.0.1:8787",tT=30*60*1e3,dF=new Map(Os.map(t=>[t.name,t]))});async function yF(t,e){let r=t.id===void 0,n=t.id??null;if(t.method==="exit")return r||e.io.write(Gd({jsonrpc:"2.0",id:n,result:null})),{kind:"exit"};if(t.method==="initialize")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{protocolVersion:_F,capabilities:{tools:{listChanged:!1}},serverInfo:{name:gF,version:wF}}}};if(t.method==="notifications/initialized")return{kind:"notification"};if(t.method==="shutdown")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:null}};if(t.method==="tools/list")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{tools:Os.map(s=>({name:s.name,description:s.description,inputSchema:s.inputSchema}))}}};if(t.method==="tools/call"){let s=t.params!==null&&typeof t.params=="object"?t.params:{},o=typeof s.name=="string"?s.name:"",i=s.arguments,a=await rT(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 Gd(t){return`${JSON.stringify(t)}
|
|
1916
|
+
`}async function nT(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(Gd({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 yF(l,t);c.kind==="response"?t.io.write(Gd(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(`
|
|
1917
1917
|
`);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(`
|
|
1918
1918
|
`)}};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}
|
|
1919
|
-
`),a.finally(()=>c(1))})})}var _F,gF,
|
|
1919
|
+
`),a.finally(()=>c(1))})})}var _F,gF,wF,sT=b(()=>{"use strict";Hd();Xd();_F="2025-06-18",gF="lmctl",wF="0.0.1"});var iT={};le(iT,{runMcp:()=>bF});async function bF(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(EF),0;if(t.length>0)return e.stderr.write(`usage: lmctl mcp
|
|
1920
1920
|
`),2;Z({event:"mcp_bridge_start",pid:process.pid});let n=e.dal===void 0,s=e.dal??TF(),o=1;try{let i=s===void 0?Jd({getConfig:()=>null},process.env):Jd(s,process.env);return o=await nT({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 TF(){let t=ue(),e=3;for(let r=1;r<=e;r+=1)try{return pe({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&&oT(s))SF(50*r);else if(!oT(s))break}}function oT(t){return/SQLITE_BUSY|database is locked|database is busy/i.test(t)}function SF(t){let e=new Int32Array(new SharedArrayBuffer(4));Atomics.wait(e,0,0,t)}var EF,aT=b(()=>{"use strict";Ue();Xd();sT();Ne();Ye();EF=`usage: lmctl mcp
|
|
1921
1921
|
|
|
1922
1922
|
Start the stdio MCP bridge. The bridge resolves api.url and api.token from
|
|
@@ -1972,7 +1972,7 @@ local config, then uses stdin/stdout for JSON-RPC frames.
|
|
|
1972
1972
|
AND payload LIKE ?
|
|
1973
1973
|
ORDER BY id DESC
|
|
1974
1974
|
LIMIT 1
|
|
1975
|
-
`).get(s,o)??null}function uT(t,e){return new Date(t.getTime()-e*60*1e3)}function jF(t,e){return new Date(t.getTime()-e*60*60*1e3)}function dT(t,e){return new Date(t.getTime()-e*24*60*60*1e3)}function AF(t,e){return t.length<=e?t:`${t.slice(0,e-1)}\u2026`}var Cs,fT=b(()=>{"use strict";lT();Cs={stale_run_minutes:30,old_attention_days:7,old_issue_days:14,stuck_job_minutes:60,dedupe_window_hours:24}});var pT={};le(pT,{renderSummary:()=>mT,runMonitor:()=>OF});async function OF(t,e){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(RF),0;let r=D(t,[],["--json","--quiet"]);if(r.error!==void 0)return
|
|
1975
|
+
`).get(s,o)??null}function uT(t,e){return new Date(t.getTime()-e*60*1e3)}function jF(t,e){return new Date(t.getTime()-e*60*60*1e3)}function dT(t,e){return new Date(t.getTime()-e*24*60*60*1e3)}function AF(t,e){return t.length<=e?t:`${t.slice(0,e-1)}\u2026`}var Cs,fT=b(()=>{"use strict";lT();Cs={stale_run_minutes:30,old_attention_days:7,old_issue_days:14,stuck_job_minutes:60,dedupe_window_hours:24}});var pT={};le(pT,{renderSummary:()=>mT,runMonitor:()=>OF});async function OF(t,e){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(RF),0;let r=D(t,[],["--json","--quiet"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,`unknown argument: ${r.positionals[0]}`);let n=M(r,"--json"),s=M(r,"--quiet");try{return await L(e,o=>{let i=cT(o);return n?B(e,i):s||e.stdout.write(`${mT(i.findings)}
|
|
1976
1976
|
`),0})}catch(o){return me(e,o)}}function mT(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} ${LF(o,i)}`)}return`monitor: ${e.length} findings (${n.join(", ")})`}function LF(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 RF,hT=b(()=>{"use strict";Se();fT();RF=`usage: lmctl monitor [--json] [--quiet]
|
|
1977
1977
|
|
|
1978
1978
|
Scan the DB for stale runs, stuck jobs, overdue attentions, and overdue
|
|
@@ -1992,7 +1992,7 @@ access key stored at ${$s()}
|
|
|
1992
1992
|
`),0}function GF(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 KF(t,e){let r=VF(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
1993
1993
|
${Kd}`),2;let n=js();if(n.config===void 0)return e.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
|
|
1994
1994
|
`),1;let s=zF();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 YF({region:n.config.region,identityPoolId:n.config.identityPoolId,idpProvider:i,idToken:o}),l=UF({identityId:a,logins:{[i]:o},clientConfig:{region:n.config.region}}),c=n.config.deviceId??Mr()?.device_id,u=Ns(o)??void 0,d=new Cr({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 HF({region:n.config.region,credentials:l}),commands:{ListObjectsV2Command:BF,GetObjectCommand:WF,PutObjectCommand:qF},selfRole:"browser",onMessage:async()=>{}}),f=uE({root_teamfile:r.root,text:r.text,...r.promptId!==void 0?{prompt_id:r.promptId}:{}}),m=await d.putMessage({conversation_id:cE,payload:f});return e.stdout.write(JSON.stringify({prompt_id:f.prompt_id,mailbox_key:d.getMailboxBasePrefix(),object_key:m},null,2)+`
|
|
1995
|
-
`),0}function VF(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 YF(t){let r=await new PF({region:t.region}).send(new FF({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 zF(t=process.env.LMCTL_TOKEN_PATH??DF(MF(),".lmctl","cli-tokens.json")){try{return JSON.parse(CF(t,"utf8"))}catch{return null}}var Kd,gT=b(()=>{"use strict";Dd();Ad();ea();
|
|
1995
|
+
`),0}function VF(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 YF(t){let r=await new PF({region:t.region}).send(new FF({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 zF(t=process.env.LMCTL_TOKEN_PATH??DF(MF(),".lmctl","cli-tokens.json")){try{return JSON.parse(CF(t,"utf8"))}catch{return null}}var Kd,gT=b(()=>{"use strict";Dd();Ad();ea();wd();yd();Sd();Ed();Kd=`usage: lmctl device <id|init|login|prompt>
|
|
1996
1996
|
lmctl device login --user-id <sub> --access-key <refreshToken>
|
|
1997
1997
|
lmctl device prompt --root <teamfile> --text <prompt> [--prompt-id <id>]
|
|
1998
1998
|
|
|
@@ -2002,21 +2002,21 @@ addressing. The id is stored in ~/.lmctl/device.json by default.
|
|
|
2002
2002
|
'lmctl device login' authenticates this machine's 'lmctl serve' daemon to the
|
|
2003
2003
|
cloud mailbox using your user-id (Cognito sub) and an access key (refresh
|
|
2004
2004
|
token). The access key is stored in ~/.lmctl/device-auth.json (chmod 600).
|
|
2005
|
-
`});var
|
|
2005
|
+
`});var yT={};le(yT,{runTeam:()=>eU});import{join as ZF}from"node:path";async function eU(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(QF),0;try{return await L(e,async s=>{switch(r){case"create":return rU(n,e,s);case"list":return nU(n,e,s);case"show":return sU(n,e,s);case"add-member":return oU(n,e,s);case"seed":return wT(n,e,s,!1);case"refresh":return wT(n,e,s,!0);case"companion":return aU(n,e,s);case"list-roots":return tU(n,e,s);default:return w(e,"usage: lmctl team <create|list|show|add-member|seed|refresh|companion|list-roots>")}})}catch(s){return me(e,s)}}function tU(t,e,r){let n=D(t,[]);if(n.error!==void 0)return w(e,n.error);if(n.positionals.length>0)return w(e,"usage: team list-roots [--json]");let s=r.listRootTeams();return M(n,"--json")?B(e,s):e.stdout.write(s.map(o=>`${o.name??"(unnamed)"} ${o.teamfile_path} ${o.last_seeded_at??""}`).join(`
|
|
2006
2006
|
`)+(s.length>0?`
|
|
2007
|
-
`:"")),0}function rU(t,e,r){let[n]=t;if(n===void 0)return
|
|
2008
|
-
`),0}function nU(t,e,r){let n=D(t,[]);if(n.error!==void 0)return
|
|
2007
|
+
`:"")),0}function rU(t,e,r){let[n]=t;if(n===void 0)return w(e,"usage: team create <name>");let s=r.insertTeam({name:n});return e.stdout.write(`created team ${s.name}
|
|
2008
|
+
`),0}function nU(t,e,r){let n=D(t,[]);if(n.error!==void 0)return w(e,n.error);let s=r.listTeams();return M(n,"--json")?B(e,s):e.stdout.write(`${s.map(o=>`${o.id} ${o.name}`).join(`
|
|
2009
2009
|
`)}${s.length>0?`
|
|
2010
|
-
`:""}`),0}function sU(t,e,r){let n=D(t,[]);if(n.error!==void 0)return
|
|
2010
|
+
`:""}`),0}function sU(t,e,r){let n=D(t,[]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: team show <name> [--json]");let o=r.findTeamByName(s);if(o===null)return w(e,`team not found: ${s}`);let i=r.listTeamMembers(o.id);if(M(n,"--json"))B(e,{team:o,members:i});else{e.stdout.write(`team ${o.name}
|
|
2011
2011
|
`);for(let a of i)e.stdout.write(`- ${a.alias} ${$e(a)} ${a.sessionid??"(unseeded)"}
|
|
2012
|
-
`)}return 0}function oU(t,e,r){let n=D(t,["--alias","--provider","--model","--role","--sessiondir"]);if(n.error!==void 0)return
|
|
2013
|
-
`),0}async function
|
|
2012
|
+
`)}return 0}function oU(t,e,r){let n=D(t,["--alias","--provider","--model","--role","--sessiondir"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: team add-member <team-name> --alias A --provider P [--model M] [--role R] [--sessiondir D]");let o=r.findTeamByName(s);if(o===null)return w(e,`team not found: ${s}`);let i=$(n,"--alias"),a=$(n,"--provider");if(i===void 0||a===void 0)return w(e,"team add-member requires --alias and --provider");let l=r.insertTeamMember({team_id:o.id,alias:i,provider:a,model:$(n,"--model")??null,role:$(n,"--role")??"agent",sessiondir:$(n,"--sessiondir")??ZF(gr(),"sessions",o.name,i)});return M(n,"--json")?B(e,l):e.stdout.write(`added member ${l.alias} to ${o.name}
|
|
2013
|
+
`),0}async function wT(t,e,r,n){let s=D(t,["--alias"]);if(s.error!==void 0)return w(e,s.error);let[o]=s.positionals;if(o===void 0)return w(e,n?"usage: team refresh <team-name> --alias A":"usage: team seed <team-name> [--alias A]");let i=r.findTeamByName(o);if(i===null)return w(e,`team not found: ${o}`);let a=$(s,"--alias");if(n&&a===void 0)return w(e,"team refresh requires --alias");if(n&&a!==void 0&&a.trim().toLowerCase()==="lead")return w(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let l=iU(r.listTeamMembers(i.id),a,n);if(a!==void 0&&l.length===0)return w(e,`member not found or already seeded: ${a}`);if(n&&l.some(f=>f.alias.toLowerCase()==="lead"||f.role==="lead"))return w(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let c=new Set;for(let f of r.listProjects().filter(m=>m.team_id===i.id)){if(c.has(f.workflow_name))continue;c.add(f.workflow_name);let m=r.getWorkflowByName(f.workflow_name);if(m===null)continue;let p=uw(f.workflow_name,m.definition);if(p.status==="FAIL")return w(e,`cannot seed team \`${i.name}\`: workflow \`${f.workflow_name}\` failed verify-at-seed \u2014 ${p.note}. Fix the workflow and retry; NO members were seeded (no side-effects).`)}for(let f of r.listProjects().filter(m=>m.team_id===i.id))Vo(f,r),zo(f);let u=[],d=!1;for(let f of l){let m=await Qr({member:f,dal:r}),p=r.updateTeamMemberSession(f.id,m.sessionid);if(p!==null){let h=p.role_prompt??"",g=h.length>0?`${h}
|
|
2014
2014
|
|
|
2015
2015
|
${nn}`:nn;r.setMemberPromptSnapshot(f.id,g),u.push(p);let _=sn($e(p),m.sessionid);_!==null&&e.stderr.write(`[seeded ${p.alias}] customize/compact in its native TUI:
|
|
2016
2016
|
${_}
|
|
2017
2017
|
`);try{await fi({dal:r,member:p,stderr:e.stderr})}catch(S){d=!0,e.stderr.write(`error: ${S instanceof Error?S.message:String(S)}
|
|
2018
2018
|
`)}}}return M(s,"--json")?B(e,u):e.stdout.write(`seeded ${u.length} member(s)
|
|
2019
|
-
`),d?1:0}function iU(t,e,r){return t.filter(n=>e!==void 0&&n.alias!==e?!1:r||n.sessionid===null)}function aU(t,e,r){let n=D(t,["--interpreter","--of"]);if(n.error!==void 0)return
|
|
2019
|
+
`),d?1:0}function iU(t,e,r){return t.filter(n=>e!==void 0&&n.alias!==e?!1:r||n.sessionid===null)}function aU(t,e,r){let n=D(t,["--interpreter","--of"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: team companion <team-name> --interpreter A --of B[,C]");let o=r.findTeamByName(s);if(o===null)return w(e,`team not found: ${s}`);let i=$(n,"--interpreter"),a=$(n,"--of")?.split(",").map(c=>c.trim()).filter(Boolean);if(i===void 0||a===void 0||a.length===0)return w(e,"team companion requires --interpreter and --of");let l=r.findTeamMemberByAlias(o.id,i);if(l===null)return w(e,`member not found: ${i}`);for(let c of a){let u=r.findTeamMemberByAlias(o.id,c);if(u===null)return w(e,`member not found: ${c}`);r.insertTeamMemberCompanion({interpreter_id:l.id,companion_id:u.id})}return e.stdout.write(`recorded ${a.length} companion link(s)
|
|
2020
2020
|
`),0}var QF,ET=b(()=>{"use strict";Ye();Ao();rs();kc();Ue();on();Bc();Hi();Se();vc();QF=`usage: lmctl team <create|list|show|add-member|seed|refresh|companion|list-roots>
|
|
2021
2021
|
|
|
2022
2022
|
Manage DB-backed teams, members, and provider session lifecycle. Use seed or
|
|
@@ -2025,7 +2025,7 @@ refresh to create/update native provider sessions for team members.
|
|
|
2025
2025
|
Root team registry:
|
|
2026
2026
|
list-roots [--json] List .lmctl root teams registered by lmctl seed.
|
|
2027
2027
|
`});var bT={};le(bT,{runInfo:()=>dU});function uU(t){return t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${Math.round(t/1e3)}K`:String(t)}async function dU(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${cU}
|
|
2028
|
-
`),0;let r=D(t,["--provider","--run"],["--json","--help"]);if(r.error!==void 0)return
|
|
2028
|
+
`),0;let r=D(t,["--provider","--run"],["--json","--help"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>2)return w(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let n=M(r,"--json"),s=$(r,"--run");if(s!==void 0){if(r.positionals.length>0)return w(e,"--run is mutually exclusive with positional [target] [alias]");if($(r,"--provider")!==void 0)return w(e,"--run is mutually exclusive with --provider");let c=Number.parseInt(s,10);if(!Number.isFinite(c)||c<=0||String(c)!==s)return w(e,`invalid --run "${s}" (expected a positive integer run id)`);try{return await L(e,async u=>mU(e,u,c,n))}catch(u){return me(e,u)}}let o=mr(lU,{target:r.positionals[0],alias:r.positionals[1],flags:{provider:$(r,"--provider")}});if(o.mode==="error")return w(e,o.message);if(o.mode==="managed")return w(e,"health managed mode requires --run <id>");if(o.mode==="ai-team"&&o.alias===void 0){let c;try{c=await L(e,u=>Ae(o.teamfile,u))}catch(u){return w(e,`health: ${u instanceof Error?u.message:String(u)}`)}return pU(e,c,n)}let i,a,l;if(o.mode==="ai-team")try{let c=await L(e,u=>vt(o.teamfile,o.alias,u));i=c.provider,a=c.sessionid,l=c.alias}catch(c){return c instanceof ge?w(e,c.message):me(e,c)}else if(a=o.sessionid,o.provider!==void 0)i=o.provider;else{let c=await Qo(a);if(c.length===0)return w(e,`health: session "${a}" not found in any provider store`);if(c.length>1)return w(e,`health: session "${a}" matches multiple providers (${c.join(", ")}); pass --provider`);i=c[0]}return fU(e,i,a,l,n)}async function fU(t,e,r,n,s){let o;try{o=await jr(r,e)}catch(a){return w(t,`health: failed to load session: ${a instanceof Error?a.message:String(a)}`)}if(o===null)return w(t,`health: session not found: ${r} (provider=${e})`);let i={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}:{},createdAt:o.createdAt.toISOString(),modifiedAt:o.modifiedAt.toISOString()};return s?(B(t,i),0):(t.stdout.write(`Session: ${o.sessionId}
|
|
2029
2029
|
`),t.stdout.write(` Provider: ${o.provider}
|
|
2030
2030
|
`),n!==void 0&&t.stdout.write(` Alias: ${n}
|
|
2031
2031
|
`),t.stdout.write(` CWD: ${o.cwd}
|
|
@@ -2034,7 +2034,7 @@ Root team registry:
|
|
|
2034
2034
|
`),o.totalInputTokens===void 0||o.totalOutputTokens===void 0?t.stdout.write(" Tokens: unknown"):t.stdout.write(` Tokens: ${o.totalInputTokens} in / ${o.totalOutputTokens} out`),i.totalCachedInputTokens!==void 0&&t.stdout.write(` (cached: ${i.totalCachedInputTokens})`),t.stdout.write(`
|
|
2035
2035
|
`),t.stdout.write(` Created: ${i.createdAt}
|
|
2036
2036
|
`),t.stdout.write(` Modified: ${i.modifiedAt}
|
|
2037
|
-
`),0)}async function mU(t,e,r,n){let s=Nr(e,r);if(s===null)return
|
|
2037
|
+
`),0)}async function mU(t,e,r,n){let s=Nr(e,r);if(s===null)return w(t,`health: run ${r}: not found`);let o=tn(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?(B(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}
|
|
2038
2038
|
`),t.stdout.write(` Workflow: ${s.workflow?.name??"(unknown)"}
|
|
2039
2039
|
`),t.stdout.write(` Team: ${s.team?.name??"(unknown)"}
|
|
2040
2040
|
`),t.stdout.write(` State: ${s.current_state??"(none)"}${s.terminal_state!==null?` (terminal: ${s.terminal_state})`:""}
|
|
@@ -2044,7 +2044,7 @@ Root team registry:
|
|
|
2044
2044
|
`),t.stdout.write(` Steps: ${s.steps.length}
|
|
2045
2045
|
`),t.stdout.write(` AgentCalls: ${i.agentCallCount}
|
|
2046
2046
|
`),t.stdout.write(` Tokens: ${i.totalInputTokens} in / ${i.totalOutputTokens} out
|
|
2047
|
-
`),0)}async function pU(t,e,r){let n;try{n=Le(e)}catch(u){return
|
|
2047
|
+
`),0)}async function pU(t,e,r){let n;try{n=Le(e)}catch(u){return w(t,`health: ${u instanceof Error?u.message:String(u)}`)}let s=[],o=0;for(let u of n.members){if(u.teamfile!==void 0||u.session===void 0||u.session.length===0)continue;let d=null;try{d=await jr(u.session,u.provider)}catch(m){t.stderr.write(`warning: failed to load session "${u.session}" for ${u.alias} (${u.provider}): ${m instanceof Error?m.message:String(m)}
|
|
2048
2048
|
`)}let f=d?.messageCount;s.push({alias:u.alias,provider:u.provider,sessionid:u.session,messageCount:f??null,model:d?.model??"(unknown)",lastContext:d?.lastInputTokens}),f===void 0?o=void 0:o!==void 0&&(o+=f)}if(r)return B(t,{team:n.name,members:s,total:{messageCount:o??null}}),0;let i=Math.max(7,...s.map(u=>u.sessionid.length)),a=Math.max(5,...s.map(u=>u.alias.length))+1,l=Math.max(8,...s.map(u=>u.provider.length))+1,c=Math.max(5,...s.map(u=>u.model.length))+1;t.stdout.write(`TEAM: ${n.name}
|
|
2049
2049
|
`),t.stdout.write(` ${"SESSION".padEnd(i)} ${"ALIAS".padEnd(a)}${"PROVIDER".padEnd(l)}${"MODEL".padEnd(c)}${"MSGS".padStart(6)} ${"LAST CONTEXT".padStart(12)}
|
|
2050
2050
|
`);for(let u of s){let d=u.lastContext!==void 0?uU(u.lastContext):"?";t.stdout.write(` ${u.sessionid.padEnd(i)} ${u.alias.padEnd(a)}${u.provider.padEnd(l)}${u.model.padEnd(c)}${Vd(u.messageCount).padStart(6)} ${d.padStart(12)}
|
|
@@ -2054,29 +2054,29 @@ Root team registry:
|
|
|
2054
2054
|
lmctl health <sessionid> [--provider <name>]
|
|
2055
2055
|
[--json]
|
|
2056
2056
|
|
|
2057
|
-
Show provider session details, team rollups, or managed run state/token totals.`});var kT={};le(kT,{runLs:()=>
|
|
2058
|
-
`),0;let r=D(t,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(r.error!==void 0)return
|
|
2057
|
+
Show provider session details, team rollups, or managed run state/token totals.`});var kT={};le(kT,{runLs:()=>wU});import{resolve as Yd}from"node:path";function gU(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 wU(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${hU}
|
|
2058
|
+
`),0;let r=D(t,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let n=$(r,"--format"),s=M(r,"--json");if(M(r,"--runs")){for(let _ of["--provider","--sessiondir"])if($(r,_)!==void 0)return w(e,`--runs is mutually exclusive with ${_}`);for(let _ of["--recursive","--all"])if(M(r,_))return w(e,`--runs is mutually exclusive with ${_}`);if(n==="teamfile")return w(e,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let p=$(r,"--limit"),h=_U;if(p!==void 0){let _=Number.parseInt(p,10);if(!Number.isFinite(_)||_<1||String(_)!==p)return w(e,`invalid --limit "${p}" (expected a positive integer)`);if(_>ST)return w(e,`--limit ${_} exceeds maximum (${ST})`);h=_}let g=n==="json"||s===!0?"json":"table";try{return await L(e,async _=>yU(e,_,h,g))}catch(_){return me(e,_)}}let i=EU(n,s);if("error"in i)return w(e,i.error);let a=i.format,l=$(r,"--provider"),c=$(r,"--sessiondir"),u=M(r,"--recursive"),d=M(r,"--all"),f;try{f=await sc(l?{provider:l}:{})}catch(p){return w(e,`ls: discovery failed: ${p instanceof Error?p.message:String(p)}`)}if(!d){let p=c!==void 0?Yd(c):Yd(process.cwd());f=f.filter(h=>{let g=Yd(h.cwd);return u?g===p||g.startsWith(`${p}/`):g===p})}if(f=gU(f),a==="json")return B(e,f.map(p=>({provider:p.provider,sessionId:p.sessionId,cwd:p.cwd,messageCount:p.messageCount,modifiedAt:p.modifiedAt.toISOString(),...p.model!==void 0?{model:p.model}:{}}))),0;if(f.length===0){if(a==="table"){let p=d?"(all)":c??process.cwd(),h=u?"under":"in";e.stdout.write(`No native sessions found ${h} ${p}.
|
|
2059
2059
|
`)}return 0}if(a==="teamfile"){for(let p of f)e.stdout.write(`_MEMBER_ alias=- provider=${p.provider} sessionid=${p.sessionId} sessiondir=${p.cwd}
|
|
2060
2060
|
`);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
|
|
2061
2061
|
`);for(let p of f){let h=p.cwd.length>36?`\u2026${p.cwd.slice(-35)}`:p.cwd;e.stdout.write(`${p.sessionId.padEnd(m)} ${p.provider.padEnd(10)} ${h.padEnd(36)} ${p.modifiedAt.toISOString()}
|
|
2062
|
-
`)}return 0}async function
|
|
2062
|
+
`)}return 0}async function yU(t,e,r,n){let s=en(e,{limit:r});if(n==="json")return B(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.
|
|
2063
2063
|
`),0;t.stdout.write(`${"RUN_ID".padEnd(8)} ${"WORKFLOW".padEnd(8)} ${"TEAM".padEnd(8)} ${"STATE".padEnd(20)} ${"TERMINAL".padEnd(20)} STARTED
|
|
2064
2064
|
`);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}
|
|
2065
|
-
`)}return 0}function EU(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 hU,_U,ST,vT=b(()=>{"use strict";
|
|
2065
|
+
`)}return 0}function EU(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 hU,_U,ST,vT=b(()=>{"use strict";yt();Se();Dt();hU=`usage: lmctl ls [--provider <name>] [--sessiondir <path>]
|
|
2066
2066
|
[--recursive] [--all] [--format table|teamfile|json] [--json]
|
|
2067
2067
|
lmctl ls --runs [--limit N] [--format table|json] [--json]
|
|
2068
2068
|
|
|
2069
|
-
List native provider sessions in scope, or list recent managed runs with --runs.`,_U=50,ST=500});import{existsSync as NT,readFileSync as $T}from"node:fs";import{homedir as bU}from"node:os";import{dirname as TU,resolve as xT}from"node:path";import{fileURLToPath as SU}from"node:url";function Qd(t,e={}){let r=[],n=IU(e.modelSelectionDocPath);for(let s of t){let o=s.provider.trim().toLowerCase();if(s.effort&&o!=="opencode"&&r.push(`[${s.alias}] effort="${s.effort}" is ignored: effort selection is only supported for opencode.`),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==="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=jU(e.opencodeConfigPath);a.missingConfigPath&&r.push(`[${s.alias}] opencode config not found at ${a.missingConfigPath}. lmctl can still validate lmctl-managed model ids, but opencode itself needs provider config/auth for use outside lmctl. Sample config: https://lmctl.com/examples/opencode.json (copy it to that path and adjust for the models your account can access).`),a.available?a.models.includes(s.model)||r.push(`[${s.alias}] model="${s.model}" is not configured for opencode. Valid configured or lmctl-managed models: ${IT(a.models)}`):r.push(`[${s.alias}] model="${s.model}" cannot be verified for opencode: ${a.reason}.`);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}": `+(Da??"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: ${IT(i)}`)}return r}function IU(t){if(!t&&Ds)return Ds;let e=new Map,r,n=t??NU();if(!NT(n))return r=`${n} not found`,t||zd(e),t||(Ds=e),t||(Da=r),e;let s;try{s=$T(n,"utf-8")}catch(o){return r=`${n} could not be read: ${o instanceof Error?o.message:String(o)}`,t||zd(e),t||(Ds=e),t||(Da=r),e}for(let[o,i]of Object.entries(kU)){let a=$U(s,i),l=xU(a);l.length>0&&e.set(o,l)}return e.size===0&&(r=`${n} has no tested model rows`),!t&&e.size===0&&zd(e),t||(Ds=e),t||(Da=r),e}function NU(){let t=TU(SU(import.meta.url));return xT(t,"..","..","..","durable-memory","model_selection.md")}function zd(t){for(let[e,r]of Object.entries(vU))t.set(e,r)}function $U(t,e){let n=new RegExp(`^## ${RU(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 xU(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 jU(t){let e=t??xT(bU(),".config","opencode","opencode.json"),r=Fm();if(!NT(e))return{available:!0,models:r,missingConfigPath:e};let n;try{n=JSON.parse($T(e,"utf-8"))}catch(o){return{available:!1,models:[],reason:`${e} could not be parsed: ${o instanceof Error?o.message:String(o)}`}}let s=[...new Set([...AU(n),...r])].sort();return s.length===0?{available:!1,models:s,reason:`${e} has no provider models`}:{available:!0,models:s}}function AU(t){if(!Zd(t))return[];let e=Ma(t.provider)??Ma(t.providers);if(!e)return[];let r=new Set;for(let[n,s]of Object.entries(e)){if(!Zd(s))continue;let o=Ma(s.models)??Ma(s.model);if(o)for(let i of Object.keys(o))r.add(i.startsWith(`${n}/`)?i:`${n}/${i}`)}return[...r].sort()}function Ma(t){return Zd(t)?t:null}function Zd(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function IT(t){return t.length>0?t.join(", "):"(none)"}function RU(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var kU,vU,Ds,Da,jT=b(()=>{"use strict";Il();kU={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen",agy:"Antigravity"},vU={claude:["claude-opus-4-6","claude-opus-4-7","claude-opus-4-8","claude-sonnet-4-6","claude-haiku-4-5","claude-fable-5"],codex:["gpt-5.2","gpt-5.4","gpt-5.5","gpt-5.4-mini","gpt-5.3-codex","gpt-5.3-codex-spark"],gemini:["gemini-3.1-pro-preview","gemini-3-flash-preview","gemini-3.1-flash-lite-preview","gemini-2.5-flash","gemini-2.5-flash-lite"],qwen:["qwen3.5-plus","qwen3.6-plus"],agy:["gemini-1.5-flash","gemini-1.5-pro","gemini-3.5-flash","gemini-3.1-pro","gpt-oss-120b","gpt-4-turbo","gpt-4","gpt-3.5-turbo","claude-3-opus","claude-3-sonnet","claude-3-haiku"]},Ds=null});var Bs={};le(Bs,{DEPRECATED_CONNECT_WARNING:()=>MT,GEMINI_PROVIDER_NOTICE:()=>CT,_setLintSessiondirFsOpsForTests:()=>GU,_setSkillFileOpsForTests:()=>XU,_setTeamfileSeedForTests:()=>JU,buildRootTeamRegistrationRow:()=>WT,registerRootTeam:()=>BT,runHire:()=>tW,runLint:()=>eW,runRefresh:()=>rW,runSeed:()=>FT,sha256Text:()=>UT,skillNameFromSource:()=>cf,skillNameFromUrl:()=>
|
|
2069
|
+
List native provider sessions in scope, or list recent managed runs with --runs.`,_U=50,ST=500});import{existsSync as NT,readFileSync as $T}from"node:fs";import{homedir as bU}from"node:os";import{dirname as TU,resolve as xT}from"node:path";import{fileURLToPath as SU}from"node:url";function Qd(t,e={}){let r=[],n=IU(e.modelSelectionDocPath);for(let s of t){let o=s.provider.trim().toLowerCase();if(s.effort&&o!=="opencode"&&r.push(`[${s.alias}] effort="${s.effort}" is ignored: effort selection is only supported for opencode.`),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==="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=jU(e.opencodeConfigPath);a.missingConfigPath&&r.push(`[${s.alias}] opencode config not found at ${a.missingConfigPath}. lmctl can still validate lmctl-managed model ids, but opencode itself needs provider config/auth for use outside lmctl. Sample config: https://lmctl.com/examples/opencode.json (copy it to that path and adjust for the models your account can access).`),a.available?a.models.includes(s.model)||r.push(`[${s.alias}] model="${s.model}" is not configured for opencode. Valid configured or lmctl-managed models: ${IT(a.models)}`):r.push(`[${s.alias}] model="${s.model}" cannot be verified for opencode: ${a.reason}.`);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}": `+(Da??"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: ${IT(i)}`)}return r}function IU(t){if(!t&&Ds)return Ds;let e=new Map,r,n=t??NU();if(!NT(n))return r=`${n} not found`,t||zd(e),t||(Ds=e),t||(Da=r),e;let s;try{s=$T(n,"utf-8")}catch(o){return r=`${n} could not be read: ${o instanceof Error?o.message:String(o)}`,t||zd(e),t||(Ds=e),t||(Da=r),e}for(let[o,i]of Object.entries(kU)){let a=$U(s,i),l=xU(a);l.length>0&&e.set(o,l)}return e.size===0&&(r=`${n} has no tested model rows`),!t&&e.size===0&&zd(e),t||(Ds=e),t||(Da=r),e}function NU(){let t=TU(SU(import.meta.url));return xT(t,"..","..","..","durable-memory","model_selection.md")}function zd(t){for(let[e,r]of Object.entries(vU))t.set(e,r)}function $U(t,e){let n=new RegExp(`^## ${RU(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 xU(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 jU(t){let e=t??xT(bU(),".config","opencode","opencode.json"),r=Fm();if(!NT(e))return{available:!0,models:r,missingConfigPath:e};let n;try{n=JSON.parse($T(e,"utf-8"))}catch(o){return{available:!1,models:[],reason:`${e} could not be parsed: ${o instanceof Error?o.message:String(o)}`}}let s=[...new Set([...AU(n),...r])].sort();return s.length===0?{available:!1,models:s,reason:`${e} has no provider models`}:{available:!0,models:s}}function AU(t){if(!Zd(t))return[];let e=Ma(t.provider)??Ma(t.providers);if(!e)return[];let r=new Set;for(let[n,s]of Object.entries(e)){if(!Zd(s))continue;let o=Ma(s.models)??Ma(s.model);if(o)for(let i of Object.keys(o))r.add(i.startsWith(`${n}/`)?i:`${n}/${i}`)}return[...r].sort()}function Ma(t){return Zd(t)?t:null}function Zd(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function IT(t){return t.length>0?t.join(", "):"(none)"}function RU(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var kU,vU,Ds,Da,jT=b(()=>{"use strict";Il();kU={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen",agy:"Antigravity"},vU={claude:["claude-opus-4-6","claude-opus-4-7","claude-opus-4-8","claude-sonnet-4-6","claude-haiku-4-5","claude-fable-5"],codex:["gpt-5.2","gpt-5.4","gpt-5.5","gpt-5.4-mini","gpt-5.3-codex","gpt-5.3-codex-spark"],gemini:["gemini-3.1-pro-preview","gemini-3-flash-preview","gemini-3.1-flash-lite-preview","gemini-2.5-flash","gemini-2.5-flash-lite"],qwen:["qwen3.5-plus","qwen3.6-plus"],agy:["gemini-1.5-flash","gemini-1.5-pro","gemini-3.5-flash","gemini-3.1-pro","gpt-oss-120b","gpt-4-turbo","gpt-4","gpt-3.5-turbo","claude-3-opus","claude-3-sonnet","claude-3-haiku"]},Ds=null});var Bs={};le(Bs,{DEPRECATED_CONNECT_WARNING:()=>MT,GEMINI_PROVIDER_NOTICE:()=>CT,_setLintSessiondirFsOpsForTests:()=>GU,_setSkillFileOpsForTests:()=>XU,_setTeamfileSeedForTests:()=>JU,buildRootTeamRegistrationRow:()=>WT,registerRootTeam:()=>BT,runHire:()=>tW,runLint:()=>eW,runRefresh:()=>rW,runSeed:()=>FT,sha256Text:()=>UT,skillNameFromSource:()=>cf,skillNameFromUrl:()=>_W});import{createHash as OU,randomUUID as LU}from"node:crypto";import{accessSync as CU,constants as AT,existsSync as MU,mkdirSync as DU,readFileSync as Wa,realpathSync as Ua,renameSync as PU,statSync as FU,unlinkSync as UU,writeFileSync as Us}from"node:fs";import{basename as WU,dirname as Wr,isAbsolute as RT,join as rf,resolve as lf}from"node:path";function JU(t){DT=t??(async e=>{let{seed:r}=await Promise.resolve().then(()=>(yt(),ic)),n=await r(e);return n.success?{sessionId:n.sessionId}:{error:n.error??"provider seed failed"}})}function XU(t){Fs=t===null?nf:{...nf,...t}}function GU(t){Ur=t===null?sf:{...sf,...t}}function KU(t,e){let r=Wr(e),n=new Set,s=[];for(let o of t){if(o.teamfile!==void 0)continue;let i=o.sessiondir??r,a=lf(i);if(n.has(a))continue;let l=VU(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 VU(t){try{if(Ur.existsSync(t)){if(!Ur.statSync(t).isDirectory())return"ENOTDIR";Ur.accessSync(t,AT.W_OK);return}let e=ZU(t);if(e===void 0)return;if(!Ur.statSync(e).isDirectory())return"ENOTDIR";Ur.accessSync(e,AT.W_OK);return}catch(e){return QU(e)??"permission check failed"}}function YU(t,e){let r=[];for(let n of t)n.teamfile!==void 0||n.sessiondir===void 0||PT(n.sessiondir,e)&&r.push(`${n.alias}: sessiondir equals the teamfile directory and is redundant; lmctl seed will remove it`);return r}function zU(t,e,r,n){let s=!1;for(let o of t){if(o.teamfile!==void 0||o.sessiondir===void 0||!PT(o.sessiondir,n))continue;let i=r.get(o.alias.toLowerCase());if(i===void 0)continue;let a=qT(e[i],"sessiondir");a!==e[i]&&(e[i]=a,s=!0),o.sessiondir=void 0}return s}function PT(t,e){return OT(t)===OT(e)}function OT(t){let e=lf(t);try{return Ua(e)}catch{return e}}function ZU(t){let e=t;for(;;){try{if(Ur.existsSync(e))return e}catch{return}let r=Wr(e);if(r===e)return;e=r}}function QU(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 eW(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(qU),0;if(t.length!==1)return e.stderr.write(`usage: lmctl lint <teamfile.lmctl>
|
|
2070
2070
|
`),2;let r=t[0],n;try{n=await L(e,a=>Ae(r,a))}catch(a){return Re(e,`${r}: ${a instanceof Error?a.message:String(a)}`)}let s;try{s=Le(n)}catch(a){return Re(e,`${r}: ${a instanceof Error?a.message:String(a)}`)}let o=Nd(s,Wr(n)),i=Qd(s.members);i.push(...Nl(s.members,Wr(n))),i.push(...KU(s.members,n)),i.push(...YU(s.members,Wr(n))),s.deprecatedConnectLines.length>0&&i.push(MT.replace("%s",s.deprecatedConnectLines.join(", ")));for(let a of o)e.stderr.write(`error: ${a.field}: ${a.message}
|
|
2071
2071
|
`);for(let a of s.members)af([a],e),a.session!==void 0&&a.session.length<Ps&&i.push(`${a.alias}: sessionid is shorter than ${Ps} chars; run lmctl seed to refresh it`);for(let a of i)e.stderr.write(`warning: ${a}
|
|
2072
2072
|
`);return await L(e,a=>{pb(n,a,l=>e.stderr.write(`${l}
|
|
2073
2073
|
`))}),o.length>0?1:(e.stdout.write(`ok
|
|
2074
2074
|
`),0)}async function FT(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(HU),0;if(t.length!==1)return e.stderr.write(`usage: lmctl seed <teamfile.lmctl>
|
|
2075
2075
|
`),2;let r=t[0],n;try{n=await L(e,E=>Ae(r,E))}catch(E){return Re(e,`${r}: ${E instanceof Error?E.message:String(E)}`)}let s;try{s=Ua(n)}catch(E){return Re(e,`${r}: ${E instanceof Error?E.message:String(E)}`)}let o=Wr(n),i;try{i=Le(n)}catch(E){return Re(e,`${r}: ${E instanceof Error?E.message:String(E)}`)}let l=Wa(n,"utf8").split(`
|
|
2076
|
-
`),c=
|
|
2076
|
+
`),c=oW(l),u=zU(i.members,l,c,o),d=Nd(i,o);if(d.length>0){af(i.members,e);for(let E of d)e.stderr.write(`error: ${E.field}: ${E.message}
|
|
2077
2077
|
`);return 1}af(i.members,e);for(let E of Qd(i.members))e.stderr.write(`warning: ${E}
|
|
2078
2078
|
`);for(let E of Nl(i.members,o))e.stderr.write(`warning: ${E}
|
|
2079
|
-
`);let f=await
|
|
2079
|
+
`);let f=await fW(i.skillUrls,o,e);if(f!==0)return f;let m=0,p=i.members.filter(E=>E.teamfile!==void 0?!1:E.session===void 0||E.session.length<Ps);for(let E of p)if(!JT(E.provider))return e.stderr.write(`error: ${E.alias}: invalid provider "${E.provider}"
|
|
2080
2080
|
`),1;let h=i.members.find(E=>E.alias.toLowerCase()==="lead");if(h!==void 0){Kr("lmctl","lmctl_chat",{warn:x=>e.stderr.write(`${x}
|
|
2081
2081
|
`)});let E=h.sessiondir??o,k=Mc(h.provider,E);k.error!==void 0?e.stderr.write(`warning: MCP bridge install failed: ${k.error}
|
|
2082
2082
|
`):k.changed&&e.stdout.write(k.scope==="copilot-user"?`copilot MCP bridge installed in ${k.path}
|
|
@@ -2085,18 +2085,18 @@ List native provider sessions in scope, or list recent managed runs with --runs.
|
|
|
2085
2085
|
`);continue}let k=E.sessiondir??o,x=await DT({provider:E.provider,cwd:k,...E.model!==void 0?{model:E.model}:{},...E.effort!==void 0?{effort:E.effort}:{},...E.alias.toLowerCase()==="lead"?{prompt:nW(n,l.join(`
|
|
2086
2086
|
`),i.members)}:{}});if(x.error!==void 0||x.sessionId===void 0||x.sessionId.length<Ps)return e.stderr.write(`error: ${E.alias}: seed failed${x.error!==void 0?`: ${x.error}`:"; provider did not report a sessionid"}
|
|
2087
2087
|
`),1;let N=c.get(E.alias.toLowerCase());if(N===void 0)return e.stderr.write(`error: ${E.alias}: could not find matching _MEMBER_ line to update
|
|
2088
|
-
`),1;let A=
|
|
2088
|
+
`),1;let A=cW(l[N],"sessionid",x.sessionId);l[N]=A,m+=1,Us(n,l.join(`
|
|
2089
2089
|
`),"utf8"),e.stdout.write(`${E.alias}: seeded ${x.sessionId}
|
|
2090
2090
|
`)}let g=l.join(`
|
|
2091
|
-
`),_=
|
|
2092
|
-
`);let S=new Date().toISOString();return await L(e,E=>{BT(E,{teamfilePath:s,name:i.name,rawText:_,now:S})}),0}async function tW(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(Fa),0;let r=D(t,["--provider","--sessiondir"],[]);if(r.error!==void 0)return tf(e,r.error,Fa);if(r.positionals.length!==2)return tf(e,"expected <teamfile.lmctl> and <alias>",Fa);let[n,s]=r.positionals;if(!
|
|
2091
|
+
`),_=dW(g,Ua(n));(_!==g||u)&&Us(n,_,"utf8"),m===0&&e.stdout.write(`no members needed seeding
|
|
2092
|
+
`);let S=new Date().toISOString();return await L(e,E=>{BT(E,{teamfilePath:s,name:i.name,rawText:_,now:S})}),0}async function tW(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(Fa),0;let r=D(t,["--provider","--sessiondir"],[]);if(r.error!==void 0)return tf(e,r.error,Fa);if(r.positionals.length!==2)return tf(e,"expected <teamfile.lmctl> and <alias>",Fa);let[n,s]=r.positionals;if(!lW(s))return Re(e,`invalid alias "${s}"`);if(s.toLowerCase()==="lead")return Re(e,"hire only applies to non-Lead members");let o=$(r,"--provider");if(o===void 0)return tf(e,"missing value for --provider",Fa);if(!JT(o))return Re(e,`invalid provider "${o}"`);let i;try{i=await L(e,d=>Ae(n,d))}catch(d){return Re(e,`${n}: ${d instanceof Error?d.message:String(d)}`)}let a;try{a=Wa(i,"utf8")}catch(d){return Re(e,`${n}: ${d instanceof Error?d.message:String(d)}`)}if(aW(a,s))return Re(e,`${s}: alias already exists in ${i}`);let l=$(r,"--sessiondir"),c=[`_MEMBER_ alias=${of(s)} provider=${o}`,...l===void 0?[]:[`sessiondir=${of(l)}`]].join(" "),u=uW(a,c);return Us(i,u,"utf8"),e.stdout.write(`Hired ${s} (${o}) -> ${i}
|
|
2093
2093
|
`),e.stdout.write(`Run: lmctl seed ${i}
|
|
2094
2094
|
`),0}async function rW(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(ef),0;let r,n;if(t.length===1){let d=Rs(t[0]);if(d===null)return e.stderr.write(ef),2;r=d.teamfile,n=d.alias}else if(t.length===2)[r,n]=t;else return e.stderr.write(ef),2;let s;try{s=await L(e,d=>Ae(r,d))}catch(d){return Re(e,`${r}: ${d instanceof Error?d.message:String(d)}`)}let o;try{o=Wa(s,"utf8")}catch(d){return Re(e,`${r}: ${d instanceof Error?d.message:String(d)}`)}let i=o.split(`
|
|
2095
|
-
`),a=
|
|
2096
|
-
`),"utf8"),FT([s],e))}function UT(t){return OU("sha256").update(t).digest("hex")}function WT(t,e){return{teamfile_path:e.teamfilePath,name:e.name,raw_text:e.rawText,raw_sha256:UT(e.rawText),registered_at:t?.registered_at??e.now,last_seeded_at:e.now}}function BT(t,e){let r=WT(t.getRootTeam(e.teamfilePath),e);return t.upsertRootTeam(r),r}function nW(t,e,r){let n=r.filter(
|
|
2097
|
-
`):"- (no non-Lead members)";return["lmctl seed initial connection only. Create or pin this provider session, then stop.","Do not inspect files, run commands, infer a task, delegate, edit, or begin work.","",`Teamfile path: ${t}`,"You are alias Lead for this AI-managed .lmctl team.","","
|
|
2098
|
-
`)}function sW(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=Ws(n,"alias");s!==void 0&&e.set(s.toLowerCase(),r)}return e}function
|
|
2099
|
-
`))if(/^\s*#?\s*_MEMBER_\s+\S/u.test(r)&&Ws(r,"alias")===e)return!0;return!1}function
|
|
2095
|
+
`),a=iW(i,n);if(a===void 0)return Re(e,`${n}: no active _MEMBER_ entry found`);let l=i[a];if(Ws(l,"teamfile")!==void 0)return Re(e,`${n}: refresh only applies to provider-backed members, not teamfile= members`);let c=(e.env??process.env)[Bn],u=Ws(l,"sessionid");return c!==void 0&&c.length>0&&u===c?Re(e,`${n}: cannot refresh its own running session \u2014 a meta-Lead or the operator must run this refresh.`):(i[a]=qT(l,"sessionid"),a>0&&/^\s*#CreationTime:/u.test(i[a-1])&&i.splice(a-1,1),Us(s,i.join(`
|
|
2096
|
+
`),"utf8"),FT([s],e))}function UT(t){return OU("sha256").update(t).digest("hex")}function WT(t,e){return{teamfile_path:e.teamfilePath,name:e.name,raw_text:e.rawText,raw_sha256:UT(e.rawText),registered_at:t?.registered_at??e.now,last_seeded_at:e.now}}function BT(t,e){let r=WT(t.getRootTeam(e.teamfilePath),e);return t.upsertRootTeam(r),r}function nW(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(`
|
|
2097
|
+
`):"- (no non-Lead members)",o=r.find(a=>a.alias.toLowerCase()==="lead")?.provider??"",i=sW(o);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.","","Preferred delegation for non-instant work: tracked background submit.",`- Submit: lmctl chat "${t}" <alias> "your task here" --detach`,"- It returns a job id immediately, does not lock your session, and records progress.","- Check work with: lmctl jobs list or lmctl jobs watch <job_id>.","- MCP lmctl_chat is synchronous/blocking; use it only as a quick-ping or backup path.",'- Plain shell "&" is blind backgrounding; it gives no lmctl job id or completion signal.',i,"","Delegation is an ACTION, not a plan: to hand a member a task, submit the job 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 --detach; 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(`
|
|
2098
|
+
`)}function sW(t){switch(t.toLowerCase()){case"claude":return"- Claude tip: run the submit as background Bash (run_in_background: true); the runtime notifies you when it completes.";case"copilot":return'- Copilot tip: run the submit via the bash tool async mode (mode:"async"); the runtime notifies you when it completes.';case"agy":return"- Antigravity tip: run the submit via run_command with WaitMsBeforeAsync (Background Tasks); the runtime notifies you when it completes.";case"qwen":return"- Qwen tip: run the submit via the monitor tool; it streams events and notifies you when it completes.";case"codex":return"- Codex note: no native completion push; submit with --detach, keep working, and pull status with lmctl jobs or lmctl jobs watch <job_id>.";case"gemini":return"- Gemini note: no native completion push; submit with --detach, keep working, and pull status with lmctl jobs or lmctl jobs watch <job_id>.";case"opencode":return"- OpenCode note: shell commands do not have a stable native completion push; submit with --detach and pull status with lmctl jobs or lmctl jobs watch <job_id>.";default:return"- If your provider has native background-shell completion, use it around the submit; otherwise use lmctl jobs to pull status."}}function oW(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=Ws(n,"alias");s!==void 0&&e.set(s.toLowerCase(),r)}return e}function iW(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)&&Ws(s,"alias")?.toLowerCase()===r)return n}}function aW(t,e){for(let r of t.split(`
|
|
2099
|
+
`))if(/^\s*#?\s*_MEMBER_\s+\S/u.test(r)&&Ws(r,"alias")===e)return!0;return!1}function lW(t){return/^[A-Za-z][A-Za-z0-9_-]*$/u.test(t)}function Ws(t,e){let n=new RegExp(`(?:^|\\s)${e}=(?:"([^"]*)"|(\\S*))`).exec(t);return n===null?void 0:n[1]??n[2]??""}function cW(t,e,r){let n=`${e}=${of(r)}`,s=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return s.test(t)?t.replace(s,(o,i)=>`${i}${n}`):`${t.trimEnd()} ${n}`}function qT(t,e){let r=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return t.replace(r,"").replace(/\s+/gu," ").trimEnd()}function of(t){return/[\s"]/u.test(t)?`"${t.replace(/"/g,'\\"')}"`:t}function uW(t,e){let r=t.split(`
|
|
2100
2100
|
`),n=-1;for(let a=r.length-1;a>=0;a-=1)if(/^\s*(?:_MEMBER_|_CONNECT_|_SKILL_)(?:\s|$)/u.test(r[a])){n=a;break}if(n>=0)return r.splice(n+1,0,e),r.join(`
|
|
2101
2101
|
`);let s=r.length;for(;s>0&&r[s-1]==="";)s-=1;let o=r.slice(0,s).join(`
|
|
2102
2102
|
`),i=r.slice(s).join(`
|
|
@@ -2104,17 +2104,17 @@ List native provider sessions in scope, or list recent managed runs with --runs.
|
|
|
2104
2104
|
|
|
2105
2105
|
`:""}${e}${i.length>0?`
|
|
2106
2106
|
${i}`:`
|
|
2107
|
-
`}`}function
|
|
2107
|
+
`}`}function dW(t,e){let r=`#teamfile: ${e}`,n=t.indexOf(`
|
|
2108
2108
|
`),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}
|
|
2109
2109
|
${o}`:`${r}
|
|
2110
2110
|
`:t.length>0?`${r}
|
|
2111
2111
|
${t}`:`${r}
|
|
2112
|
-
`}async function
|
|
2112
|
+
`}async function fW(t,e,r){if(t.length===0)return 0;let n=rf(e,"durable-memory","skills"),s={visitedSkillsets:new Set,leafSources:new Set,warnings:[]},o=[];try{for(let i of t)await HT(i,{kind:"file",baseDir:e},s,o,0)}catch(i){return Re(r,i instanceof Error?i.message:String(i))}for(let i of s.warnings)r.stderr.write(`warning: ${i}
|
|
2113
2113
|
`);for(let i of o){let a=`<!-- lmctl _SKILL_ source: ${i.source} -->
|
|
2114
2114
|
${i.body}${i.body.endsWith(`
|
|
2115
2115
|
`)?"":`
|
|
2116
|
-
`}`;try{Fs.mkdirSync(n,{recursive:!0}),
|
|
2117
|
-
`)}return 0}async function HT(t,e,r,n,s){if(s>Pa)throw new Error(`skill ${t}: _SKILL_ expansion depth exceeded ${Pa}`);let o=await
|
|
2116
|
+
`}`;try{Fs.mkdirSync(n,{recursive:!0}),hW(n,i.name,a)}catch(l){return Re(r,`skill ${i.source}: ${l instanceof Error?l.message:String(l)}`)}r.stdout.write(`skill ${i.name}: wrote durable-memory/skills/${i.name}.md
|
|
2117
|
+
`)}return 0}async function HT(t,e,r,n,s){if(s>Pa)throw new Error(`skill ${t}: _SKILL_ expansion depth exceeded ${Pa}`);let o=await mW(t,e),i=pW(o.text,o.source);if(i.length===0){if(r.leafSources.has(o.id)){r.warnings.push(`skill ${o.source}: already provisioned; skipping duplicate`);return}r.leafSources.add(o.id),n.push({id:o.id,source:o.source,name:cf(o.source),body:o.text});return}if(r.visitedSkillsets.has(o.id)){r.warnings.push(`skillset ${o.source}: already visited; skipping`);return}if(r.visitedSkillsets.add(o.id),s>=Pa)throw new Error(`skill ${o.source}: _SKILL_ expansion depth exceeded ${Pa}`);for(let a of i)await HT(a,o.base,r,n,s+1)}async function mW(t,e){if(e.kind==="https"){if(Gt(t)||!RT(t)){let o=LT(t,e),i;try{i=await br(o,{description:"_SKILL_ URL"})}catch(a){throw new Error(`skill ${o}: ${a instanceof Error?a.message:String(a)}`)}return{kind:"https",id:jn(o),source:jn(o),base:{kind:"https",baseUrl:new URL(".",o).href},text:i.toString("utf8")}}throw new Error(`skill ${t}: remote _SKILL_ members must be https:// URLs or relative URL paths`)}if(Gt(t)){let o=LT(t,e),i;try{i=await br(o,{description:"_SKILL_ URL"})}catch(a){throw new Error(`skill ${o}: ${a instanceof Error?a.message:String(a)}`)}return{kind:"https",id:jn(o),source:jn(o),base:{kind:"https",baseUrl:new URL(".",o).href},text:i.toString("utf8")}}let r=RT(t)?t:lf(e.kind==="file"?e.baseDir:".",t),n,s;try{n=Ua(r),s=Wa(n,"utf8")}catch(o){throw new Error(`skill ${t}: ${o instanceof Error?o.message:String(o)}`)}return{kind:"file",id:n,source:n,base:{kind:"file",baseDir:Wr(n)},text:s}}function LT(t,e){if(Gt(t)){if(!_t(t))throw new Error(`skill ${t}: _SKILL_ URL must use https:// or a local path: ${t}`);return jn(t)}if(e.kind!=="https")throw new Error(`skill ${t}: _SKILL_ URL must use https:// or a local path: ${t}`);let r=new URL(t,e.baseUrl).href;if(!_t(r))throw new Error(`skill ${t}: _SKILL_ URL must use https:// or a local path: ${t}`);return jn(r)}function pW(t,e){let r=[],n=t.split(/\r?\n/u);for(let s=0;s<n.length;s+=1){let o=n[s];if(!/^\s*_SKILL_(?:\s|$)/u.test(o))continue;let i=o.replace(/^\s*_SKILL_\s*/u,"").trim(),a=i.length===0?[]:i.split(/\s+/u);if(a.length!==1)throw new Error(`skill ${e}: line ${s+1}: _SKILL_ requires exactly one https:// URL or local path`);let l=a[0];if(Gt(l)&&!_t(l))throw new Error(`skill ${e}: line ${s+1}: _SKILL_ URL must use https:// or a local path: ${l}`);r.push(l)}return r}function jn(t){return new URL(t).href}function hW(t,e,r){let n=rf(t,`${e}.md`),s=rf(t,`${e}.${process.pid}.${LU().slice(0,8)}.tmp`);try{Fs.writeFileSync(s,r,{encoding:"utf8",flag:"wx"}),Fs.renameSync(s,n)}catch(o){try{Fs.unlinkSync(s)}catch{}throw o}}function _W(t){return cf(t)}function cf(t){let e=_t(t)?new URL(t).pathname:t;e.endsWith("/")&&(e=e.slice(0,-1));let n=(WU(e)||"skill").replace(/\.[^.]*$/u,""),s=n;try{s=decodeURIComponent(n)}catch{s=n}return s.trim().replace(/[^A-Za-z0-9_-]+/gu,"-").replace(/^-+|-+$/gu,"").toLowerCase().slice(0,BU).replace(/-+$/gu,"")||"skill"}function JT(t){return t==="claude"||t==="codex"||t==="gemini"||t==="copilot"||t==="opencode"||t==="qwen"||t==="agy"||t==="ClaudeMock"}function Re(t,e){return t.stderr.write(`error: ${e}
|
|
2118
2118
|
`),1}function tf(t,e,r){return t.stderr.write(`error: ${e}
|
|
2119
2119
|
${r}`),2}function af(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_
|
|
2120
2120
|
`),r.provider==="gemini"&&e.stderr.write(`${CT.replace("%s",r.alias)}
|
|
@@ -2138,32 +2138,32 @@ Refreshing the Lead drops its chat history; it re-reads durable-memory/ on
|
|
|
2138
2138
|
re-seed.
|
|
2139
2139
|
A member cannot refresh its own running session; run the refresh from a
|
|
2140
2140
|
meta-Lead or operator shell outside that sessiondir.
|
|
2141
|
-
`,CT='notice: member "%s" uses provider=gemini \u2014 the Gemini CLI requires an API/enterprise Google account; personal Google subscriptions should use provider=agy (Antigravity).',MT="_CONNECT_ is deprecated and ignored (lines %s) \u2014 cross-team calls now work at runtime with automatic cycle protection; you can delete these lines.",nf={mkdirSync:DU,writeFileSync:Us,renameSync:PU,unlinkSync:UU},sf={existsSync:MU,statSync:FU,accessSync:CU},DT=async t=>{let{seed:e}=await Promise.resolve().then(()=>(
|
|
2142
|
-
`),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=GT(r);if(!uf(c))throw new Error(`source not found: ${r}`);let d=KT(c).isDirectory()?
|
|
2143
|
-
`),1}let i=GT(n),a=
|
|
2144
|
-
`),1;let l
|
|
2141
|
+
`,CT='notice: member "%s" uses provider=gemini \u2014 the Gemini CLI requires an API/enterprise Google account; personal Google subscriptions should use provider=agy (Antigravity).',MT="_CONNECT_ is deprecated and ignored (lines %s) \u2014 cross-team calls now work at runtime with automatic cycle protection; you can delete these lines.",nf={mkdirSync:DU,writeFileSync:Us,renameSync:PU,unlinkSync:UU},sf={existsSync:MU,statSync:FU,accessSync:CU},DT=async t=>{let{seed:e}=await Promise.resolve().then(()=>(yt(),ic)),r=await e(t);return r.success?{sessionId:r.sessionId}:{error:r.error??"provider seed failed"}},Fs=nf,Ur=sf});var YT={};le(YT,{runClone:()=>kW});import{existsSync as uf,mkdirSync as gW,readFileSync as wW,readdirSync as yW,statSync as KT,writeFileSync as EW}from"node:fs";import{basename as XT,dirname as bW,extname as TW,join as VT,resolve as GT}from"node:path";async function kW(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(SW),0;if(t.length!==2)return e.stderr.write(`usage: lmctl clone <source> <dest>
|
|
2142
|
+
`),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=GT(r);if(!uf(c))throw new Error(`source not found: ${r}`);let d=KT(c).isDirectory()?vW(c):c;s=wW(d,"utf8"),o=d}}catch(c){return e.stderr.write(`error: ${c instanceof Error?c.message:String(c)}
|
|
2143
|
+
`),1}let i=GT(n),a=IW(i,o,n);if(uf(a))return e.stderr.write(`error: ${a} already exists.
|
|
2144
|
+
`),1;let l=$W(NW(s));return gW(bW(a),{recursive:!0}),EW(a,l,"utf8"),e.stdout.write(`Cloned ${r} -> ${a}
|
|
2145
2145
|
`),e.stdout.write(`Edit ${a}; only _MEMBER_ lines are parsed, everything else is free-form.
|
|
2146
2146
|
`),e.stdout.write(`After editing, run: lmctl lint ${a}
|
|
2147
2147
|
`),e.stdout.write(`Then run: lmctl seed ${a}
|
|
2148
|
-
`),0}function
|
|
2148
|
+
`),0}function vW(t){let e=yW(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 VT(t,e[0])}function IW(t,e,r){if(r.endsWith("/")||uf(t)&&KT(t).isDirectory()){let n=XT(e).endsWith(".lmctl")?XT(e):"team.lmctl";return VT(t,n)}return TW(t)?t:`${t}.lmctl`}function NW(t){return t.split(`
|
|
2149
2149
|
`).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(`
|
|
2150
|
-
`)}function
|
|
2150
|
+
`)}function $W(t){return t.split(`
|
|
2151
2151
|
`).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(`
|
|
2152
|
-
`)}var
|
|
2152
|
+
`)}var SW,zT=b(()=>{"use strict";SW=`usage: lmctl clone <source> <dest>
|
|
2153
2153
|
|
|
2154
2154
|
Copy a teamfile and strip its session ids, producing a static editable template.
|
|
2155
2155
|
|
|
2156
2156
|
Examples:
|
|
2157
2157
|
lmctl clone ./backend/backend.lmctl ./backend-v2/backend-v2.lmctl
|
|
2158
|
-
`});var eS={};le(eS,{runPlan:()=>
|
|
2158
|
+
`});var eS={};le(eS,{runPlan:()=>CW});import{existsSync as xW,mkdirSync as jW,writeFileSync as AW}from"node:fs";import{basename as ZT,extname as QT,join as RW,resolve as OW}from"node:path";async function CW(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(LW),0;let r=D(t,["--team","--provider"],[]);if(r.error!==void 0)return e.stderr.write(`error: ${r.error}
|
|
2159
2159
|
`),e.stderr.write(`usage: lmctl plan [options] <directory>
|
|
2160
2160
|
`),2;if(r.positionals.length!==1)return e.stderr.write(`usage: lmctl plan [options] <directory>
|
|
2161
|
-
`),2;let n=
|
|
2162
|
-
`),1):(
|
|
2161
|
+
`),2;let n=OW(r.positionals[0]);jW(n,{recursive:!0});let s=$(r,"--team")??ZT(n),o=$(r,"--provider")??"claude",i=RW(n,MW(s));return xW(i)?(e.stderr.write(`error: ${i} already exists.
|
|
2162
|
+
`),1):(AW(i,PW({teamName:DW(s),workdir:n,teamfilePath:i,leadProvider:o}),"utf8"),e.stdout.write(`Created ${i}
|
|
2163
2163
|
`),e.stdout.write(`Edit ${i}; only _MEMBER_ lines are parsed, everything else is free-form.
|
|
2164
2164
|
`),e.stdout.write(`After editing, run: lmctl lint ${i}
|
|
2165
2165
|
`),e.stdout.write(`Then run: lmctl seed ${i}
|
|
2166
|
-
`),0)}function
|
|
2166
|
+
`),0)}function MW(t){return QT(t)?t:`${t}.lmctl`}function DW(t){let e=QT(t);return e?ZT(t,e):t}function PW(t){let{teamName:e,teamfilePath:r,leadProvider:n}=t;return`# ${e}
|
|
2167
2167
|
|
|
2168
2168
|
# Lead, you take tasks from the operator. Clarify only when needed,
|
|
2169
2169
|
# then first use lmctl_chat to ping each of your members with a one-line
|
|
@@ -2172,6 +2172,10 @@ Examples:
|
|
|
2172
2172
|
# How to delegate to a member (two equivalent ways - the CLI never needs a tool search):
|
|
2173
2173
|
# MCP tool: lmctl_chat(team="${r}", alias="Coder", prompt="your task")
|
|
2174
2174
|
# CLI shell: lmctl chat "${r}" Coder "your task"
|
|
2175
|
+
# Preferred for non-instant work (non-blocking + tracked):
|
|
2176
|
+
# lmctl chat "${r}" Coder "your task" --detach
|
|
2177
|
+
# lmctl jobs watch <job_id>
|
|
2178
|
+
# Use lmctl jobs to list/check background delegations; use lmctl_chat only as a synchronous backup.
|
|
2175
2179
|
# Warmup/connectivity check first: lmctl chat "${r}" Coder "reply OK"
|
|
2176
2180
|
# If the lmctl_chat tool isn't immediately available in your session, just use the CLI form.
|
|
2177
2181
|
# delegate implementation to Coder, and send completed work to
|
|
@@ -2203,7 +2207,7 @@ context, so knowledge is shared across agents and survives fresh sessions: a
|
|
|
2203
2207
|
refreshed or swapped-in agent loses its chat history but NOT what's written
|
|
2204
2208
|
here. When a task is done, record durable project knowledge in durable-memory/
|
|
2205
2209
|
and keep durable-memory/index.md current so any agent can get up to speed fast.
|
|
2206
|
-
`}var
|
|
2210
|
+
`}var LW,tS=b(()=>{"use strict";Se();LW=`usage: lmctl plan [options] <directory>
|
|
2207
2211
|
|
|
2208
2212
|
Generate a starter lmctl team document template for a directory.
|
|
2209
2213
|
|
|
@@ -2218,7 +2222,7 @@ Examples:
|
|
|
2218
2222
|
|
|
2219
2223
|
# Same shape, codex for the Lead and Reviewer2
|
|
2220
2224
|
lmctl plan ./backend --provider codex
|
|
2221
|
-
`});var sS={};le(sS,{SIZE_WARN_EST_TOKENS:()=>Hs,estimateTokens:()=>nS,runTerminal:()=>
|
|
2225
|
+
`});var sS={};le(sS,{SIZE_WARN_EST_TOKENS:()=>Hs,estimateTokens:()=>nS,runTerminal:()=>BW});import{spawn as FW}from"node:child_process";import{statSync as UW}from"node:fs";async function BW(t,e){if(t.includes("--help")||t.includes("-h"))return GW(e);let r=D(t,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(r.error!==void 0)return w(e,r.error);let n=$(r,"--run");if(n!==void 0){let s=Number.parseInt(n,10);if(!Number.isFinite(s)||s<=0||String(s)!==n)return w(e,`invalid --run "${n}" (expected a positive integer run id)`);if(r.positionals.length>0)return w(e,"--run is mutually exclusive with positional <teamfile>[:alias]");let o=["--team","--project","--size","--json"];for(let i of o)if(i==="--size"||i==="--json"?M(r,i):$(r,i)!==void 0)return w(e,`--run is mutually exclusive with ${i}`);try{return await L(e,async i=>{let a=$(r,"--alias"),l=uy(i,s,a);return"err"in l?w(e,l.err):df(e,{provider:l.ok.provider,sessionid:l.ok.sessionid,sessiondir:l.ok.sessiondir})})}catch(i){return me(e,i)}}if(r.positionals.length>0){let s=["--team","--project","--size","--alias","--json"];for(let l of s)if(l==="--size"||l==="--json"?M(r,l):$(r,l)!==void 0)return w(e,`positional <teamfile>[:alias] is mutually exclusive with ${l} (alias is the SECOND POSITIONAL: \`terminal <teamfile> <alias>\`).`);if(r.positionals.length>2)return w(e,`too many positionals (${r.positionals.length}); expected <teamfile>[:alias] [alias]`);let o=r.positionals[0],i=r.positionals[1],a=mr(WW,{target:o,alias:i,flags:{}});return a.mode==="error"?w(e,a.message):a.mode!=="ai-team"?w(e,`internal: terminal positional yielded unexpected mode "${a.mode}"`):a.alias===void 0?w(e,"terminal: alias required for the teamfile target"):await L(e,l=>qW(e,a.teamfile,a.alias,l))}try{return await L(e,async s=>{let o=HW(e,s,r);if(typeof o=="number")return o;let i=$(r,"--alias");return M(r,"--size")?XW(e,s,o,i,M(r,"--json")):JW(e,s,o,i)})}catch(s){return me(e,s)}}async function qW(t,e,r,n){let s;try{s=vt(e,r,n)}catch(o){return o instanceof ge?w(t,o.message):me(t,o)}ai(t,s.isLead,s.alias,s.provider,s.sessiondir);try{li(t,Le(s.teamfile),s.teamfile)}catch{}return df(t,{provider:s.provider,sessionid:s.sessionid,sessiondir:s.sessiondir,isLead:s.isLead})}async function df(t,e){let{provider:r,sessionid:n,sessiondir:s}=e;if(!Zo(r))return w(t,`no resume incantation for provider "${r}"`);if(!Sh.test(n))return w(t,"refusing to resume: malformed sessionid");let o=$c(r,n,{isLead:e.isLead});if(o===null||o.length===0)return w(t,`no resume incantation for provider "${r}"`);let[i,...a]=o;return await new Promise(l=>{let c=FW(i,a,{stdio:"inherit",cwd:s,env:ze(process.env,n)});c.on("error",u=>{l(w(t,`failed to launch ${i}: ${u.message}`))}),c.on("exit",u=>l(u??0))})}function HW(t,e,r){let n=$(r,"--team");if(n!==void 0){let i=e.findTeamByName(n);return i===null?w(t,`team not found: ${n}`):i}let s=mi(t,e,$(r,"--project"));return typeof s=="number"?s:pi(t,e,s,void 0)}async function JW(t,e,r,n){let s=hi(t,e,r,n);if(typeof s=="number")return s;let o=s.sessionid;return o===null||o.trim().length===0?w(t,`member ${s.alias} has no session yet \u2014 run \`lmctl team seed ${r.name}\` first`):df(t,{provider:$e(s),sessionid:o,sessiondir:s.sessiondir})}function nS(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=UW(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 XW(t,e,r,n,s){let o;if(n!==void 0){let a=e.findTeamMemberByAlias(r.id,n);if(a===null||a.state==="retired")return w(t,`member not found: ${n}`);o=[a]}else o=e.listTeamMembers(r.id).filter(a=>a.state!=="retired"&&a.sessionid!==null);let i=[];for(let a of o){let l=a.sessionid;if(l===null)continue;let c=$e(a),u=null;Zo(c)&&(u=await jr(l,c));let d=nS(u),f=d.est>Hs;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?sn(c,l):null})}if(s)return B(t,{estimate:!0,legend:rS,guide_tokens:Hs,members:i}),0;t.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
|
|
2222
2226
|
`),t.stdout.write(`${rS}
|
|
2223
2227
|
`);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)
|
|
2224
2228
|
`),a.over_guide&&t.stdout.write(` \u26A0 ${a.alias}: estimated ~${a.est_tokens} tokens \u2014 ESTIMATE only, exceeds the 200K guide.
|
|
@@ -2226,7 +2230,7 @@ Examples:
|
|
|
2226
2230
|
session yourself:
|
|
2227
2231
|
${a.resume_incantation??"(no resume incantation for provider "+a.provider+")"}
|
|
2228
2232
|
(or: lmctl terminal --team ${r.name} --alias ${a.alias})
|
|
2229
|
-
`)}return 0}function
|
|
2233
|
+
`)}return 0}function GW(t){return t.stdout.write(`usage: lmctl terminal <teamfile>:<alias>
|
|
2230
2234
|
lmctl terminal <teamfile> <alias>
|
|
2231
2235
|
lmctl terminal --run <id> [--alias A]
|
|
2232
2236
|
lmctl terminal [--project P] [--team T] [--alias A] [--size] [--json]
|
|
@@ -2257,85 +2261,85 @@ Examples:
|
|
|
2257
2261
|
tokens it surfaces the resume incantation so YOU can
|
|
2258
2262
|
open & self-compact. Nothing is ever changed
|
|
2259
2263
|
automatically; ${Hs} is a guide, not a gate.
|
|
2260
|
-
`),0}var
|
|
2264
|
+
`),0}var WW,Hs,rS,oS=b(()=>{"use strict";Ue();on();Se();Jc();Pr();Ht();At();as();aa();WW={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},Hs=2e5,rS="est = rough local heuristic (~4 chars/token), NOT an exact provider token count \u2014 open the session to verify before acting."});import{resolve as ff,dirname as cS}from"node:path";function mf(t,e){let r=ff(t);for(;;){let n=KW(e,r);if(n!==null)return n;let s=cS(r);if(s===r)return null;r=s}}function KW(t,e){return t.db.prepare("SELECT * FROM project WHERE local_path = ? LIMIT 1").get(e)??null}function Ba(){return process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0}function qa(){return process.env.LMCTL_WORKSPACE!==void 0&&process.env.LMCTL_WORKSPACE.length>0}function pf(t){if(t.io.dal!==void 0){let o=iS(t.io.dal,t.cwd,t.projectName);if(o===null)throw new st(aS(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(Ba()||qa()){let o=ue(),i=pe({path:o}),a=iS(i,t.cwd,t.projectName);if(a===null)throw i.close(),new st(aS(t.projectName));return{dal:i,ownsDal:!0,dbPath:o,workspaceName:qa()?process.env.LMCTL_WORKSPACE??null:null,project:a,matchedLocalPath:t.projectName===void 0?a.local_path:null,resolverMode:Ba()?"explicit-db":"explicit-workspace"}}let e=t.projectName===void 0?dS(t.cwd):VW(t.projectName),r=fS(e,t.projectName===void 0?"cwd":"project"),n=pe({path:r.candidate.db_path}),s=n.getProject(r.project.id);if(s===null)throw n.close(),new st(`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 uS(t){if(t.io.dal!==void 0)return{dal:t.io.dal,ownsDal:!1,dbPath:":injected:",workspaceName:null,resolverMode:"injected"};if(Ba()||qa()){let n=ue();return{dal:pe({path:n}),ownsDal:!0,dbPath:n,workspaceName:qa()?process.env.LMCTL_WORKSPACE??null:null,resolverMode:Ba()?"explicit-db":"explicit-workspace"}}let e;try{e=dS(t.cwd)}catch{throw new st("job ids are workspace-local and cwd does not resolve to a workspace DB; use --workspace <name> or --db <path>")}let r=fS(e,"job-cwd");return{dal:pe({path:r.candidate.db_path}),ownsDal:!0,dbPath:r.candidate.db_path,workspaceName:r.candidate.workspace_name,resolverMode:"cwd-scan"}}function iS(t,e,r){return r!==void 0?t.findProjectByName(r):mf(e,t)}function aS(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 VW(t){let e=[];for(let r of za())for(let n of mS(r))n.name===t&&e.push({candidate:r,project:n,matched_local_path:null,match_depth:0});if(e.length===0)throw new st(`project not found in any workspace DB: ${t}`);return e}function dS(t){let e=YW(t),r=new Map;e.forEach((s,o)=>{r.set(s,e.length-o)});let n=[];for(let s of za())for(let o of mS(s)){let i=ff(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 st("no lmctl project found for cwd in workspace DBs; pass --workspace and --project");return n}function fS(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 st(`job ids are workspace-local and cwd resolves ambiguously; use --workspace <name> or --db <path>
|
|
2261
2265
|
${lS(n)}`):new st(`ambiguous lmctl ${e} match; use --workspace <name> --project <name>
|
|
2262
2266
|
${lS(n)}`)}function lS(t){return t.map(e=>` workspace ${e.candidate.workspace_name??"(legacy)"} project ${e.project.name} ${e.project.local_path}`).join(`
|
|
2263
|
-
`)}function
|
|
2264
|
-
`),0;let r=D(t,["--workflow","--project","--inputs","--job"],["--json","--verbose","--yes","--no-prompt"]);if(r.error!==void 0)return hr(e,r.error);if(r.positionals.length>1)return hr(e,Ha);let n=M(r,"--json"),s=$(r,"--workflow"),o=$(r,"--project"),i=$(r,"--job"),a=$(r,"--inputs"),l=M(r,"--verbose"),c=r.positionals[0],u=M(r,"--yes")||M(r,"--no-prompt");if(c!==void 0){if(s!==void 0||i!==void 0)return hr(e,"remote workflow URL cannot be combined with --workflow or --job");if(!Gt(c))return hr(e,Ha);if(nr(c))return pS(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u});let m=Pn(c,"remote workflow URLs");return m!==null?
|
|
2265
|
-
`),2}function
|
|
2267
|
+
`)}function YW(t){let e=[],r=ff(t);for(;;){e.push(r);let n=cS(r);if(n===r)return e;r=n}}function mS(t){let e=null;try{e=new Qs(t.db_path,{readonly:!0,fileMustExist:!0});let r=Number(e.pragma("user_version",{simple:!0})??0);if(!Number.isInteger(r)||r<=0||r>fl)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 st,hf=b(()=>{"use strict";dl();pl();Ue();Ye();st=class extends Error{constructor(e){super(e),this.name="CliContextError"}}});var bf={};le(bf,{assertNoCrossWorkflowSubflowCycle:()=>ES,firstUnregisteredArchetype:()=>Ef,runWorkflow:()=>uB});import{createHash as wf,randomUUID as zW}from"node:crypto";import{existsSync as ZW,readFileSync as Xa,readdirSync as QW,writeFileSync as eB}from"node:fs";import{basename as tB,join as rB,resolve as nB}from"node:path";import{pathToFileURL as sB}from"node:url";function yf(t,e){return{source_uri:sB(nB(t)).href,source_sha256:wf("sha256").update(e).digest("hex")}}function _S(t){return wf("sha256").update(t).digest("hex")}async function lB(t){let e=await br(t,{description:"remote workflow URL"});return{definition:e.toString("utf8"),source_uri:t,source_sha256:_S(e),remote:!0}}async function Ja(t){if(nr(t)){let n=await ss(t),s=Xa(n,"utf8");return{definition:s,source_uri:t,source_sha256:_S(s),remote:!1}}let e=Pn(t,"remote workflow URLs");if(e!==null)throw new Error(e);if(_t(t))return lB(t);let r=Xa(t,"utf8");return{definition:r,...yf(t,r),remote:!1}}function gS(t){return De(t.definition)}function wS(t){if(t.definition_schema_version!==3)return null;let e=Ef(t);return e!==null?`unknown archetype \`${e.type}\` (step \`${e.id}\`) \u2014 not in the live archetype registry`:null}function cB(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 uB(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(aB),0;try{return r==="run"?await dB(n,e):await L(e,s=>{switch(r){case"load":return hB(n,e,s);case"author":return _B(n,e,s);case"list":return gB(n,e,s);case"sync":return wB(n,e,s);case"export":return yB(n,e,s);default:return w(e,"usage: lmctl workflow <load|author|list|sync|export|run>")}})}catch(s){return s instanceof st?w(e,s.message):me(e,s)}}async function dB(t,e){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(`${Ha}
|
|
2268
|
+
`),0;let r=D(t,["--workflow","--project","--inputs","--job"],["--json","--verbose","--yes","--no-prompt"]);if(r.error!==void 0)return hr(e,r.error);if(r.positionals.length>1)return hr(e,Ha);let n=M(r,"--json"),s=$(r,"--workflow"),o=$(r,"--project"),i=$(r,"--job"),a=$(r,"--inputs"),l=M(r,"--verbose"),c=r.positionals[0],u=M(r,"--yes")||M(r,"--no-prompt");if(c!==void 0){if(s!==void 0||i!==void 0)return hr(e,"remote workflow URL cannot be combined with --workflow or --job");if(!Gt(c))return hr(e,Ha);if(nr(c))return pS(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u});let m=Pn(c,"remote workflow URLs");return m!==null?w(e,m):pS(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u})}if(s!==void 0&&i!==void 0)return hr(e,"--workflow and --job are mutually exclusive");if(s===void 0&&i===void 0)return hr(e,Ha);if(i!==void 0&&(o!==void 0||a!==void 0))return hr(e,"--job cannot be combined with --project or --inputs");if(i!==void 0){let m=fB(i);if(m===null)return hr(e,`invalid --job: ${i}`);let p=uS({cwd:process.cwd(),io:e});try{let h=await Ts({dal:p.dal,job_id:m,worker_id:_f()});return gf(e,h,{json:n,workflowName:null,projectName:null,workspaceName:p.workspaceName,dbPath:p.dbPath,verbose:l})}finally{p.ownsDal&&p.dal.close()}}let d=yS(a,e);if(d===Ga)return 2;let f=pf({cwd:process.cwd(),io:e,projectName:o});try{let m=f.dal.getWorkflowByName(s);if(m===null)return w(e,`workflow not found: ${s}`);let p=f.dal.enqueueJob({project_id:f.project.id,workflow_id_override:m.id,source:"cli-workflow-run",payload:JSON.stringify(d),priority:0}),h=await Ts({dal:f.dal,job_id:p.id,worker_id:_f()});return gf(e,h,{json:n,workflowName:s,projectName:f.project.name,workspaceName:f.workspaceName,dbPath:f.dbPath,verbose:l})}finally{f.ownsDal&&f.dal.close()}}async function pS(t,e){let{io:r,json:n,projectName:s,inputsValue:o,verbose:i,yes:a}=e,l=yS(o,r);if(l===Ga)return 2;let c,u;try{c=await Ja(t),u=gS(c)}catch(m){return w(r,m instanceof Error?m.message:String(m))}let d=wS(u);if(d!==null)return w(r,d);if(c.remote&&!await mB(r,c,u,a))return 1;let f=pf({cwd:process.cwd(),io:r,projectName:s});try{let m=f.dal.upsertWorkflow({name:u.name,definition_schema_version:u.definition_schema_version,definition:c.definition,source_uri:c.source_uri,source_sha256:c.source_sha256}),p=f.dal.enqueueJob({project_id:f.project.id,workflow_id_override:m.id,source:"cli-workflow-run",payload:JSON.stringify(l),priority:0}),h=await Ts({dal:f.dal,job_id:p.id,worker_id:_f()});return gf(r,h,{json:n,workflowName:m.name,projectName:f.project.name,workspaceName:f.workspaceName,dbPath:f.dbPath,verbose:i})}finally{f.ownsDal&&f.dal.close()}}function hr(t,e){return t.stderr.write(`error: ${e}
|
|
2269
|
+
`),2}function yS(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)}
|
|
2266
2270
|
`),Ga}return r===null||typeof r!="object"||Array.isArray(r)?(e.stderr.write(`error: --inputs must be a JSON object
|
|
2267
|
-
`),Ga):r}function
|
|
2271
|
+
`),Ga):r}function fB(t){if(!/^[1-9][0-9]*$/.test(t))return null;let e=Number(t);return Number.isSafeInteger(e)?e:null}function _f(){return`cli-${process.pid}-${zW().slice(0,8)}`}function gf(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?B(t,s):t.stderr.write(`error: job ${e.job_id} not claimable: ${e.reason}${e.locked_by?` (locked_by=${e.locked_by})`:""}
|
|
2268
2272
|
`),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?B(t,n):e.status==="paused"?t.stdout.write(`workflow paused job=${e.job_id} run=${e.run_id}
|
|
2269
2273
|
`):e.status==="failed"?t.stderr.write(`workflow failed job=${e.job_id}
|
|
2270
2274
|
`):(t.stdout.write(`workflow completed job=${e.job_id} run=${e.run_id} terminal_state=${e.terminal_state??"null"}
|
|
2271
2275
|
`),e.terminal_state!==null&&e.terminal_state!=="done"&&e.terminal_state!=="success"&&t.stderr.write(`warning: workflow terminal_state=${e.terminal_state}
|
|
2272
|
-
`)),e.status==="failed"?1:0}async function
|
|
2276
|
+
`)),e.status==="failed"?1:0}async function mB(t,e,r,n){let s=cB(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(`
|
|
2273
2277
|
`)+`
|
|
2274
|
-
`),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
|
|
2275
|
-
`),a}function
|
|
2278
|
+
`),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 pB(o),a=/^(y|yes)$/i.test(i.trim());return a||t.stderr.write(`aborted remote workflow run
|
|
2279
|
+
`),a}function pB(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 hB(t,e,r){let[n,s]=t;if(n===void 0||s===void 0)return w(e,"usage: workflow load <name> <path-to-json | lmctl://workflow/<name> | https://...>");let o;if(nr(s))try{o=await Ja(s)}catch(c){return w(e,c instanceof Error?c.message:String(c))}else if(_t(s))try{o=await Ja(s)}catch(c){return w(e,c instanceof Error?c.message:String(c))}else{let c=Pn(s,"remote workflow URLs");if(c!==null)return w(e,c);o=await Ja(s)}let i;try{i=gS(o)}catch(c){if(o.remote)return w(e,c instanceof Error?c.message:String(c));throw c}let a=o.remote?wS(i):null;if(a!==null)return w(e,a);let l=r.upsertWorkflow({name:n,definition_schema_version:i.definition_schema_version,definition:o.definition,source_uri:o.source_uri,source_sha256:o.source_sha256});return e.stdout.write(`loaded workflow ${l.name}@${l.version}
|
|
2276
2280
|
`),o.remote&&e.stdout.write(`source: ${o.source_uri}
|
|
2277
2281
|
sha256: ${o.source_sha256}
|
|
2278
|
-
`),0}function Ef(t){let e=Wi();for(let r of t.steps)if(e.get(r.type)===void 0)return{id:r.id,type:r.type};return null}function hS(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 ES(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
|
|
2279
|
-
`),0}function
|
|
2282
|
+
`),0}function Ef(t){let e=Wi();for(let r of t.steps)if(e.get(r.type)===void 0)return{id:r.id,type:r.type};return null}function hS(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 ES(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 _B(t,e,r){let n=process.env.LMCTL_DSL;if(n!==void 0&&["0","false","off"].includes(n.trim().toLowerCase()))return w(e,"workflow author is disabled by the LMCTL_DSL kill-switch (unset it to use the GA DSL path; durable-memory/composition-language-design.md \xA710)");let[s,o]=t;if(s===void 0)return w(e,"usage: lmctl workflow author <file.dsl> [name]");let i=Xa(s,"utf8"),a;try{a=De(i)}catch(m){return w(e,`compile failed: ${m instanceof Error?m.message:String(m)}`)}if(a.definition_schema_version!==3)return me(e,new Error("composition DSL must compile to a v3 graph workflow"));let l=a,c=Ef(l);if(c!==null)return w(e,`unknown archetype \`${c.type}\` (step \`${c.id}\`) \u2014 not in the live archetype registry`);let u=o??l.name,d=JSON.stringify(l);try{ES(u,hS(l),m=>{let p=r.getWorkflowByName(m);if(p===null)return null;try{return hS(JSON.parse(p.definition))}catch{return null}})}catch(m){return w(e,`${m instanceof Error?m.message:String(m)}`)}let f;try{f=r.upsertWorkflow({name:u,definition_schema_version:3,definition:d,...yf(s,i)})}catch(m){return w(e,`${m instanceof Error?m.message:String(m)}`)}return r.insertCompositionUnit({name:u,version:f.version,lang:"lmctl/dsl@1",source:i,source_sha:wf("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)
|
|
2283
|
+
`),0}function gB(t,e,r){let n=D(t,[]);if(n.error!==void 0)return w(e,n.error);let s=r.listWorkflows();return M(n,"--json")?B(e,s):e.stdout.write(`${s.map(o=>`${o.name}@${o.version}`).join(`
|
|
2280
2284
|
`)}${s.length>0?`
|
|
2281
|
-
`:""}`),0}function
|
|
2282
|
-
`),0}function yB(t,e,r){let n=D(t,["--out"]);if(n.error!==void 0)return
|
|
2283
|
-
`,c=$(n,"--out");return c!==void 0?(
|
|
2284
|
-
`)):e.stdout.write(l),0}var
|
|
2285
|
+
`:""}`),0}function wB(t,e,r){let n=D(t,[]);if(n.error!==void 0)return w(e,n.error);ni({swallow:!0});let s=$h(),o=[];try{o=ZW(s)?QW(s).filter(c=>oB.some(u=>c.endsWith(u))):[]}catch{o=[]}let i=0,a=0,l=0;for(let c of[...o].sort()){let u=rB(s,c),d=Xa(u,"utf8"),f;try{f=De(d)}catch(x){return w(e,`compile failed for ${c}: ${x instanceof Error?x.message:String(x)}`)}let m=f.name,p=typeof m=="string"&&m.length>0?m:tB(c).replace(/\.(compound\.json|lmctl)$/i,""),h=c.endsWith(".lmctl"),g=h?JSON.stringify(f):d,_=h?3:f.definition_schema_version,S=yf(u,d),E=r.getWorkflowByName(p);if(E!==null&&E.source_sha256===S.source_sha256){l+=1;continue}let k=E===null;r.upsertWorkflow({name:p,definition_schema_version:_,definition:g,...S}),k?i+=1:a+=1}return M(n,"--json")?B(e,{total:o.length,created:i,updated:a,unchanged:l}):e.stdout.write(`synced ${o.length} template(s): ${i} created, ${a} updated, ${l} unchanged
|
|
2286
|
+
`),0}function yB(t,e,r){let n=D(t,["--out"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: lmctl workflow export <name> [--out <file>] [--json]");let o=r.getWorkflowByName(s);if(o===null)return w(e,`workflow not found: ${s}`);let i;try{i=JSON.parse(o.definition)}catch{i=o.definition}let a={_lmctl_export:iB,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)}
|
|
2287
|
+
`,c=$(n,"--out");return c!==void 0?(eB(c,l),e.stdout.write(`exported ${o.name}@${o.version} \u2192 ${c} (inspection-only; NOT re-importable)
|
|
2288
|
+
`)):e.stdout.write(l),0}var oB,iB,aB,Ha,Ga,Tf=b(()=>{"use strict";ju();hn();oi();Oc();Se();hf();Zs();Ss();oB=[".compound.json",".lmctl"],iB="INSPECTION ONLY \u2014 NOT a re-importable workflow source. Edit the basedir template then `lmctl workflow sync`; do NOT `workflow load` this file.",aB=`usage: lmctl workflow <load|author|list|sync|export|run>
|
|
2285
2289
|
|
|
2286
2290
|
Load, author, list, synchronize, inspect, or run workflow definitions. The
|
|
2287
2291
|
load subcommand accepts local JSON, lmctl:// workflow URIs, and https:// JSON
|
|
2288
2292
|
URLs. The run subcommand executes a loaded workflow/job, or one-shot runs a
|
|
2289
2293
|
remote https:// workflow after a trust prompt.
|
|
2290
|
-
`,Ha="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]";Ga=Symbol("inputs-error")});function Sf(t,e){let r=
|
|
2291
|
-
`)}return 0}function
|
|
2292
|
-
`),0}function
|
|
2294
|
+
`,Ha="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]";Ga=Symbol("inputs-error")});function Sf(t,e){let r=EB[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 EB,bS=b(()=>{"use strict";EB={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"},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 $S={};le($S,{initWorkspace:()=>IS,runWorkspace:()=>NB,setWorkspaceProvider:()=>NS});import{copyFileSync as bB,cpSync as TB,existsSync as Fe,mkdirSync as _r,readdirSync as vf,renameSync as SB,rmSync as Ka,statSync as Va,writeFileSync as kB}from"node:fs";import{spawnSync as vB}from"node:child_process";import{homedir as TS}from"node:os";import{dirname as If,join as Js}from"node:path";async function NB(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(IB),0;switch(r){case"list":return $B(n,e);case"create":return xB(n,e);case"use":return jB(n,e);case"show":return AB(n,e);case"delete":return RB(n,e);case"migrate":return OB(n,e);case"init":return IS(n,e);case"set-provider":return NS(n,e);default:return w(e,"usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>")}}function kS(){let t=Gs(),e=[],r=new Set,n=yr.default,s=Fe(On()),o=Fe($t(n));if((s||o||t===null||t===n)&&(e.push({name:n,db_path:o?Jt(n):On(),active:t===null||t===n,legacy:!o&&s}),r.add(n)),Fe(wr())){let i;try{i=vf(wr())}catch{i=[]}for(let a of i.sort()){if(r.has(a)||!He(a))continue;let l=!1;try{l=Va($t(a)).isDirectory()}catch{l=!1}l&&(e.push({name:a,db_path:Jt(a),active:t===a,legacy:!1}),r.add(a))}}return e}function $B(t,e){let r=D(t,[]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length!==0)return w(e,"usage: lmctl workspace list");let n=kS();if(M(r,"--json"))return B(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}
|
|
2295
|
+
`)}return 0}function xB(t,e){let r=D(t,["--docroot"]);if(r.error!==void 0)return w(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return w(e,"usage: lmctl workspace create <name> [--docroot PATH]");if(!He(n))return w(e,`invalid workspace name: ${n} (allowed: letters, digits, '.', '-', '_'; must start with alnum; \u226464 chars)`);let s=$t(n);if(Fe(s))return w(e,`workspace already exists: ${n} (${s})`);let o=$(r,"--docroot")??Za(n);_r(s,{recursive:!0}),_r(o,{recursive:!0});let i=Jt(n);_r(If(i),{recursive:!0});let a=pe({path:i});try{a.setConfig("project.docroot",o)}finally{a.close()}let l={name:n,dir:s,db_path:i,docroot:o};return M(r,"--json")?B(e,l):e.stdout.write(`created workspace ${n} at ${s}
|
|
2296
|
+
`),0}function jB(t,e){let r=D(t,[]);if(r.error!==void 0)return w(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return w(e,"usage: lmctl workspace use <name>");if(!He(n))return w(e,`invalid workspace name: ${n}`);if(n!==yr.default&&!Fe($t(n)))return w(e,`workspace not found: ${n} (run \`lmctl workspace create ${n}\` first)`);let s=Xs();return _r(If(s),{recursive:!0}),kB(s,`${n}
|
|
2293
2297
|
`),M(r,"--json")?B(e,{active:n,path:s}):e.stdout.write(`active workspace set to ${n}
|
|
2294
|
-
`),0}function
|
|
2295
|
-
`),0}function
|
|
2296
|
-
`),0):
|
|
2297
|
-
`),Va(t).isDirectory()?
|
|
2298
|
+
`),0}function AB(t,e){let r=D(t,[]);if(r.error!==void 0)return w(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return w(e,"usage: lmctl workspace show <name>");if(!He(n))return w(e,`invalid workspace name: ${n}`);let s=kS().find(u=>u.name===n);if(s===void 0)return w(e,`workspace not found: ${n}`);let o=0;try{o=Fe(s.db_path)?Va(s.db_path).size:0}catch{o=0}let i=0,a=null,l={};if(Fe(s.db_path)){let u=pe({path:s.db_path});try{i=u.listProjects().length,l=u.getConfigAll(),a=l["project.docroot"]??null}finally{u.close()}}let c={name:s.name,active:s.active,legacy:s.legacy,db_path:s.db_path,db_size_bytes:o,docroot:a,project_count:i,config_keys:Object.keys(l).sort()};return M(r,"--json")?B(e,c):e.stdout.write(`${JSON.stringify(c,null,2)}
|
|
2299
|
+
`),0}function RB(t,e){let r=D(t,[],["--json","--confirm","--force"]);if(r.error!==void 0)return w(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return w(e,"usage: lmctl workspace delete <name> --confirm [--force]");if(!He(n))return w(e,`invalid workspace name: ${n}`);if(!M(r,"--confirm"))return w(e,`refusing to delete workspace ${n} without --confirm`);if(n===yr.default&&!M(r,"--force"))return w(e,"refusing to delete the default workspace without --force");if(Gs()===n&&!M(r,"--force"))return w(e,`refusing to delete the active workspace (${n}) without --force`);let o=$t(n);return Fe(o)?(Ka(o,{recursive:!0,force:!0}),M(r,"--json")?B(e,{deleted:n,dir:o}):e.stdout.write(`deleted workspace ${n}
|
|
2300
|
+
`),0):w(e,`workspace not found: ${n}`)}function kf(t,e,r){try{SB(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
|
|
2301
|
+
`),Va(t).isDirectory()?TB(t,e,{recursive:!0}):bB(t,e),!Fe(e))throw new Error(`migration copy verification failed: ${e} not present after copy`);Ka(t,{recursive:!0,force:!0})}function OB(t,e){let r=D(t,[],["--json"]);if(r.error!==void 0)return w(e,r.error);let n=M(r,"--json"),s=Qa(),o=wr(),i=[],a=(f,m)=>{if(n)B(e,{migrated:f,reason:m??null,actions:i});else{for(let p of i)e.stdout.write(`${p}
|
|
2298
2302
|
`);e.stdout.write(f?`migration complete
|
|
2299
2303
|
`:`${m??"nothing to migrate"}
|
|
2300
|
-
`)}return 0};if(!Fe(s))return a(!1,"no legacy ~/.lmctl/profiles/ found; nothing to migrate");let l;try{l=vf(s).sort()}catch{l=[]}let c=l.filter(f=>{try{return Va(Js(s,f)).isDirectory()}catch{return!1}});if(c.length===0)Ka(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`);else if(!Fe(o))kf(s,o,e),i.push(`renamed ${s} -> ${o}`);else{let f=c.filter(m=>Fe(Js(o,m)));if(f.length>0)return
|
|
2304
|
+
`)}return 0};if(!Fe(s))return a(!1,"no legacy ~/.lmctl/profiles/ found; nothing to migrate");let l;try{l=vf(s).sort()}catch{l=[]}let c=l.filter(f=>{try{return Va(Js(s,f)).isDirectory()}catch{return!1}});if(c.length===0)Ka(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`);else if(!Fe(o))kf(s,o,e),i.push(`renamed ${s} -> ${o}`);else{let f=c.filter(m=>Fe(Js(o,m)));if(f.length>0)return w(e,`refusing to migrate: ~/.lmctl/workspaces/ already has: ${f.join(", ")} (no files were moved; resolve the name collision, then re-run \`lmctl workspace migrate\`)`);_r(o,{recursive:!0});for(let m of c)kf(Js(s,m),Js(o,m),e),i.push(`moved ${m} -> workspaces/${m}`);try{vf(s).length===0&&(Ka(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`))}catch{}}let u=Wf(),d=Xs();return Fe(u)&&(Fe(d)?i.push("left active-profile in place (active-workspace already exists; not clobbering)"):(kf(u,d,e),i.push("renamed active-profile -> active-workspace"))),a(!0)}function vS(t,e){return vB(t,e,{encoding:"utf8",timeout:5e3,maxBuffer:1024*1024})}function MB(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 SS(t){return t==="~"?TS():t.startsWith("~/")?Js(TS(),t.slice(2)):t}async function IS(t,e,r={}){let n="usage: lmctl workspace init [--name N] [--basedir DIR] [--provider1 P] [--provider2 P] [--provider3 P]";if(t.includes("--help")||t.includes("-h"))return e.stdout.write([n,"","Creates ~/.lmctl/workspaces/<name>/ with its own state.db and the","provider1/2/3 -> concrete mapping (lmctl_config workspace.provider{1,2,3}).",`Missing options are asked one at a time. Scanned providers: ${An.join(", ")}.`].join(`
|
|
2301
2305
|
`)+`
|
|
2302
|
-
`),0;let s=D(t,["--name","--basedir","--provider1","--provider2","--provider3"]);if(s.error!==void 0)return
|
|
2303
|
-
`),2;let l=r.isTty??!!process.stdin.isTTY,c=r.promptLine??
|
|
2306
|
+
`),0;let s=D(t,["--name","--basedir","--provider1","--provider2","--provider3"]);if(s.error!==void 0)return w(e,s.error);if(s.positionals.length!==0)return w(e,n);let o=r.spawn??vS,a=An.map(N=>Sf(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 ${An.join("|")} first
|
|
2307
|
+
`),2;let l=r.isTty??!!process.stdin.isTTY,c=r.promptLine??MB,u=r.promptLine!==void 0||l,d=N=>(e.stderr.write(`error: ${N} is required in non-interactive mode (no TTY); pass it explicitly
|
|
2304
2308
|
`),2),f,m=$(s,"--name");if(m!==void 0){if(!He(m))return e.stderr.write(`error: invalid workspace name: ${m}
|
|
2305
2309
|
`),2;f=m}else{if(!u)return d("--name");for(;;){let N=(await c("Workspace name [default]: ")).trim(),A=N.length===0?"default":N;if(He(A)){f=A;break}e.stderr.write(`invalid workspace name: ${A} (letters/digits/.-_, start alnum, \u226464)
|
|
2306
2310
|
`)}}let p=$t(f);if(Fe(p))return e.stderr.write(`error: workspace already exists: ${f} (${p}) \u2014 refusing to overwrite
|
|
2307
|
-
`),2;let h,g=$(s,"--basedir"),_=Za(f);if(g!==void 0)h=SS(g);else{if(!u)return d("--basedir");let N=(await c(`Base directory for this workspace's projects [${_}]: `)).trim();h=N.length===0?_:SS(N)}let S={};for(let N of["provider1","provider2","provider3"]){let A=$(s,`--${N}`),U=
|
|
2308
|
-
`),2;S[N]=A;continue}if(!u)return d(`--${N}`);for(;;){let J=(await c(`${N} (${
|
|
2311
|
+
`),2;let h,g=$(s,"--basedir"),_=Za(f);if(g!==void 0)h=SS(g);else{if(!u)return d("--basedir");let N=(await c(`Base directory for this workspace's projects [${_}]: `)).trim();h=N.length===0?_:SS(N)}let S={};for(let N of["provider1","provider2","provider3"]){let A=$(s,`--${N}`),U=LB[N],F=a.includes(U)?U:a[0];if(A!==void 0){if(!a.includes(A))return e.stderr.write(`error: --${N} ${A} is not an available provider (available: ${a.join(", ")})
|
|
2312
|
+
`),2;S[N]=A;continue}if(!u)return d(`--${N}`);for(;;){let J=(await c(`${N} (${CB[N]}) [${F}]: `)).trim(),R=J.length===0?F:J;if(a.includes(R)){S[N]=R;break}e.stderr.write(`not an available provider: ${R} (available: ${a.join(", ")})
|
|
2309
2313
|
`)}}_r(p,{recursive:!0}),_r(h,{recursive:!0});let E=Jt(f);_r(If(E),{recursive:!0});let k=pe({path:E});try{k.setConfig("project.docroot",h),k.setConfig("workspace.provider1",S.provider1),k.setConfig("workspace.provider2",S.provider2),k.setConfig("workspace.provider3",S.provider3)}finally{k.close()}let x={name:f,dir:p,db_path:E,basedir:h,providers:{...S}};return M(s,"--json")?B(e,x):(e.stdout.write(`created workspace ${f} at ${p}
|
|
2310
2314
|
`),e.stdout.write(` basedir: ${h}
|
|
2311
2315
|
`),e.stdout.write(` provider1=${S.provider1} provider2=${S.provider2} provider3=${S.provider3}
|
|
2312
2316
|
`),e.stdout.write(`activate it with: lmctl workspace use ${f}
|
|
2313
2317
|
`)),0}async function NS(t,e,r={}){let n="usage: lmctl [--workspace W] workspace set-provider <provider1|provider2|provider3> <concrete>";if(t.includes("--help")||t.includes("-h"))return e.stdout.write([n,"","Remaps an abstract provider slot for the selected workspace. The next","`team seed` resolves that slot to the new concrete; already-seeded",`members keep their frozen provider_resolved. Scanned providers: ${An.join(", ")}.`].join(`
|
|
2314
2318
|
`)+`
|
|
2315
|
-
`),0;let s=D(t,[]);if(s.error!==void 0)return
|
|
2319
|
+
`),0;let s=D(t,[]);if(s.error!==void 0)return w(e,s.error);let[o,i,...a]=s.positionals;if(o===void 0||i===void 0||a.length!==0)return w(e,n);let l=/^provider[123]$/.test(o)?o:/^[123]$/.test(o)?`provider${o}`:null;if(l===null)return e.stderr.write(`error: invalid slot: ${o} (expected provider1, provider2, or provider3)
|
|
2316
2320
|
`),2;let c=r.spawn??vS,u=An.map(p=>Sf(p,c)).filter(p=>p.status==="ok"||p.status==="unverified").map(p=>p.provider);if(u.length===0)return e.stderr.write(`error: no provider CLI found on PATH; install/auth ${An.join("|")} first
|
|
2317
2321
|
`),2;if(!u.includes(i))return e.stderr.write(`error: ${i} is not an available provider (available: ${u.join(", ")})
|
|
2318
|
-
`),2;let d=e.dal===void 0,f=e.dal??pe({path:ue()});try{f.setConfig(`workspace.${l}`,i)}finally{d&&f.close()}let m=Ln()??
|
|
2319
|
-
`),0}var
|
|
2322
|
+
`),2;let d=e.dal===void 0,f=e.dal??pe({path:ue()});try{f.setConfig(`workspace.${l}`,i)}finally{d&&f.close()}let m=Ln()??yr.default;return e.stdout.write(`workspace.${l} = ${i} (workspace: ${m})
|
|
2323
|
+
`),0}var IB,An,LB,CB,xS=b(()=>{"use strict";Ue();bS();Se();Ye();IB=`usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>
|
|
2320
2324
|
|
|
2321
2325
|
Manage isolated workspace state directories, active workspace selection,
|
|
2322
2326
|
legacy profile migration, and configured provider slots.
|
|
2323
|
-
`;An=["claude","codex","gemini","qwen"],
|
|
2324
|
-
`),0}function
|
|
2327
|
+
`;An=["claude","codex","gemini","qwen"],LB={provider1:"claude",provider2:"codex",provider3:"gemini"},CB={provider1:"primary implementer",provider2:"independent reviewer",provider3:"auxiliary / tie-break"}});var RS={};le(RS,{runProject:()=>UB});import{existsSync as DB,statSync as PB}from"node:fs";import{join as AS}from"node:path";async function UB(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(FB),0;try{return await L(e,s=>{switch(r){case"create":return VB(n,e,s);case"list":return YB(n,e,s);case"show":return GB(n,e,s);case"status":return KB(n,e,s);case"workflow":return WB(n,e,s);default:return w(e,"usage: lmctl project <create|list|show|status|workflow>")}})}catch(s){return me(e,s)}}function WB(t,e,r){let[n,...s]=t;switch(n){case"add":return BB(s,e,r);case"list":return qB(s,e,r);case"show":return HB(s,e,r);case"remove":return JB(s,e,r);case"enable":return jS(s,e,r,!0);case"disable":return jS(s,e,r,!1);default:return w(e,"usage: lmctl project workflow <add|list|show|remove|enable|disable>")}}function BB(t,e,r){let n=D(t,["--condition","--params","--priority"]);if(n.error!==void 0)return w(e,n.error);let[s,o]=n.positionals;if(s===void 0||o===void 0||n.positionals.length!==2)return w(e,"usage: project workflow add <project> <workflow> [--condition JEXL] [--params JSON] [--priority N]");let i=r.findProjectByName(s);if(i===null)return w(e,`project not found: ${s}`);let a=r.getWorkflowByName(o);if(a===null)return w(e,`workflow not found: ${o}`);let l=$(n,"--condition")??null;if(l!==null)try{ir(l)}catch{return w(e,"invalid --condition JEXL")}let c=XB($(n,"--params"));if(typeof c=="string")return w(e,c);let u=$(n,"--priority"),d=u===void 0?100:Number(u);if(!Number.isInteger(d))return w(e,`invalid --priority: ${u??""}`);let f=r.insertProjectWorkflow({project_id:i.id,workflow_id:a.id,condition:l,parameters_override:c?.json??null,priority:d});return M(n,"--json")?B(e,f):e.stdout.write(`added project workflow ${f.id}
|
|
2328
|
+
`),0}function qB(t,e,r){let n=D(t,[]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0||n.positionals.length!==1)return w(e,"usage: project workflow list <project>");let o=r.findProjectByName(s);if(o===null)return w(e,`project not found: ${s}`);let i=r.listProjectWorkflows(o.id);return M(n,"--json")?B(e,i):e.stdout.write(`${i.map(a=>`${a.id} ${a.workflow_id} ${a.priority} ${a.enabled} ${a.condition??""}`).join(`
|
|
2325
2329
|
`)}${i.length>0?`
|
|
2326
|
-
`:""}`),0}function
|
|
2327
|
-
`),0)}function
|
|
2328
|
-
`),0):
|
|
2329
|
-
`),0)}function
|
|
2330
|
-
`),0}function
|
|
2331
|
-
`),0}function
|
|
2332
|
-
`),0}function
|
|
2330
|
+
`:""}`),0}function HB(t,e,r){let n=D(t,[]);if(n.error!==void 0)return w(e,n.error);let s=Nf(n.positionals[0]);if(typeof s=="string"||n.positionals.length!==1)return w(e,"usage: project workflow show <id>");let o=r.getProjectWorkflow(s);return o===null?w(e,`project workflow not found: ${s}`):(M(n,"--json")?B(e,o):e.stdout.write(`${JSON.stringify(o,null,2)}
|
|
2331
|
+
`),0)}function JB(t,e,r){let n=D(t,[]);if(n.error!==void 0)return w(e,n.error);let s=Nf(n.positionals[0]);return typeof s=="string"||n.positionals.length!==1?w(e,"usage: project workflow remove <id>"):r.removeProjectWorkflow(s)?(e.stdout.write(`removed project workflow ${s}
|
|
2332
|
+
`),0):w(e,`project workflow not found: ${s}`)}function jS(t,e,r,n){let s=D(t,[]);if(s.error!==void 0)return w(e,s.error);let o=Nf(s.positionals[0]),i=n?"enable":"disable";if(typeof o=="string"||s.positionals.length!==1)return w(e,`usage: project workflow ${i} <id>`);let a=r.setProjectWorkflowEnabled(o,n);return a===null?w(e,`project workflow not found: ${o}`):(M(s,"--json")?B(e,a):e.stdout.write(`${n?"enabled":"disabled"} project workflow ${o}
|
|
2333
|
+
`),0)}function XB(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 Nf(t){return t===void 0||!/^\d+$/.test(t)||Number(t)<=0?"invalid id":Number(t)}function GB(t,e,r){let n=D(t,[]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: project show <name>");let o=r.findProjectByName(s);if(o===null)return w(e,`project not found: ${s}`);let i=o.name.indexOf("/"),a=i>0?o.name.slice(0,i):null,l=i>0?o.name.slice(i+1):o.name,c={...o,owner:a,repo:l};return M(n,"--json")?B(e,c):e.stdout.write(`${JSON.stringify(c,null,2)}
|
|
2334
|
+
`),0}function KB(t,e,r){let n=D(t,[]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: project status <name>");let o=r.findProjectByName(s);if(o===null)return w(e,`project not found: ${s}`);let i={project:o.name,workflow_name:o.workflow_name};return M(n,"--json")?B(e,i):e.stdout.write(`${JSON.stringify(i,null,2)}
|
|
2335
|
+
`),0}function VB(t,e,r){let n=D(t,["--local-path","--workflow","--team","--default-branch","--owner","--repo","--test-argv","--durable-memory-mode"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals,o=$(n,"--owner"),i=$(n,"--repo"),a=o!==void 0&&i!==void 0?`${o}/${i}`:s;if(a===void 0)return w(e,`usage: project create <name> --local-path P --workflow W --team T [--default-branch B] [--test-argv '["go","test","./..."]'] OR project create --owner OWNER --repo REPO ...`);let l=r.getConfig("project.docroot"),c=a.indexOf("/"),u=c>0?a.slice(c+1):a,d=$(n,"--local-path")??(l!==null?AS(l,u):void 0),f=$(n,"--workflow"),m=$(n,"--team");if(d===void 0||f===void 0||m===void 0)return w(e,"project create requires --local-path (or `api config set project.docroot`), --workflow, and --team");if(r.getWorkflowByName(f)===null)return w(e,`workflow not found: ${f}`);let p=r.findTeamByName(m);if(p===null)return w(e,`team not found: ${m}`);let h=$(n,"--test-argv"),g=null;if(h!==void 0)try{let k=JSON.parse(h);if(!Array.isArray(k)||!k.every(x=>typeof x=="string")||k.length===0)return w(e,`--test-argv must be a non-empty JSON array of strings (e.g. '["go","test","./..."]')`);g=JSON.stringify(k)}catch{return w(e,"--test-argv must be valid JSON")}let _=$(n,"--durable-memory-mode");if(_!==void 0&&_!=="folder"&&_!=="db")return w(e,'--durable-memory-mode must be "folder" or "db"');let S=_!==void 0?_:zB(d)||ts(d)?"folder":"db",E=r.insertProject({name:a,local_path:d,workflow_name:f,team_id:p.id,default_branch:$(n,"--default-branch")??null,test_argv:g,durable_memory_mode:S});return M(n,"--json")?B(e,E):e.stdout.write(`created project ${E.name}
|
|
2336
|
+
`),0}function YB(t,e,r){let n=D(t,[]);if(n.error!==void 0)return w(e,n.error);let s=r.listProjects();return M(n,"--json")?B(e,s):e.stdout.write(`${s.map(o=>`${o.id} ${o.name} ${o.workflow_name}`).join(`
|
|
2333
2337
|
`)}${s.length>0?`
|
|
2334
|
-
`:""}`),0}function
|
|
2338
|
+
`:""}`),0}function zB(t){try{let e=AS(t,"durable-memory");return DB(e)&&PB(e).isDirectory()}catch{return!1}}var FB,OS=b(()=>{"use strict";Se();dn();rs();FB=`usage: lmctl project <create|list|show|status|workflow>
|
|
2335
2339
|
|
|
2336
2340
|
Create, list, inspect, and check projects. The workflow subcommand manages
|
|
2337
2341
|
per-project workflow bindings and routing conditions.
|
|
2338
|
-
`});import{createHash as
|
|
2342
|
+
`});import{createHash as ZB,randomBytes as QB}from"node:crypto";import{readFile as e2}from"node:fs/promises";function LS(t=new Date,e=QB(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 t2(t){return ZB("sha256").update(t).digest("hex")}async function CS(t){return(await Promise.all(t.map(async({bundlePath:r,absPath:n})=>{let s=await e2(n);return{path:r,sha256:t2(s),size:s.byteLength}}))).sort((r,n)=>r.path<n.path?-1:r.path>n.path?1:0)}function MS(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 $f=b(()=>{"use strict"});import{spawnSync as DS}from"node:child_process";import{mkdir as xf,writeFile as PS,readFile as r2,rm as FS}from"node:fs/promises";import{tmpdir as n2}from"node:os";import{dirname as US,join as jf}from"node:path";async function WS(t){let e=t.stagingDir??jf(n2(),`lmctl-diag-${t.ticketId}`),r=jf(e,`diagnostic-${t.ticketId}`);await xf(r,{recursive:!0});let n=[],s=async(d,f)=>{let m=jf(r,d);if(await xf(US(m),{recursive:!0}),typeof f=="string")await PS(m,f);else{let p=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);await PS(m,new Uint8Array(p))}n.push({bundlePath:d,absPath:m})},o=d=>`${JSON.stringify(d,null,2)}
|
|
2339
2343
|
`;if(t.data.serve!==void 0){let d=t.data.serve,f=d.pid===null?`no daemon (source=${d.pid_source})
|
|
2340
2344
|
`:`${d.pid}
|
|
2341
2345
|
# source=${d.pid_source} alive=${String(d.pid_alive)}
|
|
@@ -2353,31 +2357,31 @@ per-project workflow bindings and routing conditions.
|
|
|
2353
2357
|
`:`# source=${f}
|
|
2354
2358
|
# tail_lines=${d.tail_lines}
|
|
2355
2359
|
`;await s("intents/recent.log",`${m}${d.tail}${d.tail.length>0?`
|
|
2356
|
-
`:""}`)}if(await s("README.md",
|
|
2357
|
-
`)}var BS=b(()=>{"use strict";$f();Ks()});import{spawnSync as
|
|
2360
|
+
`:""}`)}if(await s("README.md",s2(t)),t.sanitized)for(let d of n){let f=await r2(d.absPath);try{Xf(d.bundlePath,f.toString("utf8"))}catch(m){throw await FS(e,{recursive:!0,force:!0}),m instanceof Er,m}}let i=await CS(n),a=MS({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 xf(US(t.outputPath),{recursive:!0});let l=DS("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=DS("stat",["-c","%s",t.outputPath],{encoding:"utf8"}),u=Number.parseInt((c.stdout??"0").trim(),10)||0;return await FS(e,{recursive:!0,force:!0}),{outputPath:t.outputPath,manifest:a,bundleSizeBytes:u}}function s2(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(`
|
|
2361
|
+
`)}var BS=b(()=>{"use strict";$f();Ks()});import{spawnSync as o2}from"node:child_process";import{stat as i2}from"node:fs/promises";async function qS(t){try{if(!(await i2(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 a2(t);case"hq":return l2(t)}}function a2(t){let r=o2("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 l2(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 HS=b(()=>{"use strict"});var XS={};le(XS,{parseDiagnoseArgs:()=>JS,runDiagnose:()=>d2});import{tmpdir as c2}from"node:os";import{join as u2}from"node:path";async function d2(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${p2()}
|
|
2358
2362
|
`),0;let r=JS(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
2359
2363
|
`),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)
|
|
2360
2364
|
`),2;if(r.upload&&r.internalS3)return e.stderr.write(`error: pick one of --upload (HQ) or --internal-s3, not both
|
|
2361
|
-
`),2;let n=LS(),s=r.outputPath??
|
|
2365
|
+
`),2;let n=LS(),s=r.outputPath??m2(n),o=r.internalS3?"internal-s3":r.upload?"hq":"local";try{return await L(e,async i=>{let a=await Kf({dal:i,include:r.include,dbPath:ue(),intentLog:process.env.LMCTL_INTENT_LOG}),l;try{l=await WS({ticketId:n,data:a,outputPath:s,lmctlNextVersion:it(),sanitized:!r.noSanitize})}catch(d){if(d instanceof Er)return e.stderr.write(`sanitization failed: ${d.message}
|
|
2362
2366
|
`),2;throw d}let c=await qS({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)}
|
|
2363
2367
|
`):(e.stdout.write(`ticket: ${n}
|
|
2364
2368
|
`),e.stdout.write(`bundle: ${l.outputPath} (${l.bundleSizeBytes} bytes, ${l.manifest.files.length} files)
|
|
2365
2369
|
`),e.stdout.write(`upload[${c.mode}]: ${c.ok?"ok":"noop"} \u2014 ${c.message}
|
|
2366
2370
|
`)),c.ok||o==="local"?0:1})}catch(i){return e.stderr.write(`diagnose failed: ${i instanceof Error?i.message:String(i)}
|
|
2367
|
-
`),1}}function JS(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(!
|
|
2368
|
-
`)}var GS=b(()=>{"use strict";Dn();BS();$f();Ks();HS();Ye();Se()});var QS={};le(QS,{ATTENTION_STATES:()=>Of,DAEMON_INTERVAL_FAST_MS:()=>Rf,REQUIRED_TEAM_ALIASES:()=>KS,chooseDiagnoses:()=>zS,collectEvidence:()=>YS,diagnose:()=>VS,renderReport:()=>ZS,runDiagnosePrompt:()=>
|
|
2371
|
+
`),1}}function JS(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(!f2(o))return`unknown section: ${o} (expected one of ${Vs.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 f2(t){return Vs.includes(t)}function m2(t){return u2(c2(),`lmctl-diag-${t}.tar.gz`)}function p2(){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(`
|
|
2372
|
+
`)}var GS=b(()=>{"use strict";Dn();BS();$f();Ks();HS();Ye();Se()});var QS={};le(QS,{ATTENTION_STATES:()=>Of,DAEMON_INTERVAL_FAST_MS:()=>Rf,REQUIRED_TEAM_ALIASES:()=>KS,chooseDiagnoses:()=>zS,collectEvidence:()=>YS,diagnose:()=>VS,renderReport:()=>ZS,runDiagnosePrompt:()=>g2});function VS(t,e){let r=YS(t,e),n=zS(r);return ZS(r,n)}function YS(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:vs(),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=_2(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=KS.filter(a=>!i.has(a))}catch{n.team.sectionAvailable=!1}return n.daemon.workerPid=null,n.daemon.lastTickAt=null,n}function zS(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>Rf&&e.push({cause:`Daemon poll interval is ${t.daemon.intervalMs}ms (${Math.round(t.daemon.intervalMs/1e3)}s); WT/dev expected <=${Rf}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=>Of.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 ZS(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: ${h2(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=>Of.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(`
|
|
2369
2373
|
`)+`
|
|
2370
|
-
`}function
|
|
2374
|
+
`}function h2(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 _2(t){let e=t.replace(/\s+/g," ").trim();return e.length<=80?e:`${e.slice(0,80)}...`}async function g2(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${Af()}
|
|
2371
2375
|
`),0;let r=[];for(let s of t){if(s.startsWith("--"))return e.stderr.write(`error: unknown flag: ${s}
|
|
2372
2376
|
`),e.stderr.write(`${Af()}
|
|
2373
2377
|
`),2;r.push(s)}if(r.length!==1)return e.stderr.write(`error: expected exactly one positional arg: <prompt_id>
|
|
2374
2378
|
`),e.stderr.write(`${Af()}
|
|
2375
2379
|
`),2;let n=r[0];try{return await L(e,s=>(e.stdout.write(VS(s,n)),0))}catch(s){return e.stderr.write(`diagnose-prompt failed: ${s instanceof Error?s.message:String(s)}
|
|
2376
2380
|
`),1}}function Af(){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(`
|
|
2377
|
-
`)}var KS,Rf,Of,ek=b(()=>{"use strict";sd();Se();KS=["Coder","Reviewer1","Polisher"],Rf=3e4,Of=new Set(["attention_needed","paused","escalation"])});var sk={};le(sk,{appendIntent:()=>nk,resolveIntentLogPath:()=>rk,runStatus:()=>
|
|
2378
|
-
`)}catch{}}async function
|
|
2381
|
+
`)}var KS,Rf,Of,ek=b(()=>{"use strict";sd();Se();KS=["Coder","Reviewer1","Polisher"],Rf=3e4,Of=new Set(["attention_needed","paused","escalation"])});var sk={};le(sk,{appendIntent:()=>nk,resolveIntentLogPath:()=>rk,runStatus:()=>I2});import{appendFileSync as w2,mkdirSync as y2}from"node:fs";import{homedir as E2}from"node:os";import{dirname as b2,join as T2}from"node:path";function rk(){return process.env.LMCTL_INTENT_LOG??T2(E2(),".lmctl","recent-intents.log")}function nk(t){try{let e=rk();y2(b2(e),{recursive:!0});let r=JSON.stringify({ts:t.ts??new Date().toISOString(),cwd:t.cwd??process.cwd(),verb:t.verb,args:[...t.args]});w2(e,`${r}
|
|
2382
|
+
`)}catch{}}async function I2(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(v2),0;let r=D(t,["--project"],["--web","--json"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,`unknown argument: ${r.positionals[0]}`);let n=M(r,"--web"),s=$(r,"--project"),o=M(r,"--json");return n&&s!==void 0?w(e,"--web and --project are mutually exclusive"):L(e,i=>{let a=N2(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.
|
|
2379
2383
|
`),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.
|
|
2380
|
-
`),1;if(a.kind==="project-not-found")return
|
|
2384
|
+
`),1;if(a.kind==="project-not-found")return w(e,`project not found: ${a.name}`);let l=a.project,c=$2(i,l,a.source);return o?B(e,c):e.stdout.write(O2(c)),nk({verb:"status",args:t}),0})}function N2(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=mf(e.cwd,t);return r===null?{kind:"no-cwd-match"}:{kind:"ok",project:r,source:"cwd"}}function $2(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=x2(t,e.id,k2),a=j2(t,e.id),l=A2(t,e.id,S2);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:R2(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 x2(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 j2(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 A2(t,e,r){return t.db.prepare(`
|
|
2381
2385
|
SELECT r.*, w.name AS workflow_name
|
|
2382
2386
|
FROM run r
|
|
2383
2387
|
JOIN job j ON j.id = r.job_id
|
|
@@ -2385,13 +2389,13 @@ per-project workflow bindings and routing conditions.
|
|
|
2385
2389
|
WHERE j.project_id = ?
|
|
2386
2390
|
ORDER BY r.id DESC
|
|
2387
2391
|
LIMIT ?
|
|
2388
|
-
`).all(e,r)}function
|
|
2389
|
-
`)}var
|
|
2392
|
+
`).all(e,r)}function R2(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 tk(o,100)}}}catch{}return tk(t,100)}function tk(t,e){return t.length<=e?t:`${t.slice(0,e-1)}\u2026`}function O2(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(`
|
|
2393
|
+
`)}var S2,k2,v2,ok=b(()=>{"use strict";Se();hf();S2=5,k2=10,v2=`usage: lmctl status [--project NAME|--web] [--json]
|
|
2390
2394
|
|
|
2391
2395
|
Show the current project context, active run, unacked attentions, and recent
|
|
2392
2396
|
runs. Defaults to resolving the project from the current working directory;
|
|
2393
2397
|
--project selects a project by name, and --web uses the web UI focus.
|
|
2394
|
-
`});Ye();Dn();Ne();import{pathToFileURL as
|
|
2398
|
+
`});Ye();Dn();Ne();import{pathToFileURL as L2}from"node:url";Zs();Dn();import{mkdirSync as Zk,readFileSync as Qk,renameSync as ev,writeFileSync as tv}from"node:fs";import{homedir as rv}from"node:os";import{dirname as nv,join as sv}from"node:path";var ov="https://registry.npmjs.org/@lmctl-ai/lmctl/latest",iv=60*60*1e3,av=1500;function lv(){let t=process.env.HOME??rv();return sv(t,".lmctl",".update-check.json")}function cv(t){return t.isTTY===!0}function uv(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 ol(t,e){return!!(process.env.LMCTL_NO_UPDATE_NOTIFIER==="1"||!cv(e.stderr)||t.includes("--json")||t.includes("--from")||t.includes("--help")||t.includes("-h")||t[0]==="help"||t[0]==="mcp")}function dv(t,e){try{let r=JSON.parse(Qk(t,"utf8"));if(typeof r.checkedAt=="number"&&Number.isFinite(r.checkedAt)&&typeof r.latest=="string"&&e-r.checkedAt<iv)return r.latest}catch{}return null}function fv(t,e){Zk(nv(t),{recursive:!0});let r=`${t}.tmp-${process.pid}-${Math.random().toString(16).slice(2)}`;tv(r,`${JSON.stringify(e)}
|
|
2395
2399
|
`,"utf8"),ev(r,t)}async function mv(){let t=await br(ov,{description:"lmctl npm metadata",timeoutMs:av}),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 rm(t,e=[],r={}){try{if(ol(e,t))return;let n=r.now?.()??Date.now(),s=r.cachePath??lv();if(dv(s,n)!==null)return;let i=await(r.fetchLatest??mv)();try{fv(s,{checkedAt:n,latest:i})}catch{return}let a=r.currentVersion?.()??it();uv(i,a)>0&&t.stderr.write(`update available: ${a} \u2192 ${i} run: npm i -g @lmctl-ai/lmctl@latest
|
|
2396
2400
|
`)}catch{}}var Mf=`usage: lmctl [--db PATH] [--workspace NAME] [--debug] <command> [args]
|
|
2397
2401
|
`,Lf=`${Mf}
|
|
@@ -2444,10 +2448,10 @@ Run 'lmctl help <command>' for command-specific help.
|
|
|
2444
2448
|
${Mf}Run 'lmctl help' for usage.
|
|
2445
2449
|
`),2}function lk(t,e){return t.stderr.write(`error: unknown command: ${e}
|
|
2446
2450
|
${Mf}Run 'lmctl help' for usage.
|
|
2447
|
-
`),1}async function
|
|
2451
|
+
`),1}async function C2(t,e={stdout:process.stdout,stderr:process.stderr}){let r=Qf();try{return await M2(t,e)}finally{em(r)}}async function M2(t,e={stdout:process.stdout,stderr:process.stderr}){let r=[];for(let i=0;i<t.length;i+=1){let a=t[i];if(a==="--db"){let l=t[++i];if(l===void 0||l.startsWith("--"))return Cf(e,"missing value for --db");process.env.LMCTL_DB=l;continue}if(a==="--workspace"){let l=t[++i];if(l===void 0||l.startsWith("--"))return Cf(e,"missing value for --workspace");if(!He(l))return Cf(e,`invalid workspace name: ${l}`);process.env.LMCTL_WORKSPACE=l;continue}if(a==="--debug"){Zf();continue}r.push(a)}let n=r[0];if(n==="--version"||n==="-v"||n==="-V")return e.stdout.write(`lmctl ${it()}
|
|
2448
2452
|
`),0;if(n==="--help"||n==="-h"||n===void 0)return e.stdout.write(Lf),0;if(n==="help"){let[i,...a]=r.slice(1);return i===void 0||i==="--help"||i==="-h"?(e.stdout.write(Lf),0):ik.has(i)?ak(i,[...a,"--help"],e):lk(e,i)}Uf(ue(),e.stderr),Bf(e.stderr);let[s,...o]=r;if(s===void 0)return e.stdout.write(Lf),0;sl()&&e.stderr.write(`[debug] lmctl ${it()} | node ${process.version} | cmd ${s} ${o.join(" ")}
|
|
2449
2453
|
[debug] cwd ${process.cwd()} | db ${ue()}${process.env.LMCTL_WORKSPACE?` | workspace ${process.env.LMCTL_WORKSPACE}`:""}
|
|
2450
|
-
`);try{let i=await ak(s,o,e);return ik.has(s)&&!ol(r,e)&&await rm(e,r),i}catch(i){return
|
|
2454
|
+
`);try{let i=await ak(s,o,e);return ik.has(s)&&!ol(r,e)&&await rm(e,r),i}catch(i){return D2(i,s,o,e)}}function D2(t,e,r,n){let s=t instanceof Error?t:new Error(String(t));if(!sl())return n.stderr.write(`error: ${s.message}
|
|
2451
2455
|
`),n.stderr.write(`(re-run with --debug for the full stack trace and context)
|
|
2452
2456
|
`),1;n.stderr.write(`error: ${s.message}
|
|
2453
2457
|
`),n.stderr.write(` command: lmctl ${e} ${r.join(" ")}
|
|
@@ -2455,10 +2459,10 @@ ${Mf}Run 'lmctl help' for usage.
|
|
|
2455
2459
|
`),s.stack&&n.stderr.write(`${s.stack}
|
|
2456
2460
|
`);let o=s.cause,i=0;for(;o!=null&&i<8;){let a=o instanceof Error?o:new Error(String(o));n.stderr.write(`caused by: ${a.message}
|
|
2457
2461
|
`),a.stack&&n.stderr.write(`${a.stack}
|
|
2458
|
-
`),o=a.cause,i+=1}return 1}async function ak(t,e,r){switch(t){case"api":{let{runApi:n}=await Promise.resolve().then(()=>(Tc(),gh));return n(e,r)}case"code":{let{runCode:n}=await Promise.resolve().then(()=>(Jc(),Zh));return n(e,r)}case"serve":{let{runServe:n}=await Promise.resolve().then(()=>(ib(),ob));return n(e,r)}case"intake":{let{runIntake:n}=await Promise.resolve().then(()=>(lb(),ab));return n(e,r)}case"chat":{let{runChat:n}=await Promise.resolve().then(()=>(Ub(),Fb));return n(e,r)}case"jobs":{let{runJobs:n}=await Promise.resolve().then(()=>(eT(),Qb));return n(e,r)}case"mcp":{let{runMcp:n}=await Promise.resolve().then(()=>(aT(),iT));return n(e,r)}case"monitor":{let{runMonitor:n}=await Promise.resolve().then(()=>(hT(),pT));return n(e,r)}case"device":{let{runDevice:n}=await Promise.resolve().then(()=>(gT(),_T));return n(e,r)}case"team":{let{runTeam:n}=await Promise.resolve().then(()=>(ET(),
|
|
2462
|
+
`),o=a.cause,i+=1}return 1}async function ak(t,e,r){switch(t){case"api":{let{runApi:n}=await Promise.resolve().then(()=>(Tc(),gh));return n(e,r)}case"code":{let{runCode:n}=await Promise.resolve().then(()=>(Jc(),Zh));return n(e,r)}case"serve":{let{runServe:n}=await Promise.resolve().then(()=>(ib(),ob));return n(e,r)}case"intake":{let{runIntake:n}=await Promise.resolve().then(()=>(lb(),ab));return n(e,r)}case"chat":{let{runChat:n}=await Promise.resolve().then(()=>(Ub(),Fb));return n(e,r)}case"jobs":{let{runJobs:n}=await Promise.resolve().then(()=>(eT(),Qb));return n(e,r)}case"mcp":{let{runMcp:n}=await Promise.resolve().then(()=>(aT(),iT));return n(e,r)}case"monitor":{let{runMonitor:n}=await Promise.resolve().then(()=>(hT(),pT));return n(e,r)}case"device":{let{runDevice:n}=await Promise.resolve().then(()=>(gT(),_T));return n(e,r)}case"team":{let{runTeam:n}=await Promise.resolve().then(()=>(ET(),yT));return n(e,r)}case"tail":{let{runTail:n}=await Promise.resolve().then(()=>(Wd(),Gb));return n(e,r)}case"health":{let{runInfo:n}=await Promise.resolve().then(()=>(TT(),bT));return n(e,r)}case"ls":{let{runLs:n}=await Promise.resolve().then(()=>(vT(),kT));return n(e,r)}case"lint":{let{runLint:n}=await Promise.resolve().then(()=>(qs(),Bs));return n(e,r)}case"seed":{let{runSeed:n}=await Promise.resolve().then(()=>(qs(),Bs));return n(e,r)}case"hire":{let{runHire:n}=await Promise.resolve().then(()=>(qs(),Bs));return n(e,r)}case"refresh":{let{runRefresh:n}=await Promise.resolve().then(()=>(qs(),Bs));return n(e,r)}case"clone":{let{runClone:n}=await Promise.resolve().then(()=>(zT(),YT));return n(e,r)}case"plan":{let{runPlan:n}=await Promise.resolve().then(()=>(tS(),eS));return n(e,r)}case"terminal":{let{runTerminal:n}=await Promise.resolve().then(()=>(oS(),sS));return n(e,r)}case"workflow":{let{runWorkflow:n}=await Promise.resolve().then(()=>(Tf(),bf));return n(e,r)}case"run":{let{runWorkflow:n}=await Promise.resolve().then(()=>(Tf(),bf));return n(["run",...e],r)}case"workspace":{let{runWorkspace:n}=await Promise.resolve().then(()=>(xS(),$S));return n(e,r)}case"project":{let{runProject:n}=await Promise.resolve().then(()=>(OS(),RS));return n(e,r)}case"diagnose":{let{runDiagnose:n}=await Promise.resolve().then(()=>(GS(),XS));return n(e,r)}case"diagnose-prompt":{let{runDiagnosePrompt:n}=await Promise.resolve().then(()=>(ek(),QS));return n(e,r)}case"status":{let{runStatus:n}=await Promise.resolve().then(()=>(ok(),sk));return n(e,r)}case"db":return P2(e,r);default:return lk(r,t)}}function P2(t,e){let[r,...n]=t;return r==="--help"||r==="-h"||r==="help"?(e.stdout.write(`usage: lmctl db downgrade --to <version> --confirm
|
|
2459
2463
|
|
|
2460
2464
|
Database utilities. The downgrade command is currently a documented stub;
|
|
2461
2465
|
restore from backup for rollback and use normal migrations for forward changes.
|
|
2462
2466
|
`),0):r==="downgrade"?(e.stderr.write(`not yet implemented; restore from backup, or run lmctl migrate (forward-migrates ok)
|
|
2463
2467
|
`),1):(e.stderr.write(`usage: lmctl db downgrade --to <version> --confirm
|
|
2464
|
-
`),1)}if(process.argv[1]!==void 0&&import.meta.url===
|
|
2468
|
+
`),1)}if(process.argv[1]!==void 0&&import.meta.url===L2(process.argv[1]).href){let t=await C2(process.argv.slice(2));process.exitCode=t}export{C2 as runCli};
|