@lmctl-ai/lmctl 0.1.149 → 0.1.150
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 +258 -258
- package/package.json +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
var _k=Object.defineProperty;var T=(e,t)=>()=>(e&&(t=e(e=0)),t);var
|
|
2
|
-
`)}function Xa(){return Mt(br(),Tk)}function Gf(){return Mt(br(),bk)}function vk(){try{return
|
|
1
|
+
var _k=Object.defineProperty;var T=(e,t)=>()=>(e&&(t=e(e=0)),t);var we=(e,t)=>{for(var r in t)_k(e,r,{get:t[r],enumerable:!0})};import{existsSync as Js,readdirSync as xH,readFileSync as hk}from"node:fs";import{homedir as gk,platform as qf}from"node:os";import{join as Mt}from"node:path";function br(){let e=process.env.LMCTL_HOME;return e!==void 0&&e.length>0?e:Mt(gk(),yk)}function Xs(){return Mt(br(),Hf)}function Xr(){return Mt(br(),wk)}function jt(e){return Mt(Xr(),e)}function Tr(e){return Mt(jt(e),Hf)}function Ja(e){return Mt(jt(e),"projects")}function Gs(){return Mt(br(),Ek)}function ze(e){return!(e.length===0||e.length>64||!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(e)||e==="."||e==="..")}function Vs(){let e=Gs();if(!Js(e))return null;try{let t=hk(e,"utf8").trim();return t.length===0||!ze(t)?null:t}catch{return null}}function Dt(){let e=process.env.LMCTL_WORKSPACE;return e!==void 0&&e.length>0&&ze(e)?e:Vs()}function le(e){if(e!==void 0&&e.length>0)return e;if(process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0)return process.env.LMCTL_DB;let t=Dt();if(t!==null)return Tr(t);let r=Xs();return Js(r)||!Js(Xr())?r:Tr(Jf)}function Ks(e,t){return`workspace: ${process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0?"(overridden by --db)":e??"default"} db: ${t}`}function Sk(e,t=qf()){return t!=="linux"?!1:e.startsWith("/mnt/c/")||e==="/mnt/c"}function Xf(e,t=process.stderr,r=qf()){Sk(e,r)&&t.write(`warning: DB on /mnt/c is slow; consider moving to ~/.lmctl/state.db (set LMCTL_DB or use --db)
|
|
2
|
+
`)}function Xa(){return Mt(br(),Tk)}function Gf(){return Mt(br(),bk)}function vk(){try{return Js(Xa())}catch{return!1}}function Vf(e=process.stderr){vk()&&e.write(`note: legacy ~/.lmctl/profiles/ detected \u2014 run 'lmctl workspace migrate' to move it to ~/.lmctl/workspaces/
|
|
3
3
|
`)}var yk,Hf,wk,Ek,Jf,Tk,bk,Sr,Xe=T(()=>{"use strict";yk=".lmctl",Hf="state.db",wk="workspaces",Ek="active-workspace",Jf="default",Tk="profiles",bk="active-profile";Sr={default:Jf}});function xk(e){for(let t of Nk)if(e.startsWith(t))return!0;if(e.startsWith("172.")){let t=Number(e.split(".")[1]);if(Number.isFinite(t)&&t>=16&&t<=31)return!0}return!!e.startsWith("169.254.")}function Ak(e){let t=e.toLowerCase();return!!(t==="::1"||t==="::"||t.startsWith("fe80:")||t.startsWith("fe80::"))}function Ok(e){let t=e.split(".");if(t.length!==4)return!1;for(let r of t){if(r.length===0||r.length>3)return!1;let n=Number(r);if(!Number.isFinite(n)||n<0||n>255)return!1}return!0}function Dn(e){let t=e;for(let{re:r,replacement:n}of Ik)t=t.replace(r,n);return t=t.replace(Rk,r=>!Ok(r)||xk(r)?r:Kf),t=t.replace(Lk,r=>Ak(r)?r:Kf),t}function Pn(e){return e.split(`
|
|
4
4
|
`).map(t=>Dn(t)).join(`
|
|
5
|
-
`)}function zf(e,t){let r=e.toUpperCase();return r.includes("TOKEN")||r.includes("SECRET")||r.includes("KEY")||r.includes("PASSWORD")||r.includes("PASSWD")||r.includes("CREDENTIAL")||r.includes("AUTH")?{key:e,value:st}:{key:e,value:Dn(t)}}function tr(e){if(typeof e=="string")return Dn(e);if(Array.isArray(e))return e.map(t=>tr(t));if(e!==null&&typeof e=="object"){let t={};for(let[r,n]of Object.entries(e)){let s=r.toUpperCase();s.includes("TOKEN")||s.includes("SECRET")||s.includes("KEY")||s.includes("PASSWORD")||s.includes("PASSWD")||s.includes("CREDENTIAL")?t[r]=typeof n=="string"?st:tr(n):t[r]=tr(n)}return t}return e}function Zf(e,t){for(let{name:r,re:n}of $k){let s=t.match(n);if(s!==null&&!s[0].includes(st))throw new vr(e,r)}}var st,kk,Kf,Yf,Ik,Nk,Rk,Lk,$k,vr,
|
|
5
|
+
`)}function zf(e,t){let r=e.toUpperCase();return r.includes("TOKEN")||r.includes("SECRET")||r.includes("KEY")||r.includes("PASSWORD")||r.includes("PASSWD")||r.includes("CREDENTIAL")||r.includes("AUTH")?{key:e,value:st}:{key:e,value:Dn(t)}}function tr(e){if(typeof e=="string")return Dn(e);if(Array.isArray(e))return e.map(t=>tr(t));if(e!==null&&typeof e=="object"){let t={};for(let[r,n]of Object.entries(e)){let s=r.toUpperCase();s.includes("TOKEN")||s.includes("SECRET")||s.includes("KEY")||s.includes("PASSWORD")||s.includes("PASSWD")||s.includes("CREDENTIAL")?t[r]=typeof n=="string"?st:tr(n):t[r]=tr(n)}return t}return e}function Zf(e,t){for(let{name:r,re:n}of $k){let s=t.match(n);if(s!==null&&!s[0].includes(st))throw new vr(e,r)}}var st,kk,Kf,Yf,Ik,Nk,Rk,Lk,$k,vr,Ys=T(()=>{"use strict";st="[REDACTED]",kk="[REDACTED_EMAIL]",Kf="[REDACTED_IP]",Yf="[USER]",Ik=[{re:/(authorization\s*[:=]\s*)(bearer\s+[^\s,;"']+)/gi,replacement:`$1Bearer ${st}`},{re:/(authorization\s*[:=]\s*)(basic\s+[^\s,;"']+)/gi,replacement:`$1Basic ${st}`},{re:/\b(Bearer\s+)[A-Za-z0-9_\-./+=]{8,}/g,replacement:`$1${st}`},{re:/\bsk-ant-[A-Za-z0-9_\-]{8,}/g,replacement:st},{re:/\bsk-[A-Za-z0-9_\-]{16,}/g,replacement:st},{re:/\bgh[pousr]_[A-Za-z0-9]{30,}/g,replacement:st},{re:/\bAKIA[0-9A-Z]{16}\b/g,replacement:st},{re:/\b(api[_-]?key|token|secret|password|passwd)(\s*[:=]\s*"?)([A-Za-z0-9_\-./+=]{8,})("?)/gi,replacement:`$1$2${st}$4`},{re:/(\/home\/)[^/\s"'`]+/g,replacement:`$1${Yf}`},{re:/(\/Users\/)[^/\s"'`]+/g,replacement:`$1${Yf}`},{re:/\b[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}\b/g,replacement:kk}],Nk=["127.","10.","192.168.","0.0.0.0"];Rk=/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/g,Lk=/\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"'`]+/}],vr=class extends Error{bundlePath;patternName;constructor(t,r){super(`sanitization failed: ${r} pattern matched in ${t}`),this.bundlePath=t,this.patternName=r,this.name="SanitizationError"}}});import{spawnSync as Ga}from"node:child_process";import{readFileSync as Ck}from"node:fs";import{readFile as Ka,stat as Qf}from"node:fs/promises";import{homedir as Mk}from"node:os";import{join as jk}from"node:path";import{fileURLToPath as Dk}from"node:url";function yt(){try{let e=new URL("../../package.json",import.meta.url),t=JSON.parse(Ck(Dk(e),"utf8"));if(typeof t.version=="string")return t.version}catch{}return"0.0.0"}async function em(e){let t=new Set(e.include??zs),r={};return t.has("serve")&&(r.serve=await Fk(e)),t.has("db")&&(r.db=Uk(e)),t.has("runs")&&(r.runs=Wk(e)),t.has("jobs")&&(r.jobs=Bk(e)),t.has("attentions")&&(r.attentions=qk(e)),t.has("env")&&(r.env=await Hk(e)),t.has("intents")&&(r.intents=await Xk(e)),r}async function Fk(e){let t=e.pidFile??process.env.LMCTL_PID_FILE,r=e.serveLog??process.env.LMCTL_SERVE_LOG,n=e.logTailLines??1e3,s=null,i="none";if(t!==void 0)try{let d=(await Ka(t,"utf8")).trim(),u=Number.parseInt(d,10);Number.isInteger(u)&&u>0&&(s=u,i="pidfile")}catch{}let o=null;if(s!==null)try{process.kill(s,0),o=!0}catch{o=!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 u=(await Ka(r,"utf8")).split(`
|
|
6
6
|
`),f=u.slice(Math.max(0,u.length-n));c=f.length,a=Pn(f.join(`
|
|
7
7
|
`))}catch(d){l=`serve log unreadable: ${d instanceof Error?d.message:String(d)}`}return{pid:s,pid_source:i,pid_alive:o,log_tail_lines:c,log_tail:a,log_note:l}}function Uk(e){let{dal:t}=e,r="unknown";try{r=t.query("PRAGMA integrity_check;").map(o=>o.integrity_check??JSON.stringify(o)).join(`
|
|
8
8
|
`)}catch(i){r=`integrity_check failed: ${i instanceof Error?i.message:String(i)}`}let n=0;try{n=t.query("PRAGMA user_version;")[0]?.user_version??0}catch{n=0}let s={};try{let i=t.query("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name");for(let{name:o}of i)try{let a=t.query(`SELECT COUNT(*) AS c FROM "${o.replace(/"/g,'""')}"`);s[o]=a[0]?.c??0}catch{s[o]=-1}}catch{}return{integrity_check:r,schema_version:n,table_counts:s}}function Wk(e){let{dal:t}=e,r=(e.now??new Date).toISOString(),n=(e.staleThresholdMin??60)*6e4,s=new Date(Date.parse(r)-n).toISOString(),i=t.query(`SELECT ${Va} FROM run ORDER BY id DESC LIMIT 50`),o=t.query(`SELECT ${Va} FROM run WHERE paused_at IS NOT NULL AND terminal_state IS NULL ORDER BY paused_at DESC LIMIT 50`),a=t.query(`SELECT ${Va} FROM run
|
|
@@ -12,9 +12,9 @@ var _k=Object.defineProperty;var T=(e,t)=>()=>(e&&(t=e(e=0)),t);var ye=(e,t)=>{f
|
|
|
12
12
|
FROM attention WHERE acknowledged_at IS NULL ORDER BY created_at DESC LIMIT 100`);return{unacked:tr(r)}}async function Hk(e){let t=yt(),r=process.version,n=Ga("uname",["-a"],{encoding:"utf8"}),s=Pn((n.stdout??"").trim()),i=[],o=e.dbPath??process.env.LMCTL_DB;if(o!==void 0)try{await Qf(o);let d=Ga("du",["-sh",o],{encoding:"utf8"});d.status===0&&i.push(d.stdout.trim())}catch{}let a=e.sessiondir??process.env.LMCTL_SESSIONDIR;if(a!==void 0)try{await Qf(a);let d=Ga("du",["-sh",a],{encoding:"utf8"});d.status===0&&i.push(d.stdout.trim())}catch{}let l=i.length===0?"(no paths configured)":Pn(i.join(`
|
|
13
13
|
`)),c=[];for(let d of Pk){let u=process.env[d];if(u===void 0){c.push({key:d,value:"(unset)"});continue}c.push(zf(d,u))}return{lmctl_next_version:t,node_version:r,os_info:s,disk_usage:l,env_keys_present:c}}function Jk(){return process.env.LMCTL_INTENT_LOG??jk(Mk(),".lmctl","recent-intents.log")}async function Xk(e){let t=e.intentLog??Jk(),r=e.intentLogTailLines??500;try{let s=(await Ka(t,"utf8")).split(`
|
|
14
14
|
`).filter(o=>o.length>0),i=s.slice(Math.max(0,s.length-r));return{source_path:t,tail_lines:i.length,tail:Pn(i.join(`
|
|
15
|
-
`)),note:null}}catch(n){return n.code==="ENOENT"?{source_path:t,tail_lines:0,tail:"",note:"no intent log present (status never run on this host)"}:{source_path:t,tail_lines:0,tail:"",note:`intent log unreadable: ${n instanceof Error?n.message:String(n)}`}}}var
|
|
16
|
-
`)}catch{}}function Qk(){if(!
|
|
17
|
-
`)){let r=t.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 rI(){try{let e=nm(
|
|
15
|
+
`)),note:null}}catch(n){return n.code==="ENOENT"?{source_path:t,tail_lines:0,tail:"",note:"no intent log present (status never run on this host)"}:{source_path:t,tail_lines:0,tail:"",note:`intent log unreadable: ${n instanceof Error?n.message:String(n)}`}}}var zs,Pk,Va,Fn=T(()=>{"use strict";Ys();zs=["serve","db","runs","jobs","attentions","env","intents"];Pk=["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"];Va=["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 nm,appendFileSync as Gk,mkdirSync as Vk,existsSync as BH,readdirSync as qH,unlinkSync as HH}from"node:fs";import{join as Qs,dirname as Kk}from"node:path";import{homedir as Yk}from"node:os";function Ya(){return Qs(Yk(),".lmctl")}function sm(){Gr=!0,process.env.LMCTL_DEBUG="1"}function im(){return{cliDebug:Gr,lmctlDebugEnv:process.env.LMCTL_DEBUG}}function om(e){Gr=e.cliDebug,e.lmctlDebugEnv===void 0?delete process.env.LMCTL_DEBUG:process.env.LMCTL_DEBUG=e.lmctlDebugEnv}function ce(){if(Gr||process.env.LMCTL_DEBUG==="1")return!0;let e=Date.now();return e-rm>=zk&&(tm=eI(),rm=e),tm}function am(){return Gr||process.env.LMCTL_DEBUG==="1"}function Zk(){let e=new Date,t=e.getTimezoneOffset(),r=t<=0?"+":"-",n=String(Math.floor(Math.abs(t)/60)).padStart(2,"0"),s=String(Math.abs(t)%60).padStart(2,"0");return new Date(e.getTime()-t*6e4).toISOString().replace("Z",`${r}${n}:${s}`)}function Ae(e,t){if(t?.verbose){if(!Gr)return}else if(!t?.always&&!ce())return;try{Qk();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,...e};Gk(Zs,JSON.stringify(r)+`
|
|
16
|
+
`)}catch{}}function Qk(){if(!Zs){let t=Zk().slice(0,13).replace("T","-");Zs=Qs(Ya(),`debug-${t}.log`)}Vk(Kk(Zs),{recursive:!0})}function Oe(...e){Ae({event:"legacy",msg:e.join(" ")})}function wt(...e){Ae({event:"legacy",msg:e.join(" ")},{verbose:!0})}function H(e){Ae(e,{always:!0})}function eI(){return tI()||rI()}function tI(){try{let e=nm(Qs(Ya(),"config.toml"),"utf-8");for(let t of e.split(`
|
|
17
|
+
`)){let r=t.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 rI(){try{let e=nm(Qs(Ya(),"config.json"),"utf-8"),t=JSON.parse(e);return t!==null&&typeof t=="object"&&!Array.isArray(t)&&t.debug===!0}catch{}return!1}var Gr,tm,rm,zk,Zs,he=T(()=>{"use strict";Gr=!1,tm=!1,rm=0,zk=5e3;Zs=null});import{existsSync as TI}from"node:fs";import{createRequire as bI}from"node:module";function SI(){return Za===null&&(Za=bI(import.meta.url)("node:sqlite").DatabaseSync),Za}function Qa(e){return e.length===1&&vI(e[0])?[e[0]]:e}function vI(e){if(!rl(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function rl(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var Za,el,fm,tl,mm=T(()=>{"use strict";Za=null;el=class{name;handle;transactionDepth=0;savepointId=0;constructor(t,r={}){if(r.fileMustExist===!0&&t!==":memory:"&&!TI(t))throw new Error("unable to open database file");this.name=t,this.handle=new(SI())(t,{readOnly:r.readonly===!0}),this.exec("PRAGMA busy_timeout = 5000")}prepare(t){return new tl(this.handle.prepare(t))}exec(t){this.handle.exec(t),this.updateTransactionDepth(t)}pragma(t,r){let n=`PRAGMA ${t}`;if(t.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(t){return(...r)=>{if(this.transactionDepth===0){this.exec("BEGIN");try{let s=t(...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=t(...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(t){let r=t.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(t.trim())&&(this.transactionDepth=0)}}},fm=el,tl=class{handle;rawMode=!1;constructor(t){this.handle=t,this.handle.setAllowBareNamedParameters(!0)}get(...t){let r=this.handle.get(...Qa(t));return this.normalizeRow(r)}all(...t){return this.handle.all(...Qa(t)).map(r=>this.normalizeRow(r))}run(...t){let r=this.handle.run(...Qa(t));return{changes:Number(r.changes),lastInsertRowid:Number(r.lastInsertRowid)}}raw(){return this.rawMode=!0,this}normalizeRow(t){return t==null?t:this.rawMode&&rl(t)?Object.values(t):rl(t)?{...t}:t}}});import{existsSync as kI,mkdirSync as II,readFileSync as _m}from"node:fs";import{homedir as NI}from"node:os";import{dirname as hm,join as xI,resolve as gm}from"node:path";import{fileURLToPath as AI,pathToFileURL as RI}from"node:url";function nl(e){e.dbPath!==":memory:"&&II(hm(e.dbPath),{recursive:!0});let t=new fm(e.dbPath);t.pragma("journal_mode = WAL"),t.pragma("synchronous = NORMAL"),t.pragma("foreign_keys = ON");let r=Em(t);return r===0&&(t.exec(_m(wm,"utf8")),t.pragma(`user_version = ${OI}`)),$I(t,r),t}function $I(e,t){let r=t;if(r<2&&r!==0&&(e.exec(`
|
|
18
18
|
CREATE TABLE IF NOT EXISTS session_size (
|
|
19
19
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
20
20
|
team_name TEXT NOT NULL,
|
|
@@ -954,8 +954,8 @@ var _k=Object.defineProperty;var T=(e,t)=>()=>(e&&(t=e(e=0)),t);var ye=(e,t)=>{f
|
|
|
954
954
|
AND delivering_at IS NULL
|
|
955
955
|
ORDER BY receiver_teamfile ASC, receiver_alias ASC, id ASC
|
|
956
956
|
`),deleteMailboxMessage:e.prepare("DELETE FROM agent_mailbox WHERE id = ?")}}function Wn(e){if(Buffer.byteLength(e,"utf8")<=65536)return e;let r=Buffer.byteLength(Nm,"utf8"),n=Math.max(0,65536-r),s=Buffer.from(e,"utf8"),i=n;for(;i>0&&(s[i]&192)===128;)i-=1;return`${s.subarray(0,i).toString("utf8")}${Nm}`}var Nm,Am=T(()=>{"use strict";Nm=`
|
|
957
|
-
...[truncated]`});function Hn(e,t){return JSON.stringify([e,t])}function Rm(e){try{let t=JSON.parse(e);return typeof t.lock_id!="string"||typeof t.teamfile!="string"||typeof t.alias!="string"||typeof t.holder_pid!="number"||typeof t.holder_host!="string"||!Array.isArray(t.holder_ips)||!t.holder_ips.every(r=>typeof r=="string")||typeof t.started_at!="string"||typeof t.last_heartbeat!="string"?null:{lock_id:t.lock_id,teamfile:t.teamfile,alias:t.alias,holder_pid:t.holder_pid,holder_host:t.holder_host,holder_ips:t.holder_ips,started_at:t.started_at,last_heartbeat:t.last_heartbeat}}catch{return null}}var Bn,qn,Lm=T(()=>{"use strict";Bn="terminal_lock",qn="member"});function rr(e){if(!Number.isInteger(e)||(e??0)<=0)return!1;try{return process.kill(e,0),!0}catch(t){return(t!==null&&typeof t=="object"&&"code"in t?t.code:void 0)!=="ESRCH"}}var sl=T(()=>{"use strict"});function Vr(e){return typeof e=="string"&&MI.has(e)}function Cm(e){return["Decide the workflow outcome. Reply with a final line:",` STANCE: <one of: ${e.length>0?e.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: ${
|
|
958
|
-
`)}var Om,
|
|
957
|
+
...[truncated]`});function Hn(e,t){return JSON.stringify([e,t])}function Rm(e){try{let t=JSON.parse(e);return typeof t.lock_id!="string"||typeof t.teamfile!="string"||typeof t.alias!="string"||typeof t.holder_pid!="number"||typeof t.holder_host!="string"||!Array.isArray(t.holder_ips)||!t.holder_ips.every(r=>typeof r=="string")||typeof t.started_at!="string"||typeof t.last_heartbeat!="string"?null:{lock_id:t.lock_id,teamfile:t.teamfile,alias:t.alias,holder_pid:t.holder_pid,holder_host:t.holder_host,holder_ips:t.holder_ips,started_at:t.started_at,last_heartbeat:t.last_heartbeat}}catch{return null}}var Bn,qn,Lm=T(()=>{"use strict";Bn="terminal_lock",qn="member"});function rr(e){if(!Number.isInteger(e)||(e??0)<=0)return!1;try{return process.kill(e,0),!0}catch(t){return(t!==null&&typeof t=="object"&&"code"in t?t.code:void 0)!=="ESRCH"}}var sl=T(()=>{"use strict"});function Vr(e){return typeof e=="string"&&MI.has(e)}function Cm(e){return["Decide the workflow outcome. Reply with a final line:",` STANCE: <one of: ${e.length>0?e.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: ${ei[0]}`,` STANCE: ${ei[1]}`,` STANCE: ${ei[2]}`,` STANCE: ${Om}: <one short sentence: why no declared outcome fits>`,"Never invent a different outcome; never leave the STANCE line out."].join(`
|
|
958
|
+
`)}var Om,ei,MI,Jn,$m,il,ti,Xn=T(()=>{"use strict";Om="other",ei=["not_enough_information","dont_know","other_work"],MI=new Set([Om,...ei]),Jn="@abort",$m="invalid_decision",il="escalation_aborted",ti="workflow_escalation"});import{randomUUID as Mm}from"node:crypto";import{hostname as Gn}from"node:os";function Ue(e){return e.provider_resolved??e.provider}function O(){return new Date().toISOString()}function Ie(e){return new ol(nl({dbPath:e.path}))}function jm(e,t,r){let n=Dm(t);if(n.length===0)return;let s=new Set,i=[],o=l=>{if(l===e)return n;let c=r(l);if(c===null)throw new Error(`unknown workflow reference: ${l}`);return Dm(c.definition)},a=l=>{let c=i.indexOf(l);if(c>=0)throw new Error(`cycle detected: ${[...i.slice(c),l].join(" -> ")}`);if(!s.has(l)){i.push(l);try{for(let d of o(l))a(d)}finally{i.pop()}s.add(l)}};a(e)}function Dm(e){let t=jI(e),r=t===null?null:DI(t,"states");if(r===null)return[];let n=[];for(let s of Object.values(r))ri(s)&&s.type==="Subflow"&&typeof s.workflow_name=="string"&&s.workflow_name.length>0&&n.push(s.workflow_name);return n}function jI(e){try{let t=JSON.parse(e);return ri(t)?t:null}catch{return null}}function DI(e,t){let r=e[t];return ri(r)?r:null}function ri(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function PI(e){try{let t=JSON.parse(e);return!ri(t)||typeof t.lock_id!="string"||typeof t.holder_pid!="number"||typeof t.holder_host!="string"||typeof t.started_at!="string"||typeof t.last_heartbeat!="string"?null:{lock_id:t.lock_id,holder_pid:t.holder_pid,holder_host:t.holder_host,started_at:t.started_at,last_heartbeat:t.last_heartbeat}}catch{return null}}function FI(e,t){return e===null?!0:e.holder_host===Gn()?!rr(e.holder_pid):e.last_heartbeat<t}function UI(e,t){return e.delivering_at===null?!1:e.delivery_holder_host===Gn()&&WI(e.delivery_holder_pid)?!rr(e.delivery_holder_pid):e.delivering_at<t}function WI(e){return Number.isInteger(e)&&(e??0)>0}function BI(e){return{...xm(e),getRuntimeState:e.prepare("SELECT * FROM runtime_state WHERE scope = ? AND key = ? AND kind = ?"),upsertRuntimeState:e.prepare(`
|
|
959
959
|
INSERT INTO runtime_state (scope, key, kind, data, updated_at)
|
|
960
960
|
VALUES (?, ?, ?, ?, ?)
|
|
961
961
|
ON CONFLICT(scope, key, kind) DO UPDATE SET
|
|
@@ -1355,9 +1355,9 @@ var _k=Object.defineProperty;var T=(e,t)=>()=>(e&&(t=e(e=0)),t);var ye=(e,t)=>{f
|
|
|
1355
1355
|
error_detail = ?,
|
|
1356
1356
|
truncated = ?
|
|
1357
1357
|
WHERE id = ?
|
|
1358
|
-
`),...km(e),...bm(e)}}function qI(e,t){return t===void 0?{resumed:!1,reason:e}:{resumed:!1,reason:e,valid:t}}var ol,Ze=T(()=>{"use strict";Tm();Sm();Im();Am();Lm();sl();Xn();ol=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;recvMailboxMessagesTxn;constructor(t){t.pragma("foreign_keys = ON"),this.db=t,this.stmts=BI(t),this.claimTxn=t.transaction((r,n,s)=>{let i=this.stmts.selectClaimableJob.get(s,s,s);return i===void 0||this.stmts.claimJob.run(r,n,s,i.id,s,s,s).changes!==1?null:this.getJob(i.id)}),this.claimWithConcurrencyTxn=t.transaction((r,n,s,i)=>{let o=this.stmts.selectClaimableJobs.all(s,s,s);for(let a of o){let l=this.getJob(a.id);if(l===null)continue;let c=i(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=t.transaction((r,n,s,i,o)=>{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>=i)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<=i,d=a.status==="running"&&a.locked_until!==null&&a.locked_until<i;if(!c&&!d)return{claimed:!1,reason:"not_claimable",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let u=o(a);if(u.concurrency_key!==null&&(a.concurrency_key_resolved!==u.concurrency_key&&this.stmts.setJobConcurrencyKey.run(u.concurrency_key,a.id),(this.stmts.countRunningByConcurrencyKey.get(u.concurrency_key,i,a.id)?.count??0)>=Math.max(1,u.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,i,a.id,i,i,i).changes!==1){let p=this.getJob(a.id);return{claimed:!1,reason:p?.locked_until!==null&&p?.locked_until!==void 0&&p.locked_until>=i?"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=t.transaction((r,n,s)=>qI("state_not_found")),this.resumeInteractiveTxn=t.transaction((r,n,s,i)=>{let o=this.getInteractiveSessionByStepId(r);if(o===null)return{resumed:!1,reason:"not_found"};if(o.status!=="waiting_operator")return{resumed:!1,reason:"not_waiting_operator"};let a=this.getRun(o.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(),o.id),this.stmts.resumeRunState.run(o.state_name,a.id),this.stmts.requeuePausedJob.run(i,a.job_id),{resumed:!0,session:this.getInteractiveSessionByStepId(r),run:this.getRun(a.id),job:this.getJob(a.job_id)}}),this.resumeEscalationTxn=t.transaction((r,n,s)=>{let i=this.stmts.getAttention.get(r);if(i===void 0)return{resumed:!1,reason:"not_found"};if(i.kind!==ei)return{resumed:!1,reason:"wrong_kind"};if(i.acknowledged_at!==null)return{resumed:!1,reason:"already_acked"};if(i.run_id===null)return{resumed:!1,reason:"run_not_found"};let o=null,a=[];if(i.payload!==null)try{let d=JSON.parse(i.payload);d.step!==void 0&&typeof d.step.id=="string"&&d.step.id.length>0&&(o=d.step.id),Array.isArray(d.declared_outcomes)&&(a=d.declared_outcomes.filter(u=>typeof u=="string"))}catch{}if(o===null)return{resumed:!1,reason:"no_step"};let l=this.getRun(i.run_id);if(l===null)return{resumed:!1,reason:"run_not_found"};if(n!==Jn&&!a.includes(n))return{resumed:!1,reason:$m};let c={};if(l.pending_escalation_decision!==null)try{let d=JSON.parse(l.pending_escalation_decision);d!==null&&typeof d=="object"&&!Array.isArray(d)&&(c=d)}catch{c={}}return c[o]=n,this.stmts.setRunPendingEscalationDecision.run(JSON.stringify(c),l.id),this.stmts.resumeRunState.run(o,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,i=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}),o=i!==void 0?{acquired:!0,current:i}:{acquired:!1,current:this.getAgentInflight(r.receiver_teamfile,r.receiver_alias)??(()=>{throw new Error("agent_inflight conflict row disappeared during acquire")})()};return this.db.exec("COMMIT"),o}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}},this.recvMailboxMessagesTxn=t.transaction((r,n)=>{let s=this.stmts.listAllMailboxMessagesForReceiver.all(r,n);for(let i of s)this.stmts.deleteMailboxMessage.run(i.id);return s})}close(){this.db.close()}query(t,...r){let n=t.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(t).all(...r)}insertWorkflow(t){jm(t.name,t.definition,o=>this.getWorkflowByName(o));let r=this.stmts.insertWorkflow.run(t.name,t.version??1,t.definition_schema_version??1,t.definition,O()),n=this.getWorkflow(Number(r.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(n.id,n.version,t.definition,t.author??null,O());this.stmts.updateWorkflowActiveVersion.run(s.lastInsertRowid,n.id),(t.source_uri!=null||t.source_sha256!=null)&&this.stmts.setWorkflowSource.run(t.source_uri??null,t.source_sha256??null,n.id);let i=this.getWorkflow(n.id);return this.syncWorkflowTriggers(n.id,t.definition),i}upsertWorkflow(t){jm(t.name,t.definition,o=>this.getWorkflowByName(o));let r=this.getWorkflowByName(t.name);if(r===null)return this.insertWorkflow({name:t.name,definition_schema_version:t.definition_schema_version,definition:t.definition,author:t.author,source_uri:t.source_uri,source_sha256:t.source_sha256});let s=(this.stmts.getLatestWorkflowVersion.get(r.id)?.version??r.version)+1,i=this.stmts.insertWorkflowVersion.run(r.id,s,t.definition,t.author??null,O());return this.stmts.updateWorkflowActiveVersionDefinitionAndVersion.run(Number(i.lastInsertRowid),t.definition,t.definition_schema_version??r.definition_schema_version,s,r.id),(t.source_uri!=null||t.source_sha256!=null)&&this.stmts.setWorkflowSource.run(t.source_uri??null,t.source_sha256??null,r.id),this.syncWorkflowTriggers(r.id,t.definition),this.getWorkflow(r.id)}insertCompositionUnit(t){this.stmts.insertCompositionUnit.run(t.name,t.version,t.lang,t.source,t.source_sha,t.compiled_workflow_version_id,O())}getWorkflow(t){return this.stmts.getWorkflow.get(t)??null}getWorkflowByName(t,r){return(r===void 0?this.stmts.findWorkflowLatest.get(t):this.stmts.findWorkflowVersion.get(t,r))??null}findWorkflowByName(t,r){return this.getWorkflowByName(t,r)}insertWorkflowVersion(t,r,n){let i=(this.stmts.getLatestWorkflowVersion.get(t)?.version??0)+1,o=this.stmts.insertWorkflowVersion.run(t,i,r,n??null,O());return this.stmts.getWorkflowVersion.get(o.lastInsertRowid)}activateWorkflowVersion(t,r){let n=this.getWorkflowVersionById(r);if(n===null||n.workflow_id!==t)return null;let s=1;try{let i=JSON.parse(n.definition);typeof i.definition_schema_version=="number"&&(s=i.definition_schema_version)}catch{}return this.stmts.updateWorkflowActiveVersionAndDefinition.run(r,n.definition,s,t),this.syncWorkflowTriggers(t,n.definition),this.getWorkflow(t)}getWorkflowVersionById(t){return this.stmts.getWorkflowVersion.get(t)??null}listWorkflowVersions(t){return this.stmts.listWorkflowVersions.all(t)}upsertTriggerInstance(t){return this.stmts.upsertTriggerInstance.run(t.workflow_id,t.trigger_id,t.trigger_type,t.parameters,t.enabled===!1?0:1,O()),this.stmts.getTriggerInstanceByWorkflowAndId.get(t.workflow_id,t.trigger_id)}listTriggerInstancesForWorkflow(t){return this.stmts.listTriggerInstancesForWorkflow.all(t)}listEnabledTriggerInstances(){return this.stmts.listEnabledTriggerInstances.all()}setTriggerCursor(t,r){return this.stmts.setTriggerCursor.run(r,O(),t),this.stmts.getTriggerInstance.get(t)??null}setTriggerFailure(t,r){return this.stmts.setTriggerFailure.run(O(),r,t),this.stmts.getTriggerInstance.get(t)??null}syncWorkflowTriggers(t,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 i of s){if(i===null||typeof i!="object"||Array.isArray(i))continue;let o=i;typeof o.id!="string"||o.id.length===0||typeof o.type!="string"||o.type.length===0||this.upsertTriggerInstance({workflow_id:t,trigger_id:o.id,trigger_type:o.type,parameters:JSON.stringify(o.parameters??{})})}}insertTeam(t){let r=this.stmts.insertTeam.run(t.name,O());return this.stmts.getTeam.get(r.lastInsertRowid)}getTeam(t){return this.stmts.getTeam.get(t)??null}findTeamByName(t){return this.stmts.findTeamByName.get(t)??null}listTeams(){return this.stmts.listTeams.all()}insertTeamMember(t){let r=this.stmts.insertTeamMember.run(t.team_id,t.alias,t.role??"agent",t.provider,t.model??null,t.sessionid??null,t.sessiondir,O());return this.stmts.getTeamMember.get(r.lastInsertRowid)}listTeamMembers(t){return this.stmts.listTeamMembers.all(t)}findTeamMemberByAlias(t,r){return this.stmts.findTeamMemberByAlias.get(t,r)??null}updateTeamMemberSession(t,r){return this.stmts.updateTeamMemberSession.run(r,t),this.stmts.getTeamMember.get(t)??null}setMemberState(t,r,n){return this.stmts.setMemberState.run(r,n??null,O(),t),this.stmts.getTeamMember.get(t)??null}listMembersInState(t){return this.stmts.listMembersInState.all(t)}setMemberPromptSnapshot(t,r){return this.stmts.setMemberPromptSnapshot.run(r,t),this.stmts.getTeamMember.get(t)??null}setMemberProviderResolved(t,r){return this.stmts.setMemberProviderResolved.run(r,t),this.stmts.getTeamMember.get(t)??null}setMemberRolePrompt(t,r){return this.stmts.setMemberRolePrompt.run(r,t),this.stmts.getTeamMember.get(t)??null}updateTeamMemberMeta(t,r){let n=this.stmts.getTeamMember.get(t);if(n===void 0)return null;let s=Object.prototype.hasOwnProperty.call(r,"role_prompt"),i=Object.prototype.hasOwnProperty.call(r,"model"),o=Object.prototype.hasOwnProperty.call(r,"provider");return this.stmts.updateTeamMemberMeta.run(s?r.role_prompt??null:n.role_prompt,i?r.model??null:n.model,o?r.provider??n.provider:n.provider,t),this.stmts.getTeamMember.get(t)??null}insertTeamMemberCompanion(t){let r=this.stmts.insertTeamMemberCompanion.run(t.interpreter_id,t.companion_id,O());return this.stmts.getTeamMemberCompanion.get(r.lastInsertRowid)}insertProject(t){let r=this.stmts.insertProject.run(t.name,t.description??null,t.local_path,t.workflow_name,t.team_id,t.default_branch??null,t.intake_config??null,t.test_argv??null,t.test_command??null,t.durable_memory_mode??"folder",O());return this.stmts.getProject.get(r.lastInsertRowid)}listProjects(){return this.stmts.listProjects.all()}getProject(t){return this.stmts.getProject.get(t)??null}findProjectByName(t){return this.stmts.findProjectByName.get(t)??null}setProjectIntakeConfig(t,r){return this.stmts.setProjectIntakeConfig.run(r,t),this.stmts.getProject.get(t)??null}updateProjectSettings(t,r){let n=this.stmts.getProject.get(t);if(n===void 0)return null;let s=Object.prototype.hasOwnProperty.call(r,"local_path"),i=Object.prototype.hasOwnProperty.call(r,"durable_memory_mode"),o=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,i?r.durable_memory_mode:n.durable_memory_mode,o?r.default_branch??null:n.default_branch,a?r.intake_config??null:n.intake_config,t),this.stmts.getProject.get(t)??null}listProjectsWithIntakeEnabled(){return this.stmts.listProjectsWithIntakeConfig.all().filter(t=>{if(t.intake_config===null)return!1;try{let r=JSON.parse(t.intake_config);return typeof r=="object"&&r!==null&&!Array.isArray(r)&&r.scan_github_issues===!0}catch{return!1}})}getProjectByJob(t){return this.stmts.getProjectByJob.get(t)??null}insertProjectWorkflow(t){let r=t.condition??null,n=this.stmts.findProjectWorkflowUnique.get(t.project_id,t.workflow_id,r);if(n!==void 0)return n;let s=this.stmts.insertProjectWorkflow.run(t.project_id,t.workflow_id,r,t.parameters_override??null,t.enabled===!1?0:1,t.priority??100,O());return s.changes===1?this.stmts.getProjectWorkflow.get(s.lastInsertRowid):this.stmts.findProjectWorkflowUnique.get(t.project_id,t.workflow_id,r)}getProjectWorkflow(t){return this.stmts.getProjectWorkflow.get(t)??null}listProjectWorkflows(t,r={}){return r.enabled_only===!0?this.stmts.listEnabledProjectWorkflows.all(t):this.stmts.listProjectWorkflows.all(t)}removeProjectWorkflow(t){return this.stmts.removeProjectWorkflow.run(t).changes>0}setProjectWorkflowEnabled(t,r){return this.stmts.setProjectWorkflowEnabled.run(r?1:0,t),this.getProjectWorkflow(t)}createIssue(t){let r=O(),n=this.stmts.createIssue.run(t.project_id,t.title,t.body,t.severity??"medium",t.labels??null,t.ai_test_path??null,t.source_run_id??null,r,r);return this.stmts.getIssue.get(n.lastInsertRowid)}getIssue(t){return this.stmts.getIssue.get(t)??null}listIssues(t,r={}){return this.stmts.listIssuesForProject.all(t).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(t,r){return this.stmts.claimNextIssue.get(r,O(),t)??null}claimIssue(t,r){return this.stmts.claimIssue.get(r,O(),t)??null}closeIssue(t,r,n){let s=O(),i=this.stmts.closeIssue.get(r,n??null,s,s,t);if(i===void 0)throw new Error(`issue not found: ${t}`);return i}reopenIssue(t,r){let n=this.stmts.reopenIssue.get(r,O(),t);if(n===void 0)throw this.getIssue(t)===null?new Error(`issue not found: ${t}`):new Error(`issue ${t} is not closed`);return n}updateIssue(t,r){let n=this.getIssue(t);if(n===null)throw new Error(`issue not found: ${t}`);let s=Object.prototype.hasOwnProperty.call(r,"labels"),i=Object.prototype.hasOwnProperty.call(r,"ai_test_path"),o=this.stmts.updateIssue.get(r.title??n.title,r.body??n.body,r.severity??n.severity,s?r.labels??null:n.labels,i?r.ai_test_path??null:n.ai_test_path,O(),t);if(o===void 0)throw new Error(`issue not found: ${t}`);return o}listWorkflows(){return this.stmts.listWorkflows.all()}getOrCreateWebuiSession(t,r){let n=this.stmts.getWebuiSession.get(t);if(n!==void 0)return n;let s=O();return this.stmts.insertWebuiSession.run(t,r,"N1",null,null,null,null,"authenticated",s,s),this.stmts.getWebuiSession.get(t)}getWebuiSession(t){return this.stmts.getWebuiSession.get(t)??null}updateWebuiSessionTransition(t,r,n,s,i){if(this.stmts.updateWebuiSessionTransition.run(r,n,s,i,O(),t).changes===0)throw new Error(`webui_session not found: ${t}`);return this.stmts.getWebuiSession.get(t)}setWebuiSessionChatbot(t,r){if(this.stmts.setWebuiSessionChatbot.run(r,O(),t).changes===0)throw new Error(`webui_session not found: ${t}`);return this.stmts.getWebuiSession.get(t)}createChatbotSession(t,r){let n=Mm(),s=O();return this.stmts.insertChatbotSession.run(n,t,r??null,s,s,"active"),this.stmts.getChatbotSession.get(n)}getChatbotSession(t){return this.stmts.getChatbotSession.get(t)??null}listChatbotSessions(t){return this.stmts.listChatbotSessionsForUser.all(t)}appendChatbotMessage(t,r,n,s){let i=O(),o=this.stmts.insertChatbotMessage.run(t,r,n,s??null,i);return this.stmts.touchChatbotSession.run(i,t),this.stmts.getChatbotMessage.get(o.lastInsertRowid)}listChatbotMessages(t){return this.stmts.listChatbotMessages.all(t)}getConfig(t){return this.stmts.getConfig.get(t)?.value??null}setConfig(t,r){this.stmts.upsertConfig.run(t,r,O())}getConfigAll(){let t=this.stmts.listConfig.all(),r={};for(let n of t)r[n.key]=n.value;return r}enqueueJob(t){let r=this.stmts.insertJob.run(t.project_id,t.workflow_id_override??null,t.source,t.source_ref??null,t.payload??null,t.priority??0,t.available_at??O(),t.dedupe_key??null,t.concurrency_key??null,O());if(r.changes===1)return this.stmts.getJob.get(r.lastInsertRowid);if(t.dedupe_key===void 0||t.dedupe_key===null)throw new Error("job insert ignored without dedupe key");return this.stmts.findJobByDedupe.get(t.source,t.dedupe_key)}claimNextJob(t){let r=O(),n=new Date(Date.now()+t.lease_ms).toISOString();return this.claimTxn(t.worker_id,n,r)}claimNextJobWithConcurrency(t){let r=O(),n=new Date(Date.now()+t.lease_ms).toISOString();return this.claimWithConcurrencyTxn(t.worker_id,n,r,t.evaluator)}claimJobByIdWithConcurrency(t){let r=O(),n=new Date(Date.now()+t.lease_ms).toISOString();return this.claimByIdWithConcurrencyTxn(t.job_id,t.worker_id,n,r,t.evaluator)}releaseJob(t,r,n){let s=r==="queued"||r==="running"?null:O();return this.stmts.releaseJob.run(r,n??null,s,t),this.getJob(t)}getJob(t){return this.stmts.getJob.get(t)??null}findJobBySourceAndDedupe(t,r){return this.stmts.findJobByDedupe.get(t,r)??null}insertRun(t){let r=this.getWorkflow(t.workflow_id);if(r===null)throw new Error(`workflow not found: ${t.workflow_id}`);let n=this.stmts.insertRun.run(t.job_id,t.workflow_id,t.team_id,t.current_state??null,r.active_version_id,t.parent_run_id??null,O()),s=this.stmts.getRun.get(n.lastInsertRowid);return(t.parent_run_id===void 0||t.parent_run_id===null)&&this.stmts.setJobRun.run(s.id,t.job_id),s}setJobRun(t,r){return this.stmts.setJobRun.run(r,t),this.getJob(t)}insertPromptDispatch(t){return this.stmts.insertPromptDispatch.run(t.prompt_id,t.project_id,t.job_id,t.text,t.context_json??null,O()),this.stmts.getPromptDispatch.get(t.prompt_id)}getPromptDispatch(t){return this.stmts.getPromptDispatch.get(t)??null}setPromptDispatchCompleted(t,r){return this.stmts.setPromptDispatchCompleted.run(r??O(),t),this.getPromptDispatch(t)}getWorkspace(t){return this.stmts.getWorkspace.get(t)??null}ensureWorkspace(t={}){let r=t.id??"default";this.stmts.ensureWorkspace.run(r,t.name??"Default workspace",t.idleThresholdMs??6e5,O());let n=this.getWorkspace(r);if(n===null)throw new Error(`workspace ${r} missing after upsert`);return n}listWebProjectsActive(t){return this.stmts.listWebProjectsActive.all(t)}getWebProject(t){return this.stmts.getWebProject.get(t)??null}insertWebProject(t){let r=O(),n=this.stmts.insertWebProject.run(t.workspace_id,t.name,t.repo_path,t.config_json??null,t.linked_v4_project_id??null,r,r),s=Number(n.lastInsertRowid),i=this.getWebProject(s);if(i===null)throw new Error(`web_project ${s} missing after insert`);return i}updateWebProject(t){let r=this.getWebProject(t.id);return r===null||r.deleted_at!==null?null:(this.stmts.updateWebProject.run(t.name??r.name,t.config_json===void 0?r.config_json:t.config_json,O(),t.id),this.getWebProject(t.id))}softDeleteWebProject(t){return this.stmts.softDeleteWebProject.run(O(),t).changes===1}loadMailboxCursor(t,r){return this.stmts.loadMailboxCursor.get(t,r)??null}saveMailboxCursor(t){this.stmts.saveMailboxCursor.run(t.user_id,t.mailbox_key,t.last_processed_version_id,t.last_processed_seq??null,t.last_processed_at)}addUsage(t){this.stmts.addUsage.run(t.user_id,t.device_id,t.period,t.put,t.get,t.list,t.updated_at)}loadUsage(t,r,n){return this.stmts.loadUsage.get(t,r,n)??null}sumUsageForPeriod(t,r){let n=this.stmts.sumUsageForPeriod.get(t,r);return{put:n?.put??0,get:n?.get??0,list:n?.list??0}}upsertRootTeam(t){this.stmts.upsertRootTeam.run(t.teamfile_path,t.name,t.raw_text,t.raw_sha256,t.registered_at,t.last_seeded_at)}getRootTeam(t){return this.stmts.getRootTeam.get(t)??null}listRootTeams(){return this.stmts.listRootTeams.all()}insertTeamChatLog(t){let r=this.stmts.insertTeamChatLog.run(t.root_teamfile,t.sender_teamfile,t.sender_alias,t.receiver_teamfile,t.receiver_alias,t.message,t.response,t.origin,t.status,t.error_detail,t.truncated,t.created_at);return Number(r.lastInsertRowid)}listTeamChatLog(t){return this.stmts.listTeamChatLog.all(t)}listTeamChatLogSinceId(t,r=500){return this.stmts.listTeamChatLogSinceId.all(t,Math.max(1,Math.trunc(r)))}getMaxTeamChatLogId(){return this.stmts.getMaxTeamChatLogId.get()?.max_id??0}loadTeamChatLogCursor(t){return this.stmts.loadTeamChatLogCursor.get(t)??null}saveTeamChatLogCursor(t){this.stmts.saveTeamChatLogCursor.run(t.cursor_key,t.last_pushed_id,t.updated_at)}startTrackedInvocation(t){let r=t.started_at??O(),n=t.holder_host??Gn(),s=t.last_heartbeat_at??r,i=this.stmts.insertTrackedInvocation.run(t.kind,t.origin,t.scope_teamfile??null,t.from_identity,t.target_teamfile??null,t.target_alias??null,t.root_teamfile??null,t.cwd??null,Pt(t.command),r,t.holder_pid??null,n,s,Pt(t.meta),t.launch_source??t.kind,t.request_payload??null);return this.getTrackedInvocation(Number(i.lastInsertRowid))}getTrackedInvocation(t){return this.stmts.getTrackedInvocation.get(t)??null}listAllRunningTrackedInvocations(){return this.stmts.listAllRunningTrackedInvocations.all()}finishTrackedInvocation(t,r){let n=r.ended_at??O();return this.stmts.finishTrackedInvocation.run(r.status,n,r.exit_code??null,r.signal??null,Pt(r.result_summary),Pt(r.error),r.team_chat_log_id??null,Pt(r.meta),n,t).changes!==1?null:this.getTrackedInvocation(t)}reclaimTrackedInvocationIfUnchanged(t,r,n){let s=n.ended_at??O();return this.stmts.reclaimTrackedInvocationIfUnchanged.run(n.status,s,n.exit_code??null,n.signal??null,Pt(n.result_summary),Pt(n.error),n.team_chat_log_id??null,Pt(n.meta),s,t,r.holder_pid,r.holder_host,r.started_at,r.last_heartbeat_at).changes!==1?null:this.getTrackedInvocation(t)}heartbeatTrackedInvocation(t,r=O()){return this.stmts.heartbeatTrackedInvocation.run(r,t).changes!==1?null:this.getTrackedInvocation(t)}updateTrackedInvocationRequestPayload(t,r){return this.stmts.updateTrackedInvocationRequestPayload.run(r,t).changes!==1?null:this.getTrackedInvocation(t)}listClaimableTerminalTrackedInvocations(t){let r=["status IN ('done', 'error', 'busy', 'cancelled')","ended_at IS NOT NULL","notified_by IS NULL"],n=[];t.from!==void 0&&(r.push("from_identity = ?"),n.push(t.from)),t.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(t.scope_teamfile));let s=Math.max(1,Math.min(1e3,Math.trunc(t.limit??100)));return n.push(s),this.db.prepare(`SELECT * FROM tracked_invocation WHERE ${r.join(" AND ")} ORDER BY ended_at ASC, id ASC LIMIT ?`).all(...n)}claimTrackedInvocationNotification(t,r,n=O()){return this.stmts.claimTrackedInvocationNotification.run(r,n,t).changes!==1?null:this.getTrackedInvocation(t)}listTrackedInvocations(t={}){let r=[],n=[];t.from!==void 0&&(r.push("from_identity = ?"),n.push(t.from)),t.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(t.scope_teamfile)),t.status!==void 0&&(r.push("status = ?"),n.push(t.status)),t.kind!==void 0&&(r.push("kind = ?"),n.push(t.kind)),t.origin!==void 0&&(r.push("origin = ?"),n.push(t.origin));let s=Math.max(1,Math.min(1e3,Math.trunc(t.limit??100)));n.push(s);let i=r.length===0?"":` WHERE ${r.join(" AND ")}`;return this.db.prepare(`SELECT * FROM tracked_invocation${i} ORDER BY started_at DESC, id DESC LIMIT ?`).all(...n)}maxTrackedInvocationId(t={}){let r=[],n=[];t.from!==void 0&&(r.push("from_identity = ?"),n.push(t.from)),t.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(t.scope_teamfile));let s=r.length===0?"":` WHERE ${r.join(" AND ")}`,i=this.db.prepare(`SELECT COALESCE(MAX(id), 0) AS max_id FROM tracked_invocation${s}`).get(...n);return Number(i?.max_id??0)}listRunningTrackedInvocations(t={}){return this.listTrackedInvocations({...t,status:"running"})}enqueueMail(t){return this.sendMailboxMessage(t)}sendMailboxMessage(t){let r=this.stmts.insertMailboxMessage.run(t.receiver_teamfile,t.receiver_alias,t.sender_teamfile??null,t.sender_alias??null,t.root_teamfile??null,Wn(t.payload),t.created_at??O(),t.remote_transport??null,t.remote_message_id??null,t.remote_thread_id??null,t.meta??null,t.message_type??"request",t.reply_mode??"pull",t.request_mailbox_id??null);return this.getMailboxMessage(Number(r.lastInsertRowid))}listEnqueuedRequestMailFromSender(t,r,n,s){return this.stmts.listEnqueuedRequestMailFromSender.all(t,r,n,s)}listEnqueuedResponseMailFromSender(t,r,n,s){return this.stmts.listEnqueuedResponseMailFromSender.all(t,r,n,s)}listRelayMailboxLanes(t){return this.stmts.listRelayMailboxLanes.all(Math.max(1,Math.trunc(t)))}markMailDelivered(t,r,n){let s=[...new Set(t.map(o=>Math.trunc(o)).filter(o=>Number.isInteger(o)&&o>0))];if(s.length===0)return 0;let i=Wn(r);this.db.exec("BEGIN IMMEDIATE");try{let o=0;for(let a of s)o+=this.stmts.markMailboxMessageDelivered.run(n,i,a).changes;return this.db.exec("COMMIT"),o}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}markRelayRequestDelivered(t,r,n){let s=Wn(r);this.db.exec("BEGIN IMMEDIATE");try{let i=0;for(let o of t)this.stmts.markMailboxMessageDeliveredIfUnchanged.run(n,s,o.id,o.delivering_at,o.delivery_holder_pid,o.delivery_holder_host).changes===1&&(i+=1);return this.db.exec("COMMIT"),i}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}markRelayRequestDeliveredAndEnqueueResponses(t,r,n){let s=Wn(r);this.db.exec("BEGIN IMMEDIATE");try{let i=0,o=0;for(let a of t){if(this.stmts.markMailboxMessageDeliveredIfUnchanged.run(n,s,a.id,a.delivering_at,a.delivery_holder_pid,a.delivery_holder_host).changes!==1||(i+=1,a.sender_teamfile===null||a.sender_alias===null))continue;let c=this.stmts.insertMailboxResponseIfAbsent.run(a.sender_teamfile,a.sender_alias,a.receiver_teamfile,a.receiver_alias,a.root_teamfile,s,n,null,null,null,null,a.reply_mode,a.id);o+=c.changes}return this.db.exec("COMMIT"),{marked:i,responses:o}}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}claimMailForDelivery(t,r,n=process.pid,s=Gn()){let i=[...new Set(t.map(o=>Math.trunc(o)).filter(o=>Number.isInteger(o)&&o>0))];if(i.length===0)return[];this.db.exec("BEGIN IMMEDIATE");try{let o=[];for(let a of i)if(this.stmts.claimMailboxMessageDelivery.run(r,n,s,a).changes===1){let c=this.getMailboxMessage(a);c!==null&&o.push(c)}return this.db.exec("COMMIT"),o}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}clearMailDelivery(t){let r=[...new Set(t.map(n=>Math.trunc(n)).filter(n=>Number.isInteger(n)&&n>0))];if(r.length===0)return 0;this.db.exec("BEGIN IMMEDIATE");try{let n=0;for(let s of r)n+=this.stmts.clearMailboxMessageDelivery.run(s).changes;return this.db.exec("COMMIT"),n}catch(n){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),n}}reclaimMailboxDeliveryIfUnchanged(t){return this.stmts.clearMailboxMessageDeliveryIfUnchanged.run(t.id,t.delivering_at,t.delivery_holder_pid,t.delivery_holder_host).changes!==1?null:this.getMailboxMessage(t.id)}reclaimStaleMailboxDeliveries(t){let r=this.stmts.listInFlightMailboxDeliveries.all(),n=[];this.db.exec("BEGIN IMMEDIATE");try{for(let s of r){if(!UI(s,t))continue;let i=this.reclaimMailboxDeliveryIfUnchanged(s);i!==null&&n.push(i)}return this.db.exec("COMMIT"),n}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}listDeliveredReceiptsForSender(t,r){return this.stmts.listDeliveredReceiptsForSender.all(t,r)}listOutboundPendingForSender(t,r){return this.stmts.listOutboundPendingForSender.all(t,r)}getMailboxMessage(t){return this.stmts.getMailboxMessage.get(t)??null}peekMailboxMessages(t,r=1e3){return this.stmts.listMailboxMessagesForReceiver.all(t.receiver_teamfile,t.receiver_alias,Math.max(1,Math.min(1e3,Math.trunc(r))))}recvMailboxMessages(t){return this.recvMailboxMessagesTxn(t.receiver_teamfile,t.receiver_alias)}updateTeamChatLogResponse(t,r){this.stmts.updateTeamChatLogResponse.run(r.response,r.status,r.error_detail,r.truncated,t)}getAgentInflight(t,r){return this.stmts.getAgentInflight.get(t,r)??null}listAgentInflight(){return this.stmts.listAgentInflight.all()}tryAcquireAgentInflight(t,r){return this.tryAcquireAgentInflightTxn(t,r)}clearAgentInflight(t,r){this.stmts.clearAgentInflight.run(t,r)}clearObservedTerminalAgentInflight(t,r,n){return this.stmts.clearObservedTerminalAgentInflight.run({receiver_teamfile:t,receiver_alias:r,observed_sender_teamfile:n.sender_teamfile,observed_sender_alias:n.sender_alias,observed_started_at:n.started_at,observed_holder_pid:n.holder_pid}).changes===1}releaseAgentInflight(t){this.db.exec("BEGIN IMMEDIATE");try{let r=this.getAgentInflight(t.receiver_teamfile,t.receiver_alias);if(r===null||r.sender_teamfile!==t.sender_teamfile||r.sender_alias!==t.sender_alias)return this.db.exec("COMMIT"),!1;if(r.active_count<=1)return this.stmts.clearAgentInflightIfSender.run(t.receiver_teamfile,t.receiver_alias,t.sender_teamfile,t.sender_alias),this.db.exec("COMMIT"),!0;let n=this.stmts.decrementAgentInflight.run(t.receiver_teamfile,t.receiver_alias,t.sender_teamfile,t.sender_alias);return this.db.exec("COMMIT"),n.changes===1}catch(r){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),r}}clearAgentInflightOlderThan(t){return this.stmts.clearAgentInflightOlderThan.run(t).changes}getTerminalLock(t,r){let n=this.stmts.getRuntimeState.get(Bn,Hn(t,r),qn);return n===void 0?null:Rm(n.data)}setTerminalLock(t){this.stmts.upsertRuntimeState.run(Bn,Hn(t.teamfile,t.alias),qn,JSON.stringify(t),t.last_heartbeat)}heartbeatTerminalLock(t,r,n,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getTerminalLock(t,r);if(i===null||i.lock_id!==n)return this.db.exec("COMMIT"),!1;let o={...i,last_heartbeat:s};return this.stmts.upsertRuntimeState.run(Bn,Hn(t,r),qn,JSON.stringify(o),s),this.db.exec("COMMIT"),!0}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}clearTerminalLock(t,r,n){this.db.exec("BEGIN IMMEDIATE");try{let s=this.getTerminalLock(t,r);if(s===null||s.lock_id!==n)return this.db.exec("COMMIT"),!1;let i=this.stmts.deleteRuntimeState.run(Bn,Hn(t,r),qn);return this.db.exec("COMMIT"),i.changes===1}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}getRuntimeProcessLock(t,r,n){let s=this.stmts.getRuntimeState.get(t,r,n);return s===void 0?null:PI(s.data)}tryAcquireRuntimeProcessLock(t,r,n,s,i=O()){this.db.exec("BEGIN IMMEDIATE");try{let o=this.getRuntimeProcessLock(t,r,n);if(o!==null&&!FI(o,s))return this.db.exec("COMMIT"),{acquired:!1,current:o};let a={lock_id:Mm(),holder_pid:process.pid,holder_host:Gn(),started_at:i,last_heartbeat:i};return this.stmts.upsertRuntimeState.run(t,r,n,JSON.stringify(a),i),this.db.exec("COMMIT"),{acquired:!0,lock:a,previous:o}}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}clearRuntimeProcessLock(t,r,n,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getRuntimeProcessLock(t,r,n);if(i===null||i.lock_id!==s)return this.db.exec("COMMIT"),!1;let o=this.stmts.deleteRuntimeState.run(t,r,n);return this.db.exec("COMMIT"),o.changes===1}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}getRun(t){return this.stmts.getRun.get(t)??null}setRunCurrentState(t,r){return this.stmts.setRunCurrentState.run(r,t),this.stmts.getRun.get(t)??null}setRunPausedState(t,r,n){return this.stmts.setRunPausedState.run(r,n,t),this.stmts.getRun.get(t)??null}setRunPendingEscalationDecision(t,r){return this.stmts.setRunPendingEscalationDecision.run(r,t),this.stmts.getRun.get(t)??null}setRunTerminalState(t,r){return this.stmts.setRunTerminalState.run(r,O(),t),this.stmts.getRun.get(t)??null}pauseJob(t){return this.stmts.pauseJob.run(t),this.getJob(t)}resumeRun(t,r){return this.resumeRunTxn(t,r,O())}insertStep(t){let r=this.stmts.insertStep.run(t.run_id,t.parent_step_id??null,t.state_name,t.outcome??null,t.status_detail??null,O());return this.stmts.getStep.get(r.lastInsertRowid)}finishStep(t,r,n){return this.stmts.finishStep.run(r??null,n??null,O(),t),this.stmts.getStep.get(t)??null}listStepsForRun(t){return this.stmts.listStepsForRun.all(t)}listLatestStepOutcomesByState(t){let r=this.stmts.listLatestStepOutcomesByState.all(t),n={};for(let s of r)n[s.state_name]=s.outcome;return n}insertSubmittedPr(t){let r=this.stmts.insertSubmittedPr.run(t.repo,t.pr_url,t.issue_url??null,t.local_path??null,t.branch??null,t.head_sha??null,t.status??"watching",t.submitted_at??O(),t.last_known_state??null,t.created_by_run_id??null);return this.stmts.getSubmittedPr.get(r.lastInsertRowid)}listSubmittedPrs(t){return t?.status!==void 0?this.stmts.listSubmittedPrsByStatus.all(t.status):this.stmts.listSubmittedPrs.all()}getSubmittedPr(t){return this.stmts.getSubmittedPr.get(t)??null}findSubmittedPrByUrl(t){return this.stmts.findSubmittedPrByUrl.get(t)??null}insertStepArtifact(t){let r=this.stmts.insertStepArtifact.run(t.step_id,t.kind,t.path??null,t.content??null,t.sha??null,t.provider_call_mode??null,O());return this.stmts.getStepArtifact.get(r.lastInsertRowid)}insertExternalObject(t){let n=this.stmts.insertExternalObject.run(t.type,t.provider,t.project_id,t.run_id??null,t.external_id,t.url??null,t.status??null,t.metadata??null,t.last_seen_at??null,O()).changes===1;return{row:this.stmts.findExternalObjectByUnique.get(t.provider,t.type,t.external_id),inserted:n}}insertExternalSignal(t){let r=this.stmts.insertExternalSignal.run(t.object_id,t.kind,t.source??null,t.occurred_at??null,t.payload??null,t.signal_hash??null,null,O()),n=r.changes===1;return{row:t.signal_hash===void 0||t.signal_hash===null?this.stmts.getExternalSignal.get(r.lastInsertRowid):this.stmts.findExternalSignalByUnique.get(t.object_id,t.kind,t.signal_hash),inserted:n}}raiseAttention(t){let r=this.stmts.insertAttention.run(t.kind,t.severity??"warn",t.project_id??null,t.run_id??null,t.external_object_id??null,t.requires_user===!0?1:0,t.payload??null,O());return this.stmts.getAttention.get(r.lastInsertRowid)}acknowledgeAttention(t){return this.stmts.ackAttention.run(O(),t),this.stmts.getAttention.get(t)??null}upsertDurableMemory(t){let r=O();return this.stmts.upsertDurableMemory.run(t.project_id,t.type,t.name,t.description??null,t.body,r,r),this.stmts.getDurableMemoryByName.get(t.project_id,t.name)}getDurableMemoryByName(t,r){return this.stmts.getDurableMemoryByName.get(t,r)??null}deleteDurableMemory(t,r){return this.stmts.deleteDurableMemory.run(t,r).changes>0}listDurableMemory(t,r){return r!==void 0?this.stmts.listDurableMemoryByType.all(t,r):this.stmts.listDurableMemory.all(t)}indexDurableMemory(t,r){return r!==void 0&&r.length>0?this.stmts.listDurableMemory.all(t).filter(s=>r.includes(s.type)).map(({name:s,description:i,type:o,updated_at:a})=>({name:s,description:i,type:o,updated_at:a})):this.stmts.listDurableMemory.all(t).map(({name:n,description:s,type:i,updated_at:o})=>({name:n,description:s,type:i,updated_at:o}))}recordSessionSize(t){let r=this.stmts.insertSessionSize.run(t.team_name,t.alias,t.sessionid,t.input_tokens??null,t.cache_tokens??null,t.output_tokens??null,t.total_tokens??null,t.observed_at??O());return this.stmts.getSessionSize.get(r.lastInsertRowid)}latestSessionSizes(){return this.stmts.latestSessionSizes.all()}sessionSizeHistory(t,r,n=20){return this.stmts.sessionSizeHistory.all(t,r,n)}insertSessionEvent(t){let r=this.stmts.insertSessionEvent.run(t.run_id,t.step_id??null,t.kind,t.timestamp_ms,t.payload,t.payload_truncated??0,t.overflow_artifact_id??null);return this.stmts.getSessionEvent.get(r.lastInsertRowid)}listSessionEvents(t,r){return r!==void 0?this.stmts.listSessionEventsSince.all(t,r):this.stmts.listSessionEvents.all(t)}listSessionEventsSince(t,r=1e3){return this.stmts.listAllEventsSince.all(t,r)}latestAgentCall(t){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call' ORDER BY id DESC LIMIT 1").get(t);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(t){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call'").all(t),n=0,s=0,i=0;for(let o of r)try{let a=JSON.parse(o.payload);typeof a.tokens_in=="number"&&(n+=a.tokens_in),typeof a.tokens_out=="number"&&(s+=a.tokens_out),i+=1}catch{}return{totalInputTokens:n,totalOutputTokens:s,agentCallCount:i}}addRollupValue(t){this.stmts.upsertRollupStat.run(t.run_id,t.step_id??null,t.metric_kind,t.value,t.bucket_start_ms,t.bucket_end_ms,t.updated_at)}listRollupStats(t){return this.stmts.listRollupStats.all(t)}getRollupCursor(){return this.stmts.getRollupCursor.get("last_event_id")?.value??0}setRollupCursor(t){this.stmts.setRollupCursor.run("last_event_id",t)}insertDriftSignal(t){let r=this.stmts.insertDriftSignal.run(t.team_member_id,t.project_id??null,t.signal_kind,t.severity,t.description,t.detected_at,t.expires_at??null,t.payload??null);return this.stmts.getDriftSignal.get(r.lastInsertRowid)}listDriftSignals(t={}){return t.team_member_id!==void 0&&t.unacked?this.stmts.listUnackedDriftByMember.all(t.team_member_id):t.team_member_id!==void 0?this.stmts.listDriftByMember.all(t.team_member_id):t.project_id!==void 0?this.stmts.listDriftByProject.all(t.project_id):this.stmts.listAllDrift.all()}hasUnackedDriftSignal(t,r,n){return this.stmts.findUnackedDrift.get(t,r??null,n)!==void 0}acknowledgeDriftSignal(t){return this.stmts.ackDriftSignal.run(Date.now(),t),this.stmts.getDriftSignal.get(t)??null}insertInteractiveSession(t){let r=Date.now();return this.stmts.insertInteractiveSession.run(t.run_id,t.step_id,t.state_name,t.status,r,r),this.stmts.getInteractiveSessionByStepId.get(t.step_id)}getInteractiveSessionByStepId(t){return this.stmts.getInteractiveSessionByStepId.get(t)??null}getInteractiveSessionByRunAndState(t,r){return this.stmts.getInteractiveSessionByRunAndState.get(t,r)??null}setInteractiveAgentOutput(t,r,n){this.stmts.setInteractiveAgentOutput.run(r,n,Date.now(),t)}resumeInteractive(t,r,n){return this.resumeInteractiveTxn(t,r,n,O())}resumeEscalation(t,r){return this.resumeEscalationTxn(t,r,O())}}});import{realpathSync as HI}from"node:fs";import{resolve as JI}from"node:path";function al(e){let t=JI(e);try{return HI(t)}catch{return t}}var Pm=T(()=>{"use strict"});import{platform as Fm}from"node:os";function Et(e){let t=new Vn;for(let r of e)t.registerAdapter(r);return t}var Vn,ll=T(()=>{"use strict";Pm();Vn=class{providers=[];adapters=new Map;register(t){this.providers.push(t)}async listAll(t){let r=[],n=t?.provider?this.providers.filter(o=>o.name===t.provider):this.providers,s=await Promise.all(n.map(o=>o.discoverSessions()));for(let o of s)r.push(...o);let i=r;if(t?.workspace){let o=al(t.workspace);i=i.filter(a=>al(a.cwd)===o)}if(t?.from){let o=t.from.getTime();i=i.filter(a=>a.modifiedAt.getTime()>=o)}if(t?.to){let o=t.to.getTime();i=i.filter(a=>a.modifiedAt.getTime()<=o)}return i.sort((o,a)=>a.modifiedAt.getTime()-o.modifiedAt.getTime()),t?.limit&&(i=i.slice(0,t.limit)),i}async getSession(t,r){let n=r?this.providers.filter(s=>s.name===r):this.providers;for(let s of n){let i=await s.loadSession(t);if(i)return i}return null}async resolveSession(t,r){let n=await this.resolveSessions(t,r);return n.length===1?n[0]:null}async resolveSessions(t,r){let n=r?this.providers.filter(i=>i.name===r):this.providers,s=[];for(let i of n){let o=await i.resolveSessionPath(t);o&&s.push({provider:i,filePath:o})}return s}getWatchTargets(){let t=Fm()==="darwin"||Fm()==="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:t,filePattern:s.filePattern});return r}async deleteSession(t,r){let n=await this.resolveSession(t,r);return n?n.provider.deleteSession(t):!1}registerAdapter(t){this.adapters.set(t.name,t),this.providers.push({name:t.name,discoverSessions:()=>t.discover(),loadSession:r=>t.load(r),resolveSessionPath:r=>t.resolvePath(r),deleteSession:r=>t.delete(r),getWatchPaths:()=>t.getWatchPaths?.()??[]})}getAdapter(t){return this.adapters.get(t)}getAllAdapters(){return[...this.adapters.values()]}}});import{createReadStream as Um}from"node:fs";import{createInterface as Wm}from"node:readline";import{stat as XI}from"node:fs/promises";import{homedir as GI}from"node:os";async function*We(e){let t=Um(e,{encoding:"utf-8"}),r=Wm({input:t,crlfDelay:1/0});try{for await(let n of r){let s=n.trim();if(s)try{yield JSON.parse(s)}catch{}}}finally{t.destroy()}}async function Ce(e,t){let r=[],n=Um(e,{encoding:"utf-8"}),s=Wm({input:n,crlfDelay:1/0});try{for await(let i of s){let o=i.trim();if(o){try{r.push(JSON.parse(o))}catch{}if(r.length>=t)break}}}finally{s.close(),n.destroy()}return r}async function Ne(e){let t=await XI(e);return{createdAt:t.birthtime,modifiedAt:t.mtime}}function fe(e){return e.replace(/\\n/g,`
|
|
1359
|
-
`).replace(/\\t/g," ").replace(/\\r/g,"\r")}function H(e,t){return e.length<=t?e:e.slice(0,t-3)+"..."}var be,nr=T(()=>{"use strict";be=GI()});import{readdir as ri,stat as Bm,unlink as VI}from"node:fs/promises";import{join as Kr,basename as qm}from"node:path";function KI(e){return e==="file-history-snapshot"||e==="progress"||e==="system"||e==="queue-operation"}function YI(e){if(e.type==="system"){let t=e.message?.content;if(typeof t=="string"&&t.trim())return fe(t.trim());if(t!==void 0)return JSON.stringify(t,null,2)}return e.type==="progress"&&e.data!==void 0?JSON.stringify(e.data,null,2):JSON.stringify(e,null,2)}async function Hm(e){let t=0,r=0,n=0,s=0,i=0,o=0,a;for await(let l of We(e))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;t++}}else if(l.type==="assistant"&&l.message){let c=l.message.content;if(Array.isArray(c))for(let u of c)u.type==="text"&&t++;let d=l.message.usage;if(d){let u=d.input_tokens||0,f=d.cache_creation_input_tokens||0,m=d.cache_read_input_tokens||0,p=d.output_tokens||0;r+=u+f+m,n+=m,s+=f,i+=p;let _=u+f+m;_&&(o=_),a={inputTokens:u,cacheWriteInputTokens:f,cachedInputTokens:m,outputTokens:p}}}}return{messageCount:t,totalInputTokens:r,totalCacheReadInputTokens:n,totalCacheWriteInputTokens:s,totalOutputTokens:i,lastInputTokens:o,lastTokenUsage:a}}var ni,Jm=T(()=>{"use strict";nr();ni=class{name="claude";claudeDir;projectsDir;constructor(t={}){this.claudeDir=t.claudeDir||Kr(be,".claude"),this.projectsDir=Kr(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let t=[],r;try{r=await ri(this.projectsDir)}catch{return t}for(let n of r){let s=Kr(this.projectsDir,n);if(!(await Bm(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await ri(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=qm(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=Kr(s,a);try{let d=await this.extractSummary(c,l);d&&t.push(d)}catch{}}}return t}async extractSummary(t,r){let n=await Ce(t,50),s=await Ne(t),i="",o,a,l,c,d,u;for(let m of n)if(!KI(m.type)&&(!i&&m.cwd&&(i=m.cwd),!o&&m.slug&&(o=m.slug),!a&&m.version&&(a=m.version),!u&&m.timestamp&&(u=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=H(p.trim(),80)),d=H(p.trim(),80)}}if(!i)return null;let f=await Hm(t);return{provider:"claude",sessionId:r,slug:o,cwd:i,createdAt:u||s.createdAt,modifiedAt:s.modifiedAt,model:l,cliVersion:a,startCommand:"claude",firstUserMessage:c,lastUserMessage:d,messageCount:f.messageCount,filePath:t,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(t){let r=await this.resolveSessionFile(t);if(!r)return null;let n=await Ne(r),s=[],i="",o,a,l,c,d,u,f,m=t;for await(let _ of We(r))if(_.type!=="file-history-snapshot"&&!_.isSidechain){if(!i&&_.cwd&&(i=_.cwd),!o&&_.slug&&(o=_.slug),!a&&_.version&&(a=_.version),!c&&_.gitBranch&&(c=_.gitBranch),!f&&_.timestamp&&(f=new Date(_.timestamp)),_.sessionId&&(m=_.sessionId),_.type==="system"||_.type==="progress"||_.type==="queue-operation"){s.push({role:"system",timestamp:new Date(_.timestamp||0),content:YI(_)});continue}if(_.type==="user"&&_.message){if(_.isMeta)continue;let g=new Date(_.timestamp||0),h=_.message.content;if(typeof h=="string"){if(h.includes("<command-name>")||h.includes("<local-command-"))continue;d||(d=H(h.trim(),80)),u=H(h.trim(),80),s.push({role:"user",timestamp:g,content:fe(h.trim())})}else if(Array.isArray(h)){for(let S of h)if(S.type==="tool_result"){let y=typeof S.content=="string"?fe(S.content):JSON.stringify(S.content);s.push({role:"tool_result",timestamp:g,content:y,toolCallId:S.tool_use_id})}}}if(_.type==="assistant"&&_.message){_.message.model&&(l=_.message.model);let g=new Date(_.timestamp||0),h=_.message.content;if(Array.isArray(h))for(let S of h)S.type==="text"&&S.text?s.push({role:"assistant",timestamp:g,content:fe(S.text),model:_.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:_.message.model}):S.type==="thinking"&&S.thinking&&s.push({role:"thinking",timestamp:g,content:S.thinking})}}if(!i)return null;let p=await Hm(r);return{provider:"claude",sessionId:m,slug:o,cwd:i,createdAt:f||n.createdAt,modifiedAt:n.modifiedAt,model:l,cliVersion:a,startCommand:"claude",gitBranch:c,firstUserMessage:d,lastUserMessage:u,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(t){return this.resolveSessionFile(t)}async deleteSession(t){let r=await this.resolveSessionFile(t);return r?(await VI(r),!0):!1}async resolveSessionFile(t){let r;try{r=await ri(this.projectsDir)}catch{return null}let n=[];for(let o of r){let a=Kr(this.projectsDir,o);if(!(await Bm(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await ri(a)}catch{continue}for(let d of c){if(!d.endsWith(".jsonl"))continue;let u=qm(d,".jsonl");/^[0-9a-f]{8}-/.test(u)&&n.push({filePath:Kr(a,d),fileSessionId:u})}}let s=n.find(o=>o.fileSessionId===t);if(s)return s.filePath;let i=n.filter(o=>o.fileSessionId.startsWith(t));if(i.length===1)return i[0].filePath;for(let o of n){let a=await Ce(o.filePath,20);for(let l of a)if(l.slug&&l.slug===t)return o.filePath}return null}}});function si(e){return"'"+e.replace(/'/g,"'\\''")+"'"}function ZI(e,t,r){if(!r)return"";let n=e.tools[t]??cl[t],s=n?.profiles?.[r]?.flags??cl[t]?.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 "${t}"`)}function Xm(e,t){return!!e.tools[t]}function Gm(e,t,r,n,s){let i=e.tools[t]??cl[t],o;if(i?.agent){let l=si(n);o=i.agent.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,l)}else{let l=zI[t];if(!l)throw new Error(`No agent command configured for tool "${t}"`);let c=l.argv.map(d=>d.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,n));if(l.mode==="stdin"){let d=c.map(si).join(" ");o=`printf '%s\\n' ${si(n)} | ${d}`}else o=c.map(si).join(" ")}let a=ZI(e,t,s);return a&&(o+=" "+a),o}var cl,zI,Vm=T(()=>{"use strict";cl={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:""}}}},zI={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 Km(e=process.env){let t=e.LMCTL_ONE_SHOT_TIMEOUT_MS;if(!t)return 6e5;let r=Number(t);return!Number.isFinite(r)||r<=0?6e5:r}var Ym=T(()=>{"use strict"});var QI,he,ii,Tt=T(()=>{"use strict";QI="ACK: waiting for explicit lmctl task.",he=`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: ${QI}`,ii=`send this exact lmctl seed instruction: "${he}"`});function Ft(e,t){let r={...e??process.env,PWD:t};return delete r.OLDPWD,r}function tN(e,t){return t===void 0||t.length===0?e:{...e??process.env,[Kn]:t}}function Be(e,t,r,n="chat"){return{...tN(Ft(e,t),r),[eN]:n}}var Kn,eN,it=T(()=>{"use strict";Kn="LMCTL_SELF_SESSIONID",eN="LMCTL_LAUNCH_SOURCE"});import{spawn as zm}from"node:child_process";import{mkdirSync as rN}from"node:fs";var dl,xe,Ut=T(()=>{"use strict";Vm();Ym();Tt();it();dl=class e extends Error{cancelReason;constructor(t,r){super(t),this.name="TurnAbortError",this.cancelReason=r,Object.setPrototypeOf(this,e.prototype)}},xe=class e{name;capabilities;injection;provider;binary;seedArgs;seedStdin;resumeTemplate;startTemplate;transportFn;constructor(t){this.name=t.provider.name,this.provider=t.provider,this.capabilities=t.capabilities,this.injection=t.injection,this.binary=t.binary,this.seedArgs=t.seedArgs,this.seedStdin=t.seedStdin,this.resumeTemplate=t.resumeTemplate,this.startTemplate=t.startTemplate,this.transportFn=t.transport}discover(){return this.provider.discoverSessions()}load(t){return this.provider.loadSession(t)}resolvePath(t){return this.provider.resolveSessionPath(t)}delete(t){return this.provider.deleteSession(t)}getWatchPaths(){return this.provider.getWatchPaths?.()??[]}seedArgsFor(t){let r=t?.prompt;return r===void 0?this.seedArgs:this.seedArgs.map(n=>n===he?r:n)}seed(t,r){return rN(t,{recursive:!0}),new Promise(n=>{let s;try{s=zm(this.binary,this.seedArgsFor(r),{cwd:t,env:Ft(void 0,t),stdio:["pipe","pipe","pipe"],timeout:6e4})}catch(a){return n({success:!1,error:a instanceof Error?a.message:String(a)})}let i="";s.stderr?.on("data",a=>{i+=a.toString()});let o=r?.prompt!==void 0&&this.seedStdin!==void 0?`${r.prompt}
|
|
1360
|
-
`:this.seedStdin;o&&s.stdin?.write(o),s.stdin?.end(),s.on("exit",a=>{n(a===0||a===null?{success:!0}:{success:!1,error:i.trim().slice(0,200)||`exit code ${a}`})}),s.on("error",a=>{n({success:!1,error:a.message})})})}resumeCommand(t,r){return this.resumeTemplate.replace(/\{\{session_id\}\}/g,t)}startCommand(t){return this.startTemplate}manualSeedHint(t){return{launchCommand:`cd ${t} && ${this.binary}`,postLaunchNote:
|
|
1358
|
+
`),...km(e),...bm(e)}}function qI(e,t){return t===void 0?{resumed:!1,reason:e}:{resumed:!1,reason:e,valid:t}}var ol,Ze=T(()=>{"use strict";Tm();Sm();Im();Am();Lm();sl();Xn();ol=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;recvMailboxMessagesTxn;constructor(t){t.pragma("foreign_keys = ON"),this.db=t,this.stmts=BI(t),this.claimTxn=t.transaction((r,n,s)=>{let i=this.stmts.selectClaimableJob.get(s,s,s);return i===void 0||this.stmts.claimJob.run(r,n,s,i.id,s,s,s).changes!==1?null:this.getJob(i.id)}),this.claimWithConcurrencyTxn=t.transaction((r,n,s,i)=>{let o=this.stmts.selectClaimableJobs.all(s,s,s);for(let a of o){let l=this.getJob(a.id);if(l===null)continue;let c=i(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=t.transaction((r,n,s,i,o)=>{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>=i)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<=i,d=a.status==="running"&&a.locked_until!==null&&a.locked_until<i;if(!c&&!d)return{claimed:!1,reason:"not_claimable",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let u=o(a);if(u.concurrency_key!==null&&(a.concurrency_key_resolved!==u.concurrency_key&&this.stmts.setJobConcurrencyKey.run(u.concurrency_key,a.id),(this.stmts.countRunningByConcurrencyKey.get(u.concurrency_key,i,a.id)?.count??0)>=Math.max(1,u.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,i,a.id,i,i,i).changes!==1){let p=this.getJob(a.id);return{claimed:!1,reason:p?.locked_until!==null&&p?.locked_until!==void 0&&p.locked_until>=i?"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=t.transaction((r,n,s)=>qI("state_not_found")),this.resumeInteractiveTxn=t.transaction((r,n,s,i)=>{let o=this.getInteractiveSessionByStepId(r);if(o===null)return{resumed:!1,reason:"not_found"};if(o.status!=="waiting_operator")return{resumed:!1,reason:"not_waiting_operator"};let a=this.getRun(o.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(),o.id),this.stmts.resumeRunState.run(o.state_name,a.id),this.stmts.requeuePausedJob.run(i,a.job_id),{resumed:!0,session:this.getInteractiveSessionByStepId(r),run:this.getRun(a.id),job:this.getJob(a.job_id)}}),this.resumeEscalationTxn=t.transaction((r,n,s)=>{let i=this.stmts.getAttention.get(r);if(i===void 0)return{resumed:!1,reason:"not_found"};if(i.kind!==ti)return{resumed:!1,reason:"wrong_kind"};if(i.acknowledged_at!==null)return{resumed:!1,reason:"already_acked"};if(i.run_id===null)return{resumed:!1,reason:"run_not_found"};let o=null,a=[];if(i.payload!==null)try{let d=JSON.parse(i.payload);d.step!==void 0&&typeof d.step.id=="string"&&d.step.id.length>0&&(o=d.step.id),Array.isArray(d.declared_outcomes)&&(a=d.declared_outcomes.filter(u=>typeof u=="string"))}catch{}if(o===null)return{resumed:!1,reason:"no_step"};let l=this.getRun(i.run_id);if(l===null)return{resumed:!1,reason:"run_not_found"};if(n!==Jn&&!a.includes(n))return{resumed:!1,reason:$m};let c={};if(l.pending_escalation_decision!==null)try{let d=JSON.parse(l.pending_escalation_decision);d!==null&&typeof d=="object"&&!Array.isArray(d)&&(c=d)}catch{c={}}return c[o]=n,this.stmts.setRunPendingEscalationDecision.run(JSON.stringify(c),l.id),this.stmts.resumeRunState.run(o,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,i=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}),o=i!==void 0?{acquired:!0,current:i}:{acquired:!1,current:this.getAgentInflight(r.receiver_teamfile,r.receiver_alias)??(()=>{throw new Error("agent_inflight conflict row disappeared during acquire")})()};return this.db.exec("COMMIT"),o}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}},this.recvMailboxMessagesTxn=t.transaction((r,n)=>{let s=this.stmts.listAllMailboxMessagesForReceiver.all(r,n);for(let i of s)this.stmts.deleteMailboxMessage.run(i.id);return s})}close(){this.db.close()}query(t,...r){let n=t.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(t).all(...r)}insertWorkflow(t){jm(t.name,t.definition,o=>this.getWorkflowByName(o));let r=this.stmts.insertWorkflow.run(t.name,t.version??1,t.definition_schema_version??1,t.definition,O()),n=this.getWorkflow(Number(r.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(n.id,n.version,t.definition,t.author??null,O());this.stmts.updateWorkflowActiveVersion.run(s.lastInsertRowid,n.id),(t.source_uri!=null||t.source_sha256!=null)&&this.stmts.setWorkflowSource.run(t.source_uri??null,t.source_sha256??null,n.id);let i=this.getWorkflow(n.id);return this.syncWorkflowTriggers(n.id,t.definition),i}upsertWorkflow(t){jm(t.name,t.definition,o=>this.getWorkflowByName(o));let r=this.getWorkflowByName(t.name);if(r===null)return this.insertWorkflow({name:t.name,definition_schema_version:t.definition_schema_version,definition:t.definition,author:t.author,source_uri:t.source_uri,source_sha256:t.source_sha256});let s=(this.stmts.getLatestWorkflowVersion.get(r.id)?.version??r.version)+1,i=this.stmts.insertWorkflowVersion.run(r.id,s,t.definition,t.author??null,O());return this.stmts.updateWorkflowActiveVersionDefinitionAndVersion.run(Number(i.lastInsertRowid),t.definition,t.definition_schema_version??r.definition_schema_version,s,r.id),(t.source_uri!=null||t.source_sha256!=null)&&this.stmts.setWorkflowSource.run(t.source_uri??null,t.source_sha256??null,r.id),this.syncWorkflowTriggers(r.id,t.definition),this.getWorkflow(r.id)}insertCompositionUnit(t){this.stmts.insertCompositionUnit.run(t.name,t.version,t.lang,t.source,t.source_sha,t.compiled_workflow_version_id,O())}getWorkflow(t){return this.stmts.getWorkflow.get(t)??null}getWorkflowByName(t,r){return(r===void 0?this.stmts.findWorkflowLatest.get(t):this.stmts.findWorkflowVersion.get(t,r))??null}findWorkflowByName(t,r){return this.getWorkflowByName(t,r)}insertWorkflowVersion(t,r,n){let i=(this.stmts.getLatestWorkflowVersion.get(t)?.version??0)+1,o=this.stmts.insertWorkflowVersion.run(t,i,r,n??null,O());return this.stmts.getWorkflowVersion.get(o.lastInsertRowid)}activateWorkflowVersion(t,r){let n=this.getWorkflowVersionById(r);if(n===null||n.workflow_id!==t)return null;let s=1;try{let i=JSON.parse(n.definition);typeof i.definition_schema_version=="number"&&(s=i.definition_schema_version)}catch{}return this.stmts.updateWorkflowActiveVersionAndDefinition.run(r,n.definition,s,t),this.syncWorkflowTriggers(t,n.definition),this.getWorkflow(t)}getWorkflowVersionById(t){return this.stmts.getWorkflowVersion.get(t)??null}listWorkflowVersions(t){return this.stmts.listWorkflowVersions.all(t)}upsertTriggerInstance(t){return this.stmts.upsertTriggerInstance.run(t.workflow_id,t.trigger_id,t.trigger_type,t.parameters,t.enabled===!1?0:1,O()),this.stmts.getTriggerInstanceByWorkflowAndId.get(t.workflow_id,t.trigger_id)}listTriggerInstancesForWorkflow(t){return this.stmts.listTriggerInstancesForWorkflow.all(t)}listEnabledTriggerInstances(){return this.stmts.listEnabledTriggerInstances.all()}setTriggerCursor(t,r){return this.stmts.setTriggerCursor.run(r,O(),t),this.stmts.getTriggerInstance.get(t)??null}setTriggerFailure(t,r){return this.stmts.setTriggerFailure.run(O(),r,t),this.stmts.getTriggerInstance.get(t)??null}syncWorkflowTriggers(t,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 i of s){if(i===null||typeof i!="object"||Array.isArray(i))continue;let o=i;typeof o.id!="string"||o.id.length===0||typeof o.type!="string"||o.type.length===0||this.upsertTriggerInstance({workflow_id:t,trigger_id:o.id,trigger_type:o.type,parameters:JSON.stringify(o.parameters??{})})}}insertTeam(t){let r=this.stmts.insertTeam.run(t.name,O());return this.stmts.getTeam.get(r.lastInsertRowid)}getTeam(t){return this.stmts.getTeam.get(t)??null}findTeamByName(t){return this.stmts.findTeamByName.get(t)??null}listTeams(){return this.stmts.listTeams.all()}insertTeamMember(t){let r=this.stmts.insertTeamMember.run(t.team_id,t.alias,t.role??"agent",t.provider,t.model??null,t.sessionid??null,t.sessiondir,O());return this.stmts.getTeamMember.get(r.lastInsertRowid)}listTeamMembers(t){return this.stmts.listTeamMembers.all(t)}findTeamMemberByAlias(t,r){return this.stmts.findTeamMemberByAlias.get(t,r)??null}updateTeamMemberSession(t,r){return this.stmts.updateTeamMemberSession.run(r,t),this.stmts.getTeamMember.get(t)??null}setMemberState(t,r,n){return this.stmts.setMemberState.run(r,n??null,O(),t),this.stmts.getTeamMember.get(t)??null}listMembersInState(t){return this.stmts.listMembersInState.all(t)}setMemberPromptSnapshot(t,r){return this.stmts.setMemberPromptSnapshot.run(r,t),this.stmts.getTeamMember.get(t)??null}setMemberProviderResolved(t,r){return this.stmts.setMemberProviderResolved.run(r,t),this.stmts.getTeamMember.get(t)??null}setMemberRolePrompt(t,r){return this.stmts.setMemberRolePrompt.run(r,t),this.stmts.getTeamMember.get(t)??null}updateTeamMemberMeta(t,r){let n=this.stmts.getTeamMember.get(t);if(n===void 0)return null;let s=Object.prototype.hasOwnProperty.call(r,"role_prompt"),i=Object.prototype.hasOwnProperty.call(r,"model"),o=Object.prototype.hasOwnProperty.call(r,"provider");return this.stmts.updateTeamMemberMeta.run(s?r.role_prompt??null:n.role_prompt,i?r.model??null:n.model,o?r.provider??n.provider:n.provider,t),this.stmts.getTeamMember.get(t)??null}insertTeamMemberCompanion(t){let r=this.stmts.insertTeamMemberCompanion.run(t.interpreter_id,t.companion_id,O());return this.stmts.getTeamMemberCompanion.get(r.lastInsertRowid)}insertProject(t){let r=this.stmts.insertProject.run(t.name,t.description??null,t.local_path,t.workflow_name,t.team_id,t.default_branch??null,t.intake_config??null,t.test_argv??null,t.test_command??null,t.durable_memory_mode??"folder",O());return this.stmts.getProject.get(r.lastInsertRowid)}listProjects(){return this.stmts.listProjects.all()}getProject(t){return this.stmts.getProject.get(t)??null}findProjectByName(t){return this.stmts.findProjectByName.get(t)??null}setProjectIntakeConfig(t,r){return this.stmts.setProjectIntakeConfig.run(r,t),this.stmts.getProject.get(t)??null}updateProjectSettings(t,r){let n=this.stmts.getProject.get(t);if(n===void 0)return null;let s=Object.prototype.hasOwnProperty.call(r,"local_path"),i=Object.prototype.hasOwnProperty.call(r,"durable_memory_mode"),o=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,i?r.durable_memory_mode:n.durable_memory_mode,o?r.default_branch??null:n.default_branch,a?r.intake_config??null:n.intake_config,t),this.stmts.getProject.get(t)??null}listProjectsWithIntakeEnabled(){return this.stmts.listProjectsWithIntakeConfig.all().filter(t=>{if(t.intake_config===null)return!1;try{let r=JSON.parse(t.intake_config);return typeof r=="object"&&r!==null&&!Array.isArray(r)&&r.scan_github_issues===!0}catch{return!1}})}getProjectByJob(t){return this.stmts.getProjectByJob.get(t)??null}insertProjectWorkflow(t){let r=t.condition??null,n=this.stmts.findProjectWorkflowUnique.get(t.project_id,t.workflow_id,r);if(n!==void 0)return n;let s=this.stmts.insertProjectWorkflow.run(t.project_id,t.workflow_id,r,t.parameters_override??null,t.enabled===!1?0:1,t.priority??100,O());return s.changes===1?this.stmts.getProjectWorkflow.get(s.lastInsertRowid):this.stmts.findProjectWorkflowUnique.get(t.project_id,t.workflow_id,r)}getProjectWorkflow(t){return this.stmts.getProjectWorkflow.get(t)??null}listProjectWorkflows(t,r={}){return r.enabled_only===!0?this.stmts.listEnabledProjectWorkflows.all(t):this.stmts.listProjectWorkflows.all(t)}removeProjectWorkflow(t){return this.stmts.removeProjectWorkflow.run(t).changes>0}setProjectWorkflowEnabled(t,r){return this.stmts.setProjectWorkflowEnabled.run(r?1:0,t),this.getProjectWorkflow(t)}createIssue(t){let r=O(),n=this.stmts.createIssue.run(t.project_id,t.title,t.body,t.severity??"medium",t.labels??null,t.ai_test_path??null,t.source_run_id??null,r,r);return this.stmts.getIssue.get(n.lastInsertRowid)}getIssue(t){return this.stmts.getIssue.get(t)??null}listIssues(t,r={}){return this.stmts.listIssuesForProject.all(t).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(t,r){return this.stmts.claimNextIssue.get(r,O(),t)??null}claimIssue(t,r){return this.stmts.claimIssue.get(r,O(),t)??null}closeIssue(t,r,n){let s=O(),i=this.stmts.closeIssue.get(r,n??null,s,s,t);if(i===void 0)throw new Error(`issue not found: ${t}`);return i}reopenIssue(t,r){let n=this.stmts.reopenIssue.get(r,O(),t);if(n===void 0)throw this.getIssue(t)===null?new Error(`issue not found: ${t}`):new Error(`issue ${t} is not closed`);return n}updateIssue(t,r){let n=this.getIssue(t);if(n===null)throw new Error(`issue not found: ${t}`);let s=Object.prototype.hasOwnProperty.call(r,"labels"),i=Object.prototype.hasOwnProperty.call(r,"ai_test_path"),o=this.stmts.updateIssue.get(r.title??n.title,r.body??n.body,r.severity??n.severity,s?r.labels??null:n.labels,i?r.ai_test_path??null:n.ai_test_path,O(),t);if(o===void 0)throw new Error(`issue not found: ${t}`);return o}listWorkflows(){return this.stmts.listWorkflows.all()}getOrCreateWebuiSession(t,r){let n=this.stmts.getWebuiSession.get(t);if(n!==void 0)return n;let s=O();return this.stmts.insertWebuiSession.run(t,r,"N1",null,null,null,null,"authenticated",s,s),this.stmts.getWebuiSession.get(t)}getWebuiSession(t){return this.stmts.getWebuiSession.get(t)??null}updateWebuiSessionTransition(t,r,n,s,i){if(this.stmts.updateWebuiSessionTransition.run(r,n,s,i,O(),t).changes===0)throw new Error(`webui_session not found: ${t}`);return this.stmts.getWebuiSession.get(t)}setWebuiSessionChatbot(t,r){if(this.stmts.setWebuiSessionChatbot.run(r,O(),t).changes===0)throw new Error(`webui_session not found: ${t}`);return this.stmts.getWebuiSession.get(t)}createChatbotSession(t,r){let n=Mm(),s=O();return this.stmts.insertChatbotSession.run(n,t,r??null,s,s,"active"),this.stmts.getChatbotSession.get(n)}getChatbotSession(t){return this.stmts.getChatbotSession.get(t)??null}listChatbotSessions(t){return this.stmts.listChatbotSessionsForUser.all(t)}appendChatbotMessage(t,r,n,s){let i=O(),o=this.stmts.insertChatbotMessage.run(t,r,n,s??null,i);return this.stmts.touchChatbotSession.run(i,t),this.stmts.getChatbotMessage.get(o.lastInsertRowid)}listChatbotMessages(t){return this.stmts.listChatbotMessages.all(t)}getConfig(t){return this.stmts.getConfig.get(t)?.value??null}setConfig(t,r){this.stmts.upsertConfig.run(t,r,O())}getConfigAll(){let t=this.stmts.listConfig.all(),r={};for(let n of t)r[n.key]=n.value;return r}enqueueJob(t){let r=this.stmts.insertJob.run(t.project_id,t.workflow_id_override??null,t.source,t.source_ref??null,t.payload??null,t.priority??0,t.available_at??O(),t.dedupe_key??null,t.concurrency_key??null,O());if(r.changes===1)return this.stmts.getJob.get(r.lastInsertRowid);if(t.dedupe_key===void 0||t.dedupe_key===null)throw new Error("job insert ignored without dedupe key");return this.stmts.findJobByDedupe.get(t.source,t.dedupe_key)}claimNextJob(t){let r=O(),n=new Date(Date.now()+t.lease_ms).toISOString();return this.claimTxn(t.worker_id,n,r)}claimNextJobWithConcurrency(t){let r=O(),n=new Date(Date.now()+t.lease_ms).toISOString();return this.claimWithConcurrencyTxn(t.worker_id,n,r,t.evaluator)}claimJobByIdWithConcurrency(t){let r=O(),n=new Date(Date.now()+t.lease_ms).toISOString();return this.claimByIdWithConcurrencyTxn(t.job_id,t.worker_id,n,r,t.evaluator)}releaseJob(t,r,n){let s=r==="queued"||r==="running"?null:O();return this.stmts.releaseJob.run(r,n??null,s,t),this.getJob(t)}getJob(t){return this.stmts.getJob.get(t)??null}findJobBySourceAndDedupe(t,r){return this.stmts.findJobByDedupe.get(t,r)??null}insertRun(t){let r=this.getWorkflow(t.workflow_id);if(r===null)throw new Error(`workflow not found: ${t.workflow_id}`);let n=this.stmts.insertRun.run(t.job_id,t.workflow_id,t.team_id,t.current_state??null,r.active_version_id,t.parent_run_id??null,O()),s=this.stmts.getRun.get(n.lastInsertRowid);return(t.parent_run_id===void 0||t.parent_run_id===null)&&this.stmts.setJobRun.run(s.id,t.job_id),s}setJobRun(t,r){return this.stmts.setJobRun.run(r,t),this.getJob(t)}insertPromptDispatch(t){return this.stmts.insertPromptDispatch.run(t.prompt_id,t.project_id,t.job_id,t.text,t.context_json??null,O()),this.stmts.getPromptDispatch.get(t.prompt_id)}getPromptDispatch(t){return this.stmts.getPromptDispatch.get(t)??null}setPromptDispatchCompleted(t,r){return this.stmts.setPromptDispatchCompleted.run(r??O(),t),this.getPromptDispatch(t)}getWorkspace(t){return this.stmts.getWorkspace.get(t)??null}ensureWorkspace(t={}){let r=t.id??"default";this.stmts.ensureWorkspace.run(r,t.name??"Default workspace",t.idleThresholdMs??6e5,O());let n=this.getWorkspace(r);if(n===null)throw new Error(`workspace ${r} missing after upsert`);return n}listWebProjectsActive(t){return this.stmts.listWebProjectsActive.all(t)}getWebProject(t){return this.stmts.getWebProject.get(t)??null}insertWebProject(t){let r=O(),n=this.stmts.insertWebProject.run(t.workspace_id,t.name,t.repo_path,t.config_json??null,t.linked_v4_project_id??null,r,r),s=Number(n.lastInsertRowid),i=this.getWebProject(s);if(i===null)throw new Error(`web_project ${s} missing after insert`);return i}updateWebProject(t){let r=this.getWebProject(t.id);return r===null||r.deleted_at!==null?null:(this.stmts.updateWebProject.run(t.name??r.name,t.config_json===void 0?r.config_json:t.config_json,O(),t.id),this.getWebProject(t.id))}softDeleteWebProject(t){return this.stmts.softDeleteWebProject.run(O(),t).changes===1}loadMailboxCursor(t,r){return this.stmts.loadMailboxCursor.get(t,r)??null}saveMailboxCursor(t){this.stmts.saveMailboxCursor.run(t.user_id,t.mailbox_key,t.last_processed_version_id,t.last_processed_seq??null,t.last_processed_at)}addUsage(t){this.stmts.addUsage.run(t.user_id,t.device_id,t.period,t.put,t.get,t.list,t.updated_at)}loadUsage(t,r,n){return this.stmts.loadUsage.get(t,r,n)??null}sumUsageForPeriod(t,r){let n=this.stmts.sumUsageForPeriod.get(t,r);return{put:n?.put??0,get:n?.get??0,list:n?.list??0}}upsertRootTeam(t){this.stmts.upsertRootTeam.run(t.teamfile_path,t.name,t.raw_text,t.raw_sha256,t.registered_at,t.last_seeded_at)}getRootTeam(t){return this.stmts.getRootTeam.get(t)??null}listRootTeams(){return this.stmts.listRootTeams.all()}insertTeamChatLog(t){let r=this.stmts.insertTeamChatLog.run(t.root_teamfile,t.sender_teamfile,t.sender_alias,t.receiver_teamfile,t.receiver_alias,t.message,t.response,t.origin,t.status,t.error_detail,t.truncated,t.created_at);return Number(r.lastInsertRowid)}listTeamChatLog(t){return this.stmts.listTeamChatLog.all(t)}listTeamChatLogSinceId(t,r=500){return this.stmts.listTeamChatLogSinceId.all(t,Math.max(1,Math.trunc(r)))}getMaxTeamChatLogId(){return this.stmts.getMaxTeamChatLogId.get()?.max_id??0}loadTeamChatLogCursor(t){return this.stmts.loadTeamChatLogCursor.get(t)??null}saveTeamChatLogCursor(t){this.stmts.saveTeamChatLogCursor.run(t.cursor_key,t.last_pushed_id,t.updated_at)}startTrackedInvocation(t){let r=t.started_at??O(),n=t.holder_host??Gn(),s=t.last_heartbeat_at??r,i=this.stmts.insertTrackedInvocation.run(t.kind,t.origin,t.scope_teamfile??null,t.from_identity,t.target_teamfile??null,t.target_alias??null,t.root_teamfile??null,t.cwd??null,Pt(t.command),r,t.holder_pid??null,n,s,Pt(t.meta),t.launch_source??t.kind,t.request_payload??null);return this.getTrackedInvocation(Number(i.lastInsertRowid))}getTrackedInvocation(t){return this.stmts.getTrackedInvocation.get(t)??null}listAllRunningTrackedInvocations(){return this.stmts.listAllRunningTrackedInvocations.all()}finishTrackedInvocation(t,r){let n=r.ended_at??O();return this.stmts.finishTrackedInvocation.run(r.status,n,r.exit_code??null,r.signal??null,Pt(r.result_summary),Pt(r.error),r.team_chat_log_id??null,Pt(r.meta),n,t).changes!==1?null:this.getTrackedInvocation(t)}reclaimTrackedInvocationIfUnchanged(t,r,n){let s=n.ended_at??O();return this.stmts.reclaimTrackedInvocationIfUnchanged.run(n.status,s,n.exit_code??null,n.signal??null,Pt(n.result_summary),Pt(n.error),n.team_chat_log_id??null,Pt(n.meta),s,t,r.holder_pid,r.holder_host,r.started_at,r.last_heartbeat_at).changes!==1?null:this.getTrackedInvocation(t)}heartbeatTrackedInvocation(t,r=O()){return this.stmts.heartbeatTrackedInvocation.run(r,t).changes!==1?null:this.getTrackedInvocation(t)}updateTrackedInvocationRequestPayload(t,r){return this.stmts.updateTrackedInvocationRequestPayload.run(r,t).changes!==1?null:this.getTrackedInvocation(t)}listClaimableTerminalTrackedInvocations(t){let r=["status IN ('done', 'error', 'busy', 'cancelled')","ended_at IS NOT NULL","notified_by IS NULL"],n=[];t.from!==void 0&&(r.push("from_identity = ?"),n.push(t.from)),t.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(t.scope_teamfile));let s=Math.max(1,Math.min(1e3,Math.trunc(t.limit??100)));return n.push(s),this.db.prepare(`SELECT * FROM tracked_invocation WHERE ${r.join(" AND ")} ORDER BY ended_at ASC, id ASC LIMIT ?`).all(...n)}claimTrackedInvocationNotification(t,r,n=O()){return this.stmts.claimTrackedInvocationNotification.run(r,n,t).changes!==1?null:this.getTrackedInvocation(t)}listTrackedInvocations(t={}){let r=[],n=[];t.from!==void 0&&(r.push("from_identity = ?"),n.push(t.from)),t.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(t.scope_teamfile)),t.status!==void 0&&(r.push("status = ?"),n.push(t.status)),t.kind!==void 0&&(r.push("kind = ?"),n.push(t.kind)),t.origin!==void 0&&(r.push("origin = ?"),n.push(t.origin));let s=Math.max(1,Math.min(1e3,Math.trunc(t.limit??100)));n.push(s);let i=r.length===0?"":` WHERE ${r.join(" AND ")}`;return this.db.prepare(`SELECT * FROM tracked_invocation${i} ORDER BY started_at DESC, id DESC LIMIT ?`).all(...n)}maxTrackedInvocationId(t={}){let r=[],n=[];t.from!==void 0&&(r.push("from_identity = ?"),n.push(t.from)),t.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(t.scope_teamfile));let s=r.length===0?"":` WHERE ${r.join(" AND ")}`,i=this.db.prepare(`SELECT COALESCE(MAX(id), 0) AS max_id FROM tracked_invocation${s}`).get(...n);return Number(i?.max_id??0)}listRunningTrackedInvocations(t={}){return this.listTrackedInvocations({...t,status:"running"})}enqueueMail(t){return this.sendMailboxMessage(t)}sendMailboxMessage(t){let r=this.stmts.insertMailboxMessage.run(t.receiver_teamfile,t.receiver_alias,t.sender_teamfile??null,t.sender_alias??null,t.root_teamfile??null,Wn(t.payload),t.created_at??O(),t.remote_transport??null,t.remote_message_id??null,t.remote_thread_id??null,t.meta??null,t.message_type??"request",t.reply_mode??"pull",t.request_mailbox_id??null);return this.getMailboxMessage(Number(r.lastInsertRowid))}listEnqueuedRequestMailFromSender(t,r,n,s){return this.stmts.listEnqueuedRequestMailFromSender.all(t,r,n,s)}listEnqueuedResponseMailFromSender(t,r,n,s){return this.stmts.listEnqueuedResponseMailFromSender.all(t,r,n,s)}listRelayMailboxLanes(t){return this.stmts.listRelayMailboxLanes.all(Math.max(1,Math.trunc(t)))}markMailDelivered(t,r,n){let s=[...new Set(t.map(o=>Math.trunc(o)).filter(o=>Number.isInteger(o)&&o>0))];if(s.length===0)return 0;let i=Wn(r);this.db.exec("BEGIN IMMEDIATE");try{let o=0;for(let a of s)o+=this.stmts.markMailboxMessageDelivered.run(n,i,a).changes;return this.db.exec("COMMIT"),o}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}markRelayRequestDelivered(t,r,n){let s=Wn(r);this.db.exec("BEGIN IMMEDIATE");try{let i=0;for(let o of t)this.stmts.markMailboxMessageDeliveredIfUnchanged.run(n,s,o.id,o.delivering_at,o.delivery_holder_pid,o.delivery_holder_host).changes===1&&(i+=1);return this.db.exec("COMMIT"),i}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}markRelayRequestDeliveredAndEnqueueResponses(t,r,n){let s=Wn(r);this.db.exec("BEGIN IMMEDIATE");try{let i=0,o=0;for(let a of t){if(this.stmts.markMailboxMessageDeliveredIfUnchanged.run(n,s,a.id,a.delivering_at,a.delivery_holder_pid,a.delivery_holder_host).changes!==1||(i+=1,a.sender_teamfile===null||a.sender_alias===null))continue;let c=this.stmts.insertMailboxResponseIfAbsent.run(a.sender_teamfile,a.sender_alias,a.receiver_teamfile,a.receiver_alias,a.root_teamfile,s,n,null,null,null,null,a.reply_mode,a.id);o+=c.changes}return this.db.exec("COMMIT"),{marked:i,responses:o}}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}claimMailForDelivery(t,r,n=process.pid,s=Gn()){let i=[...new Set(t.map(o=>Math.trunc(o)).filter(o=>Number.isInteger(o)&&o>0))];if(i.length===0)return[];this.db.exec("BEGIN IMMEDIATE");try{let o=[];for(let a of i)if(this.stmts.claimMailboxMessageDelivery.run(r,n,s,a).changes===1){let c=this.getMailboxMessage(a);c!==null&&o.push(c)}return this.db.exec("COMMIT"),o}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}clearMailDelivery(t){let r=[...new Set(t.map(n=>Math.trunc(n)).filter(n=>Number.isInteger(n)&&n>0))];if(r.length===0)return 0;this.db.exec("BEGIN IMMEDIATE");try{let n=0;for(let s of r)n+=this.stmts.clearMailboxMessageDelivery.run(s).changes;return this.db.exec("COMMIT"),n}catch(n){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),n}}reclaimMailboxDeliveryIfUnchanged(t){return this.stmts.clearMailboxMessageDeliveryIfUnchanged.run(t.id,t.delivering_at,t.delivery_holder_pid,t.delivery_holder_host).changes!==1?null:this.getMailboxMessage(t.id)}reclaimStaleMailboxDeliveries(t){let r=this.stmts.listInFlightMailboxDeliveries.all(),n=[];this.db.exec("BEGIN IMMEDIATE");try{for(let s of r){if(!UI(s,t))continue;let i=this.reclaimMailboxDeliveryIfUnchanged(s);i!==null&&n.push(i)}return this.db.exec("COMMIT"),n}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}listDeliveredReceiptsForSender(t,r){return this.stmts.listDeliveredReceiptsForSender.all(t,r)}listOutboundPendingForSender(t,r){return this.stmts.listOutboundPendingForSender.all(t,r)}getMailboxMessage(t){return this.stmts.getMailboxMessage.get(t)??null}peekMailboxMessages(t,r=1e3){return this.stmts.listMailboxMessagesForReceiver.all(t.receiver_teamfile,t.receiver_alias,Math.max(1,Math.min(1e3,Math.trunc(r))))}recvMailboxMessages(t){return this.recvMailboxMessagesTxn(t.receiver_teamfile,t.receiver_alias)}updateTeamChatLogResponse(t,r){this.stmts.updateTeamChatLogResponse.run(r.response,r.status,r.error_detail,r.truncated,t)}getAgentInflight(t,r){return this.stmts.getAgentInflight.get(t,r)??null}listAgentInflight(){return this.stmts.listAgentInflight.all()}tryAcquireAgentInflight(t,r){return this.tryAcquireAgentInflightTxn(t,r)}clearAgentInflight(t,r){this.stmts.clearAgentInflight.run(t,r)}clearObservedTerminalAgentInflight(t,r,n){return this.stmts.clearObservedTerminalAgentInflight.run({receiver_teamfile:t,receiver_alias:r,observed_sender_teamfile:n.sender_teamfile,observed_sender_alias:n.sender_alias,observed_started_at:n.started_at,observed_holder_pid:n.holder_pid}).changes===1}releaseAgentInflight(t){this.db.exec("BEGIN IMMEDIATE");try{let r=this.getAgentInflight(t.receiver_teamfile,t.receiver_alias);if(r===null||r.sender_teamfile!==t.sender_teamfile||r.sender_alias!==t.sender_alias)return this.db.exec("COMMIT"),!1;if(r.active_count<=1)return this.stmts.clearAgentInflightIfSender.run(t.receiver_teamfile,t.receiver_alias,t.sender_teamfile,t.sender_alias),this.db.exec("COMMIT"),!0;let n=this.stmts.decrementAgentInflight.run(t.receiver_teamfile,t.receiver_alias,t.sender_teamfile,t.sender_alias);return this.db.exec("COMMIT"),n.changes===1}catch(r){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),r}}clearAgentInflightOlderThan(t){return this.stmts.clearAgentInflightOlderThan.run(t).changes}getTerminalLock(t,r){let n=this.stmts.getRuntimeState.get(Bn,Hn(t,r),qn);return n===void 0?null:Rm(n.data)}setTerminalLock(t){this.stmts.upsertRuntimeState.run(Bn,Hn(t.teamfile,t.alias),qn,JSON.stringify(t),t.last_heartbeat)}heartbeatTerminalLock(t,r,n,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getTerminalLock(t,r);if(i===null||i.lock_id!==n)return this.db.exec("COMMIT"),!1;let o={...i,last_heartbeat:s};return this.stmts.upsertRuntimeState.run(Bn,Hn(t,r),qn,JSON.stringify(o),s),this.db.exec("COMMIT"),!0}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}clearTerminalLock(t,r,n){this.db.exec("BEGIN IMMEDIATE");try{let s=this.getTerminalLock(t,r);if(s===null||s.lock_id!==n)return this.db.exec("COMMIT"),!1;let i=this.stmts.deleteRuntimeState.run(Bn,Hn(t,r),qn);return this.db.exec("COMMIT"),i.changes===1}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}getRuntimeProcessLock(t,r,n){let s=this.stmts.getRuntimeState.get(t,r,n);return s===void 0?null:PI(s.data)}tryAcquireRuntimeProcessLock(t,r,n,s,i=O()){this.db.exec("BEGIN IMMEDIATE");try{let o=this.getRuntimeProcessLock(t,r,n);if(o!==null&&!FI(o,s))return this.db.exec("COMMIT"),{acquired:!1,current:o};let a={lock_id:Mm(),holder_pid:process.pid,holder_host:Gn(),started_at:i,last_heartbeat:i};return this.stmts.upsertRuntimeState.run(t,r,n,JSON.stringify(a),i),this.db.exec("COMMIT"),{acquired:!0,lock:a,previous:o}}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}clearRuntimeProcessLock(t,r,n,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getRuntimeProcessLock(t,r,n);if(i===null||i.lock_id!==s)return this.db.exec("COMMIT"),!1;let o=this.stmts.deleteRuntimeState.run(t,r,n);return this.db.exec("COMMIT"),o.changes===1}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}getRun(t){return this.stmts.getRun.get(t)??null}setRunCurrentState(t,r){return this.stmts.setRunCurrentState.run(r,t),this.stmts.getRun.get(t)??null}setRunPausedState(t,r,n){return this.stmts.setRunPausedState.run(r,n,t),this.stmts.getRun.get(t)??null}setRunPendingEscalationDecision(t,r){return this.stmts.setRunPendingEscalationDecision.run(r,t),this.stmts.getRun.get(t)??null}setRunTerminalState(t,r){return this.stmts.setRunTerminalState.run(r,O(),t),this.stmts.getRun.get(t)??null}pauseJob(t){return this.stmts.pauseJob.run(t),this.getJob(t)}resumeRun(t,r){return this.resumeRunTxn(t,r,O())}insertStep(t){let r=this.stmts.insertStep.run(t.run_id,t.parent_step_id??null,t.state_name,t.outcome??null,t.status_detail??null,O());return this.stmts.getStep.get(r.lastInsertRowid)}finishStep(t,r,n){return this.stmts.finishStep.run(r??null,n??null,O(),t),this.stmts.getStep.get(t)??null}listStepsForRun(t){return this.stmts.listStepsForRun.all(t)}listLatestStepOutcomesByState(t){let r=this.stmts.listLatestStepOutcomesByState.all(t),n={};for(let s of r)n[s.state_name]=s.outcome;return n}insertSubmittedPr(t){let r=this.stmts.insertSubmittedPr.run(t.repo,t.pr_url,t.issue_url??null,t.local_path??null,t.branch??null,t.head_sha??null,t.status??"watching",t.submitted_at??O(),t.last_known_state??null,t.created_by_run_id??null);return this.stmts.getSubmittedPr.get(r.lastInsertRowid)}listSubmittedPrs(t){return t?.status!==void 0?this.stmts.listSubmittedPrsByStatus.all(t.status):this.stmts.listSubmittedPrs.all()}getSubmittedPr(t){return this.stmts.getSubmittedPr.get(t)??null}findSubmittedPrByUrl(t){return this.stmts.findSubmittedPrByUrl.get(t)??null}insertStepArtifact(t){let r=this.stmts.insertStepArtifact.run(t.step_id,t.kind,t.path??null,t.content??null,t.sha??null,t.provider_call_mode??null,O());return this.stmts.getStepArtifact.get(r.lastInsertRowid)}insertExternalObject(t){let n=this.stmts.insertExternalObject.run(t.type,t.provider,t.project_id,t.run_id??null,t.external_id,t.url??null,t.status??null,t.metadata??null,t.last_seen_at??null,O()).changes===1;return{row:this.stmts.findExternalObjectByUnique.get(t.provider,t.type,t.external_id),inserted:n}}insertExternalSignal(t){let r=this.stmts.insertExternalSignal.run(t.object_id,t.kind,t.source??null,t.occurred_at??null,t.payload??null,t.signal_hash??null,null,O()),n=r.changes===1;return{row:t.signal_hash===void 0||t.signal_hash===null?this.stmts.getExternalSignal.get(r.lastInsertRowid):this.stmts.findExternalSignalByUnique.get(t.object_id,t.kind,t.signal_hash),inserted:n}}raiseAttention(t){let r=this.stmts.insertAttention.run(t.kind,t.severity??"warn",t.project_id??null,t.run_id??null,t.external_object_id??null,t.requires_user===!0?1:0,t.payload??null,O());return this.stmts.getAttention.get(r.lastInsertRowid)}acknowledgeAttention(t){return this.stmts.ackAttention.run(O(),t),this.stmts.getAttention.get(t)??null}upsertDurableMemory(t){let r=O();return this.stmts.upsertDurableMemory.run(t.project_id,t.type,t.name,t.description??null,t.body,r,r),this.stmts.getDurableMemoryByName.get(t.project_id,t.name)}getDurableMemoryByName(t,r){return this.stmts.getDurableMemoryByName.get(t,r)??null}deleteDurableMemory(t,r){return this.stmts.deleteDurableMemory.run(t,r).changes>0}listDurableMemory(t,r){return r!==void 0?this.stmts.listDurableMemoryByType.all(t,r):this.stmts.listDurableMemory.all(t)}indexDurableMemory(t,r){return r!==void 0&&r.length>0?this.stmts.listDurableMemory.all(t).filter(s=>r.includes(s.type)).map(({name:s,description:i,type:o,updated_at:a})=>({name:s,description:i,type:o,updated_at:a})):this.stmts.listDurableMemory.all(t).map(({name:n,description:s,type:i,updated_at:o})=>({name:n,description:s,type:i,updated_at:o}))}recordSessionSize(t){let r=this.stmts.insertSessionSize.run(t.team_name,t.alias,t.sessionid,t.input_tokens??null,t.cache_tokens??null,t.output_tokens??null,t.total_tokens??null,t.observed_at??O());return this.stmts.getSessionSize.get(r.lastInsertRowid)}latestSessionSizes(){return this.stmts.latestSessionSizes.all()}sessionSizeHistory(t,r,n=20){return this.stmts.sessionSizeHistory.all(t,r,n)}insertSessionEvent(t){let r=this.stmts.insertSessionEvent.run(t.run_id,t.step_id??null,t.kind,t.timestamp_ms,t.payload,t.payload_truncated??0,t.overflow_artifact_id??null);return this.stmts.getSessionEvent.get(r.lastInsertRowid)}listSessionEvents(t,r){return r!==void 0?this.stmts.listSessionEventsSince.all(t,r):this.stmts.listSessionEvents.all(t)}listSessionEventsSince(t,r=1e3){return this.stmts.listAllEventsSince.all(t,r)}latestAgentCall(t){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call' ORDER BY id DESC LIMIT 1").get(t);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(t){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call'").all(t),n=0,s=0,i=0;for(let o of r)try{let a=JSON.parse(o.payload);typeof a.tokens_in=="number"&&(n+=a.tokens_in),typeof a.tokens_out=="number"&&(s+=a.tokens_out),i+=1}catch{}return{totalInputTokens:n,totalOutputTokens:s,agentCallCount:i}}addRollupValue(t){this.stmts.upsertRollupStat.run(t.run_id,t.step_id??null,t.metric_kind,t.value,t.bucket_start_ms,t.bucket_end_ms,t.updated_at)}listRollupStats(t){return this.stmts.listRollupStats.all(t)}getRollupCursor(){return this.stmts.getRollupCursor.get("last_event_id")?.value??0}setRollupCursor(t){this.stmts.setRollupCursor.run("last_event_id",t)}insertDriftSignal(t){let r=this.stmts.insertDriftSignal.run(t.team_member_id,t.project_id??null,t.signal_kind,t.severity,t.description,t.detected_at,t.expires_at??null,t.payload??null);return this.stmts.getDriftSignal.get(r.lastInsertRowid)}listDriftSignals(t={}){return t.team_member_id!==void 0&&t.unacked?this.stmts.listUnackedDriftByMember.all(t.team_member_id):t.team_member_id!==void 0?this.stmts.listDriftByMember.all(t.team_member_id):t.project_id!==void 0?this.stmts.listDriftByProject.all(t.project_id):this.stmts.listAllDrift.all()}hasUnackedDriftSignal(t,r,n){return this.stmts.findUnackedDrift.get(t,r??null,n)!==void 0}acknowledgeDriftSignal(t){return this.stmts.ackDriftSignal.run(Date.now(),t),this.stmts.getDriftSignal.get(t)??null}insertInteractiveSession(t){let r=Date.now();return this.stmts.insertInteractiveSession.run(t.run_id,t.step_id,t.state_name,t.status,r,r),this.stmts.getInteractiveSessionByStepId.get(t.step_id)}getInteractiveSessionByStepId(t){return this.stmts.getInteractiveSessionByStepId.get(t)??null}getInteractiveSessionByRunAndState(t,r){return this.stmts.getInteractiveSessionByRunAndState.get(t,r)??null}setInteractiveAgentOutput(t,r,n){this.stmts.setInteractiveAgentOutput.run(r,n,Date.now(),t)}resumeInteractive(t,r,n){return this.resumeInteractiveTxn(t,r,n,O())}resumeEscalation(t,r){return this.resumeEscalationTxn(t,r,O())}}});import{realpathSync as HI}from"node:fs";import{resolve as JI}from"node:path";function al(e){let t=JI(e);try{return HI(t)}catch{return t}}var Pm=T(()=>{"use strict"});import{platform as Fm}from"node:os";function Et(e){let t=new Vn;for(let r of e)t.registerAdapter(r);return t}var Vn,ll=T(()=>{"use strict";Pm();Vn=class{providers=[];adapters=new Map;register(t){this.providers.push(t)}async listAll(t){let r=[],n=t?.provider?this.providers.filter(o=>o.name===t.provider):this.providers,s=await Promise.all(n.map(o=>o.discoverSessions()));for(let o of s)r.push(...o);let i=r;if(t?.workspace){let o=al(t.workspace);i=i.filter(a=>al(a.cwd)===o)}if(t?.from){let o=t.from.getTime();i=i.filter(a=>a.modifiedAt.getTime()>=o)}if(t?.to){let o=t.to.getTime();i=i.filter(a=>a.modifiedAt.getTime()<=o)}return i.sort((o,a)=>a.modifiedAt.getTime()-o.modifiedAt.getTime()),t?.limit&&(i=i.slice(0,t.limit)),i}async getSession(t,r){let n=r?this.providers.filter(s=>s.name===r):this.providers;for(let s of n){let i=await s.loadSession(t);if(i)return i}return null}async resolveSession(t,r){let n=await this.resolveSessions(t,r);return n.length===1?n[0]:null}async resolveSessions(t,r){let n=r?this.providers.filter(i=>i.name===r):this.providers,s=[];for(let i of n){let o=await i.resolveSessionPath(t);o&&s.push({provider:i,filePath:o})}return s}getWatchTargets(){let t=Fm()==="darwin"||Fm()==="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:t,filePattern:s.filePattern});return r}async deleteSession(t,r){let n=await this.resolveSession(t,r);return n?n.provider.deleteSession(t):!1}registerAdapter(t){this.adapters.set(t.name,t),this.providers.push({name:t.name,discoverSessions:()=>t.discover(),loadSession:r=>t.load(r),resolveSessionPath:r=>t.resolvePath(r),deleteSession:r=>t.delete(r),getWatchPaths:()=>t.getWatchPaths?.()??[]})}getAdapter(t){return this.adapters.get(t)}getAllAdapters(){return[...this.adapters.values()]}}});import{createReadStream as Um}from"node:fs";import{createInterface as Wm}from"node:readline";import{stat as XI}from"node:fs/promises";import{homedir as GI}from"node:os";async function*We(e){let t=Um(e,{encoding:"utf-8"}),r=Wm({input:t,crlfDelay:1/0});try{for await(let n of r){let s=n.trim();if(s)try{yield JSON.parse(s)}catch{}}}finally{t.destroy()}}async function Ce(e,t){let r=[],n=Um(e,{encoding:"utf-8"}),s=Wm({input:n,crlfDelay:1/0});try{for await(let i of s){let o=i.trim();if(o){try{r.push(JSON.parse(o))}catch{}if(r.length>=t)break}}}finally{s.close(),n.destroy()}return r}async function Ne(e){let t=await XI(e);return{createdAt:t.birthtime,modifiedAt:t.mtime}}function fe(e){return e.replace(/\\n/g,`
|
|
1359
|
+
`).replace(/\\t/g," ").replace(/\\r/g,"\r")}function J(e,t){return e.length<=t?e:e.slice(0,t-3)+"..."}var be,nr=T(()=>{"use strict";be=GI()});import{readdir as ni,stat as Bm,unlink as VI}from"node:fs/promises";import{join as Kr,basename as qm}from"node:path";function KI(e){return e==="file-history-snapshot"||e==="progress"||e==="system"||e==="queue-operation"}function YI(e){if(e.type==="system"){let t=e.message?.content;if(typeof t=="string"&&t.trim())return fe(t.trim());if(t!==void 0)return JSON.stringify(t,null,2)}return e.type==="progress"&&e.data!==void 0?JSON.stringify(e.data,null,2):JSON.stringify(e,null,2)}async function Hm(e){let t=0,r=0,n=0,s=0,i=0,o=0,a;for await(let l of We(e))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;t++}}else if(l.type==="assistant"&&l.message){let c=l.message.content;if(Array.isArray(c))for(let u of c)u.type==="text"&&t++;let d=l.message.usage;if(d){let u=d.input_tokens||0,f=d.cache_creation_input_tokens||0,m=d.cache_read_input_tokens||0,p=d.output_tokens||0;r+=u+f+m,n+=m,s+=f,i+=p;let _=u+f+m;_&&(o=_),a={inputTokens:u,cacheWriteInputTokens:f,cachedInputTokens:m,outputTokens:p}}}}return{messageCount:t,totalInputTokens:r,totalCacheReadInputTokens:n,totalCacheWriteInputTokens:s,totalOutputTokens:i,lastInputTokens:o,lastTokenUsage:a}}var si,Jm=T(()=>{"use strict";nr();si=class{name="claude";claudeDir;projectsDir;constructor(t={}){this.claudeDir=t.claudeDir||Kr(be,".claude"),this.projectsDir=Kr(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let t=[],r;try{r=await ni(this.projectsDir)}catch{return t}for(let n of r){let s=Kr(this.projectsDir,n);if(!(await Bm(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await ni(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=qm(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=Kr(s,a);try{let d=await this.extractSummary(c,l);d&&t.push(d)}catch{}}}return t}async extractSummary(t,r){let n=await Ce(t,50),s=await Ne(t),i="",o,a,l,c,d,u;for(let m of n)if(!KI(m.type)&&(!i&&m.cwd&&(i=m.cwd),!o&&m.slug&&(o=m.slug),!a&&m.version&&(a=m.version),!u&&m.timestamp&&(u=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=J(p.trim(),80)),d=J(p.trim(),80)}}if(!i)return null;let f=await Hm(t);return{provider:"claude",sessionId:r,slug:o,cwd:i,createdAt:u||s.createdAt,modifiedAt:s.modifiedAt,model:l,cliVersion:a,startCommand:"claude",firstUserMessage:c,lastUserMessage:d,messageCount:f.messageCount,filePath:t,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(t){let r=await this.resolveSessionFile(t);if(!r)return null;let n=await Ne(r),s=[],i="",o,a,l,c,d,u,f,m=t;for await(let _ of We(r))if(_.type!=="file-history-snapshot"&&!_.isSidechain){if(!i&&_.cwd&&(i=_.cwd),!o&&_.slug&&(o=_.slug),!a&&_.version&&(a=_.version),!c&&_.gitBranch&&(c=_.gitBranch),!f&&_.timestamp&&(f=new Date(_.timestamp)),_.sessionId&&(m=_.sessionId),_.type==="system"||_.type==="progress"||_.type==="queue-operation"){s.push({role:"system",timestamp:new Date(_.timestamp||0),content:YI(_)});continue}if(_.type==="user"&&_.message){if(_.isMeta)continue;let g=new Date(_.timestamp||0),h=_.message.content;if(typeof h=="string"){if(h.includes("<command-name>")||h.includes("<local-command-"))continue;d||(d=J(h.trim(),80)),u=J(h.trim(),80),s.push({role:"user",timestamp:g,content:fe(h.trim())})}else if(Array.isArray(h)){for(let S of h)if(S.type==="tool_result"){let y=typeof S.content=="string"?fe(S.content):JSON.stringify(S.content);s.push({role:"tool_result",timestamp:g,content:y,toolCallId:S.tool_use_id})}}}if(_.type==="assistant"&&_.message){_.message.model&&(l=_.message.model);let g=new Date(_.timestamp||0),h=_.message.content;if(Array.isArray(h))for(let S of h)S.type==="text"&&S.text?s.push({role:"assistant",timestamp:g,content:fe(S.text),model:_.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:_.message.model}):S.type==="thinking"&&S.thinking&&s.push({role:"thinking",timestamp:g,content:S.thinking})}}if(!i)return null;let p=await Hm(r);return{provider:"claude",sessionId:m,slug:o,cwd:i,createdAt:f||n.createdAt,modifiedAt:n.modifiedAt,model:l,cliVersion:a,startCommand:"claude",gitBranch:c,firstUserMessage:d,lastUserMessage:u,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(t){return this.resolveSessionFile(t)}async deleteSession(t){let r=await this.resolveSessionFile(t);return r?(await VI(r),!0):!1}async resolveSessionFile(t){let r;try{r=await ni(this.projectsDir)}catch{return null}let n=[];for(let o of r){let a=Kr(this.projectsDir,o);if(!(await Bm(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await ni(a)}catch{continue}for(let d of c){if(!d.endsWith(".jsonl"))continue;let u=qm(d,".jsonl");/^[0-9a-f]{8}-/.test(u)&&n.push({filePath:Kr(a,d),fileSessionId:u})}}let s=n.find(o=>o.fileSessionId===t);if(s)return s.filePath;let i=n.filter(o=>o.fileSessionId.startsWith(t));if(i.length===1)return i[0].filePath;for(let o of n){let a=await Ce(o.filePath,20);for(let l of a)if(l.slug&&l.slug===t)return o.filePath}return null}}});function ii(e){return"'"+e.replace(/'/g,"'\\''")+"'"}function ZI(e,t,r){if(!r)return"";let n=e.tools[t]??cl[t],s=n?.profiles?.[r]?.flags??cl[t]?.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 "${t}"`)}function Xm(e,t){return!!e.tools[t]}function Gm(e,t,r,n,s){let i=e.tools[t]??cl[t],o;if(i?.agent){let l=ii(n);o=i.agent.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,l)}else{let l=zI[t];if(!l)throw new Error(`No agent command configured for tool "${t}"`);let c=l.argv.map(d=>d.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,n));if(l.mode==="stdin"){let d=c.map(ii).join(" ");o=`printf '%s\\n' ${ii(n)} | ${d}`}else o=c.map(ii).join(" ")}let a=ZI(e,t,s);return a&&(o+=" "+a),o}var cl,zI,Vm=T(()=>{"use strict";cl={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:""}}}},zI={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 Km(e=process.env){let t=e.LMCTL_ONE_SHOT_TIMEOUT_MS;if(!t)return 6e5;let r=Number(t);return!Number.isFinite(r)||r<=0?6e5:r}var Ym=T(()=>{"use strict"});var QI,ge,oi,Tt=T(()=>{"use strict";QI="ACK: waiting for explicit lmctl task.",ge=`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: ${QI}`,oi=`send this exact lmctl seed instruction: "${ge}"`});function Ft(e,t){let r={...e??process.env,PWD:t};return delete r.OLDPWD,r}function tN(e,t){return t===void 0||t.length===0?e:{...e??process.env,[Kn]:t}}function Be(e,t,r,n="chat"){return{...tN(Ft(e,t),r),[eN]:n}}var Kn,eN,it=T(()=>{"use strict";Kn="LMCTL_SELF_SESSIONID",eN="LMCTL_LAUNCH_SOURCE"});import{spawn as zm}from"node:child_process";import{mkdirSync as rN}from"node:fs";var dl,xe,Ut=T(()=>{"use strict";Vm();Ym();Tt();it();dl=class e extends Error{cancelReason;constructor(t,r){super(t),this.name="TurnAbortError",this.cancelReason=r,Object.setPrototypeOf(this,e.prototype)}},xe=class e{name;capabilities;injection;provider;binary;seedArgs;seedStdin;resumeTemplate;startTemplate;transportFn;constructor(t){this.name=t.provider.name,this.provider=t.provider,this.capabilities=t.capabilities,this.injection=t.injection,this.binary=t.binary,this.seedArgs=t.seedArgs,this.seedStdin=t.seedStdin,this.resumeTemplate=t.resumeTemplate,this.startTemplate=t.startTemplate,this.transportFn=t.transport}discover(){return this.provider.discoverSessions()}load(t){return this.provider.loadSession(t)}resolvePath(t){return this.provider.resolveSessionPath(t)}delete(t){return this.provider.deleteSession(t)}getWatchPaths(){return this.provider.getWatchPaths?.()??[]}seedArgsFor(t){let r=t?.prompt;return r===void 0?this.seedArgs:this.seedArgs.map(n=>n===ge?r:n)}seed(t,r){return rN(t,{recursive:!0}),new Promise(n=>{let s;try{s=zm(this.binary,this.seedArgsFor(r),{cwd:t,env:Ft(void 0,t),stdio:["pipe","pipe","pipe"],timeout:6e4})}catch(a){return n({success:!1,error:a instanceof Error?a.message:String(a)})}let i="";s.stderr?.on("data",a=>{i+=a.toString()});let o=r?.prompt!==void 0&&this.seedStdin!==void 0?`${r.prompt}
|
|
1360
|
+
`:this.seedStdin;o&&s.stdin?.write(o),s.stdin?.end(),s.on("exit",a=>{n(a===0||a===null?{success:!0}:{success:!1,error:i.trim().slice(0,200)||`exit code ${a}`})}),s.on("error",a=>{n({success:!1,error:a.message})})})}resumeCommand(t,r){return this.resumeTemplate.replace(/\{\{session_id\}\}/g,t)}startCommand(t){return this.startTemplate}manualSeedHint(t){return{launchCommand:`cd ${t} && ${this.binary}`,postLaunchNote:oi,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${t}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(t,r){if(r.userConfig&&Xm(r.userConfig,this.name)){let s=r.userConfig.tools[this.name];if(s?.agent)return this.runOneShotAgent(t,r,s.agent)}let n=r.timeoutMs??e.DEFAULT_IDLE_TIMEOUT_MS;return n<=0&&!r.signal?this.transportFn(t,{...r,binary:this.binary}):this.withTimeouts(n,t,r)}withTimeouts(t,r,n){let s=new AbortController,i,o,a="",l,c=()=>{t<=0||(clearTimeout(i),i=setTimeout(()=>{n.onIdleWarning?.(t),d(),s.abort(),l&&l({text:a,sessionId:n.sessionId,durationMs:t,status:"stalled",stalledAfterMs:t})},t))},d=()=>{clearTimeout(i)};n.signal&&(n.signal.aborted?(o="external",s.abort()):n.signal.addEventListener("abort",()=>{o="external",s.abort()},{once:!0})),c();let u={...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,u).then(p=>(d(),{...p,status:"ok"})).catch(p=>{throw d(),o==="external"?new dl("Turn cancelled","external"):p}),m=new Promise(p=>{l=p});return Promise.race([f,m])}runOneShotAgent(t,r,n){let s=Gm(r.userConfig,this.name,r.sessionId,t,r.profile),i=Date.now();return new Promise((o,a)=>{let l=Km(r.env),c=zm(s,{shell:!0,cwd:r.cwd,env:Be(r.env,r.cwd,r.sessionId),stdio:["pipe","pipe","pipe"]}),d=!1,u=!1,f=setTimeout(()=>{u=!0,c.kill()},l),m="",p="";if(c.stdout?.on("data",_=>{let g=_.toString();m+=g,r.onDelta?.(g)}),c.stderr?.on("data",_=>{p+=_.toString()}),r.signal){if(r.signal.aborted)return clearTimeout(f),c.kill(),a(new Error("Aborted"));r.signal.addEventListener("abort",()=>c.kill(),{once:!0})}c.on("exit",_=>{if(d)return;d=!0,clearTimeout(f);let g=Date.now()-i;u?a(new Error(`Agent command timed out after ${l}ms`)):_===0||_===null?o({text:m.trim(),sessionId:r.sessionId,durationMs:g}):a(new Error(p.trim().slice(0,200)||`Agent command exited with code ${_}`))}),c.on("error",_=>{d||(d=!0,clearTimeout(f),a(_))})})}}});function li(e,t){let r;if(t&&typeof t=="object"){let n=t.code;typeof n=="number"&&(r=n)}return new Bt(e,r,t)}var Qe,Se,Wt,ai,Bt,Yr=T(()=>{"use strict";Qe=class extends Error{constructor(t,r){super(t,r),this.name=this.constructor.name}},Se=class extends Qe{},Wt=class extends Qe{exitCode;signal;stderr;constructor(t,r,n=null,s){super(t),this.exitCode=r,this.signal=n,this.stderr=s}},ai=class extends Qe{line;constructor(t,r,n){super(t,{cause:n}),this.line=r}},Bt=class extends Qe{rpcCode;rpcData;constructor(t,r,n){super(t),r!==void 0&&(this.rpcCode=r),n!==void 0&&(this.rpcData=n)}}});import*as fl from"node:child_process";function sN(e){if(typeof fl.spawnSync=="function")try{fl.spawnSync("taskkill",["/T","/F","/PID",String(e)],{windowsHide:!0})}catch{}}function Zm(e){return e.exitCode!==null||e.signalCode!==null}function ul(e,t){return Zm(e)?Promise.resolve(!0):new Promise(r=>{let n=!1,s=()=>{n||(n=!0,clearTimeout(i),r(!0))},i=setTimeout(()=>{n||(n=!0,e.removeListener("exit",s),r(!1))},t);e.once("exit",s)})}async function ot(e,t={}){let r=Date.now(),n=t.stdinEnd!==!1,s=t.softDelayMs??5e3,i=t.killDelayMs??5e3,o=t.platform??process.platform,a=t.runTaskkill??sN;if(Zm(e))return{signal:"natural",elapsedMs:Date.now()-r};if(n&&e.stdin&&!e.stdin.destroyed)try{e.stdin.end()}catch{}if(await ul(e,s))return{signal:"stdin",elapsedMs:Date.now()-r};if(o==="win32"&&typeof e.pid=="number")a(e.pid);else try{e.kill("SIGTERM")}catch{}if(await ul(e,i))return{signal:"SIGTERM",elapsedMs:Date.now()-r};if(o!=="win32")try{e.kill("SIGKILL")}catch{}return await ul(e,nN)?{signal:"SIGKILL",elapsedMs:Date.now()-r}:{signal:"abandoned",elapsedMs:Date.now()-r}}var nN,ci=T(()=>{"use strict";nN=1e3});function Qm(e){ce()&&Ae({event:"legacy",msg:`[debug] ${e}`},{always:!0})}function sr(e,t){let r=oN[e];if(r)return r[t]??r.yolo}function lN(e,t){if(t.length===0)return!0;for(let r=0;r+t.length<=e.length;r++){let n=!0;for(let s=0;s<t.length;s++)if(e[r+s]!==t[s]){n=!1;break}if(n)return!0}return!1}function at(e,t,r="yolo"){if(aN.has(e)){Qm(`YOLO ${e} [mode=${r}]: ${e==="codex"?`JSON-RPC params (approvalPolicy=never, sandbox=${r==="plan"?"read-only":"danger-full-access"})`:e==="opencode"?".opencode/opencode.json (permission=allow)":"protocol/config (out-of-band)"} \u2014 no argv flag`);return}let n=r==="plan"?sr(e,"plan"):iN[e];if(!n){let s=`unknown provider "${e}" \u2014 YOLO contract not configured. Add an entry to YOLO_FLAGS in src/providers/yolo-contract.ts before spawning this provider.`;throw H({event:"yolo_assert_failed",provider:e,reason:"unconfigured_provider",args:t.join(" "),message:s}),new Se(s)}if(!lN(t,n)){let s=n.join(" "),i=`${e} spawn missing YOLO flag '${s}' \u2014 YOLO is mandatory for every provider; see src/providers/yolo-contract.ts. Got argv: [${t.map(o=>JSON.stringify(o)).join(", ")}]`;throw H({event:"yolo_assert_failed",provider:e,reason:"flag_missing",required_flag:s,mode:r,args:t.join(" "),message:i}),new Se(i)}Qm(`YOLO ${e} [mode=${r}]: argv flag '${n.join(" ")}'`)}var iN,oN,aN,zr=T(()=>{"use strict";Yr();he();iN={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"],lmplayer:["--dangerously-skip-permissions"]},oN={claude:{yolo:["--dangerously-skip-permissions"],plan:["--permission-mode","plan"]},qwen:{yolo:["--approval-mode","yolo"],plan:["--approval-mode","plan"]},gemini:{yolo:["-y"],plan:["--approval-mode","plan"]},copilot:{yolo:["--yolo"],plan:["--yolo"]},agy:{yolo:["--dangerously-skip-permissions"],plan:["--dangerously-skip-permissions"]},lmplayer:{yolo:["--dangerously-skip-permissions"],plan:["--dangerously-skip-permissions"]}};aN=new Set(["codex","opencode"])});function ep(e){if(e.length===0)return"";if(e.length===1)return e[0];let t=[];for(let r=0;r<e.length;r++)r===0?t.push(e[r]):t.push(`
|
|
1361
1361
|
|
|
1362
1362
|
--- additional response (turn ${r+1} of ${e.length}; likely an injected mid-call notification) ---
|
|
1363
1363
|
|
|
@@ -1365,49 +1365,49 @@ var _k=Object.defineProperty;var T=(e,t)=>()=>(e&&(t=e(e=0)),t);var ye=(e,t)=>{f
|
|
|
1365
1365
|
One possible cause: the provider stream ended before a complete response was delivered; for Claude Code this can appear as "API Error: Stream idle timeout - partial response received".`;return t?`Original provider error:
|
|
1366
1366
|
${t}
|
|
1367
1367
|
|
|
1368
|
-
${r}`:r}function rp(e,t){return new Promise((r,n)=>{let s=t.tool||"claude",i=t.binaryPath||uN[s]||"claude",o=["-p","","--output-format","stream-json","--input-format","stream-json"];s==="claude"&&o.push("--verbose"),t.sessionId&&o.push("--resume",t.sessionId),t.model&&o.push("--model",t.model);let a=t.permissionMode??"yolo",l=sr(s,a)??mN[s]??["--dangerously-skip-permissions"];o.push(...l);try{at(s,o,a)}catch(g){return n(g)}if(t.cwd&&!dN(t.cwd))return
|
|
1369
|
-
`);f=h.pop()||"";for(let S of h)m(S)});let p="";c.stderr?.on("data",g=>{p+=g.toString()}),c.on("error",g=>{
|
|
1370
|
-
`),wt(`stream-json: prompt sent (${e.length} chars)`)})}var uN,mN,np=T(()=>{"use strict";Yr();
|
|
1368
|
+
${r}`:r}function rp(e,t){return new Promise((r,n)=>{let s=t.tool||"claude",i=t.binaryPath||uN[s]||"claude",o=["-p","","--output-format","stream-json","--input-format","stream-json"];s==="claude"&&o.push("--verbose"),t.sessionId&&o.push("--resume",t.sessionId),t.model&&o.push("--model",t.model);let a=t.permissionMode??"yolo",l=sr(s,a)??mN[s]??["--dangerously-skip-permissions"];o.push(...l);try{at(s,o,a)}catch(g){return n(g)}if(t.cwd&&!dN(t.cwd))return H({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${t.cwd}`,elapsed_ms:0}),n(new Se(`sessiondir missing: ${t.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=cN(i,o,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:Be(t.env,t.cwd,t.sessionId)}),d=!1;if(t.signal){if(t.signal.aborted)return d=!0,H({event:"transport_abort",provider:s,phase:"pre_spawn"}),ot(c).catch(()=>{}),n(new Error("Aborted"));t.signal.addEventListener("abort",()=>{d=!0,H({event:"transport_abort",provider:s}),ot(c).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let u=ml({onEvent:t.onEvent,onText:t.onText}),f="";function m(g){let h=u.sawResult();u.processLine(g),!h&&u.sawResult()&&c.stdin?.end()}c.stdout?.on("data",g=>{f+=g.toString();let h=f.split(`
|
|
1369
|
+
`);f=h.pop()||"";for(let S of h)m(S)});let p="";c.stderr?.on("data",g=>{p+=g.toString()}),c.on("error",g=>{H({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:g.message}),n(new Se(`Failed to spawn ${i}: ${g.message}`,{cause:g}))}),c.on("exit",g=>{if(d)return;f.trim()&&m(f);let h=u.finalize();h?(wt(`stream-json: result ${h.result.slice(0,80)}${h.result.length>80?"...":""} (${h.durationMs}ms)`),r({...h,exitCode:g})):(H({event:"transport_error",provider:s,error_class:"Error",reason:"provider_no_result",exit_code:g,stderr_tail:p.slice(0,500)}),n(new Error(fN({tool:s,exitCode:g,stderr:p}))))});let _=JSON.stringify({type:"user",message:{role:"user",content:e}});c.stdin?.write(_+`
|
|
1370
|
+
`),wt(`stream-json: prompt sent (${e.length} chars)`)})}var uN,mN,np=T(()=>{"use strict";Yr();ci();zr();he();it();pl();pl();uN={claude:"claude",qwen:"qwen"};mN={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"]}});function di(e={}){return[]}var _l=T(()=>{"use strict"});function hl(e){return e==="plan"?"read-only":"danger-full-access"}function sp(e="0.0.0"){return{clientInfo:{name:"lmctl",title:"lmctl",version:e},capabilities:{experimentalApi:!1}}}function gl(){return{agentItems:new Map,resultText:""}}function ui(e,t,r,n){let s=e.method;if(!s)return!1;let i=e.params;if(s==="turn/started")return t.agentItems.clear(),t.resultText="",!1;if(s==="item/started"){let o=i?.item;if(o?.type==="agentMessage"&&typeof o.id=="string"){let a=typeof o.phase=="string"?o.phase:void 0,l=a==="commentary"||a==="final_answer"?a:void 0;return t.agentItems.set(o.id,{phase:l,buffer:""}),!0}return!1}if(s==="item/agentMessage/delta"){let o=i?.delta||"",a=typeof i?.itemId=="string"?i.itemId:void 0;if(!o)return!0;let l=a?t.agentItems.get(a):void 0;return l?(l.phase==="commentary"||(l.buffer+=o),r?.(o),l.phase&&i&&(i._lmctlItemPhase=l.phase)):(t.resultText+=o,r?.(o)),!0}if(s==="item/completed"){let o=i?.item;if(o?.type==="agentMessage"&&typeof o.id=="string"){let a=t.agentItems.get(o.id);if(a){if(a.phase!=="commentary"){let l=typeof o.text=="string"?o.text:a.buffer;if(n&&typeof o.text=="string"&&o.text!==a.buffer){let c=typeof i?.threadId=="string"?i.threadId:void 0,d=typeof i?.turnId=="string"?i.turnId:void 0;n({itemId:o.id,threadId:c,turnId:d,expectedFromItemText:o.text,gotFromBuffer:a.buffer})}t.resultText+=l}t.agentItems.delete(o.id)}return!0}return!1}return!1}function yl(e){for(let[,t]of e.agentItems.entries())t.phase!=="commentary"&&t.buffer&&(e.resultText+=t.buffer);e.agentItems.clear()}function ip(e){let t=e.params,r=t?.error,n=typeof r?.message=="string"?r.message:void 0,s=n&&n.length>0?n:"(no message)";return t?.willRetry===!0?{willRetry:!0}:{willRetry:!1,turnError:new Error(`Turn errored: ${s}`)}}function wl(){return{pendingCodexError:null}}function El(e,t){let r=ip(e);return r.willRetry||(t.pendingCodexError=r.turnError),r}function Tl(e,t){if(t.pendingCodexError){let i=t.pendingCodexError;return t.pendingCodexError=null,{shouldReject:!0,turnError:i}}let n=e.params?.turn;if((typeof n?.status=="string"?n.status:void 0)==="failed"){let i=n?.error,o=typeof i?.message=="string"?i.message:void 0,a=o&&o.length>0?o:"(no message)";return{shouldReject:!0,turnError:new Error(`Turn errored: ${a}`)}}return{shouldReject:!1}}var bl=T(()=>{"use strict"});import{spawn as pN}from"node:child_process";import{createInterface as _N}from"node:readline";import{existsSync as hN,readFileSync as gN}from"node:fs";import{fileURLToPath as yN}from"node:url";function EN(){return sp(wN)}function ir(e,t){wt(`[codex:${e}] ${JSON.stringify(t)}`)}function TN(e){let t=e.stderr.trim().slice(0,500),r=`lmctl: codex app-server exited with code ${e.exitCode} before completing the turn.
|
|
1371
1371
|
One possible cause: Codex stopped before delivering a terminal turn/completed event.`;return t?`Original provider error:
|
|
1372
1372
|
${t}
|
|
1373
1373
|
|
|
1374
|
-
${r}`:r}function op(e,t){return new Promise((r,n)=>{let s=t.binaryPath||"codex",i=["app-server","--listen","stdio://"];t.model&&i.push("-c",`model=${JSON.stringify(t.model)}`);let o=t.isLead??t.alias?.toLowerCase()==="lead",a=o?
|
|
1374
|
+
${r}`:r}function op(e,t){return new Promise((r,n)=>{let s=t.binaryPath||"codex",i=["app-server","--listen","stdio://"];t.model&&i.push("-c",`model=${JSON.stringify(t.model)}`);let o=t.isLead??t.alias?.toLowerCase()==="lead",a=o?di():[];i.push(...a),ce()&&Oe(JSON.stringify({event:"codex_mcp_inject",alias:t.alias??null,isLead:o,injected:a.length>0}));let l=t.permissionMode??"yolo",c=hl(l);try{at("codex",i,l)}catch(W){return n(W)}if(t.cwd&&!hN(t.cwd))return H({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:`sessiondir missing: ${t.cwd}`}),n(new Se(`sessiondir missing: ${t.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let d=pN(s,i,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:Be(t.env,t.cwd,t.threadId)}),u=!1;if(t.signal){if(t.signal.aborted)return u=!0,H({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),ot(d).catch(()=>{}),n(new Error("Aborted"));t.signal.addEventListener("abort",()=>{u=!0,H({event:"transport_abort",provider:"codex"}),ot(d).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let f=_N({input:d.stdout}),m=new Map,p=1,_=t.threadId||"",g="",h=!1,S=!1,y=Date.now(),w=gl(),I=wl();function x(W,M={}){return new Promise((A,Q)=>{let B=p++;m.set(B,{resolve:A,reject:Q});let k=JSON.stringify({jsonrpc:"2.0",id:B,method:W,params:M});d.stdin?.write(k+`
|
|
1375
1375
|
`)})}function U(W,M={}){let A=JSON.stringify({jsonrpc:"2.0",method:W,params:M});d.stdin?.write(A+`
|
|
1376
|
-
`)}f.on("line",W=>{let M;try{M=JSON.parse(W)}catch{return}if(typeof M.id=="number"&&m.has(M.id)){let B=m.get(M.id);if(m.delete(M.id),M.error){let k=M.error,N=typeof k?.message=="string"&&k.message.length>0?k.message:JSON.stringify(M.error);B.reject(
|
|
1377
|
-
`);let M=(await x("thread/start",{cwd:t.cwd,approvalPolicy:"never",sandbox:c,...t.model?{model:t.model}:{}})).result?.thread;M?.id&&(_=M.id)}else{let M=(await x("thread/start",{cwd:t.cwd,approvalPolicy:"never",sandbox:c,...t.model?{model:t.model}:{}})).result?.thread;M?.id&&(_=M.id)}await x("turn/start",{threadId:_,input:[{type:"text",text:e}],...t.model?{model:t.model}:{}})}catch(W){ot(d).catch(()=>{}),n(W instanceof Error?W:new Error(String(W)))}})()})}var wN,ap=T(()=>{"use strict";
|
|
1378
|
-
`;)i+=1;i<e.length&&(t+=e[i]);continue}if(o==="/"&&a==="*"){for(i+=2;i<e.length&&!(e[i]==="*"&&e[i+1]==="/");)i+=1;i+=1;continue}t+=o}return t.replace(/,\s*([}\]])/g,"$1")}function
|
|
1379
|
-
`,"utf-8"),!0}let s;try{s=JSON.parse(up(n,"utf-8"))}catch{return console.log(cp.yellow(` .opencode/opencode.json at ${n} is malformed \u2014 skipping opencode config install.`)),!1}if(typeof s!="object"||s===null)return console.log(cp.yellow(` .opencode/opencode.json at ${n} is not an object \u2014 skipping opencode config install.`)),!1;let i=!1;return s.permission===void 0&&(s.permission="allow",i=!0),fp(s.permission)||
|
|
1380
|
-
`,"utf-8"),i}var cp,
|
|
1376
|
+
`)}f.on("line",W=>{let M;try{M=JSON.parse(W)}catch{return}if(typeof M.id=="number"&&m.has(M.id)){let B=m.get(M.id);if(m.delete(M.id),M.error){let k=M.error,N=typeof k?.message=="string"&&k.message.length>0?k.message:JSON.stringify(M.error);B.reject(li(`codex app-server error: ${N}`,k))}else B.resolve(M);t.onEvent?.(M);return}let A=M.method;if(!A){t.onEvent?.(M);return}if(A==="thread/started"){let k=M.params?.thread;k?.id&&(_=k.id)}let Q=ce()?B=>{ir("item.text/buffer-mismatch",{itemId:B.itemId,threadId:B.threadId??null,turnId:B.turnId??null,expectedFromItemText:B.expectedFromItemText,gotFromBuffer:B.gotFromBuffer,expectedLen:B.expectedFromItemText.length,gotLen:B.gotFromBuffer.length})}:void 0;if(A==="turn/started"){let B=M.params,k=B?.turn;k?.id&&(g=k.id),ui(M,w,t.onDelta,Q),ce()&&ir("turn/started",{params:B??null})}if(ce()&&(A==="item/started"||A==="item/completed")){let B=M.params;B?.item?.type==="agentMessage"&&ir(A,{params:B??null})}if(A==="item/started"||A==="item/agentMessage/delta"||A==="item/completed"){if(A==="item/agentMessage/delta"){let B=M.params;ce()&&ir("agentMessage/delta",{params:B??null})}ui(M,w,t.onDelta,Q)}if(A==="turn/completed"){let B=M.params;if(ce())for(let[N,L]of w.agentItems.entries())L.buffer&&ir("turn/completed/unflushed-item",{itemId:N,phase:L.phase,bufferLen:L.buffer.length});yl(w),ce()&&ir("turn/completed",{params:B??null});let k=Tl(M,I);k.shouldReject?(ce()&&ir("turn/completed/terminal-reject",{message:k.turnError.message}),S=!0,h=!0,d.stdin?.end(),n(k.turnError)):(h=!0,d.stdin?.end())}if(A==="error"){let B=El(M,I);if(ce()){let k=M.params,N=k?.error,L=typeof N?.message=="string"?N.message:"(no message)";ir(B.willRetry?"error/retry":"error/terminal-deferred",{message:L,willRetry:B.willRetry,params:k??null})}}t.onEvent?.(M)});let ue="";d.stderr?.on("data",W=>{ue+=W.toString()}),d.on("error",W=>{H({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:W.message}),n(new Se(`Failed to spawn codex app-server: ${W.message}`,{cause:W}))}),d.on("exit",W=>{if(!u&&!S){if(h){r({result:w.resultText,threadId:_,turnId:g,durationMs:Date.now()-y,exitCode:W});return}if(I.pendingCodexError){n(I.pendingCodexError);return}H({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:W,stderr_tail:ue.slice(0,500)}),n(new Error(TN({exitCode:W,stderr:ue})))}}),(async()=>{try{if(await x("initialize",EN()),U("initialized",{}),t.threadId)try{let W=x("thread/resume",{threadId:t.threadId,sandbox:c,approvalPolicy:"never",...t.model?{model:t.model}:{}}),M=new Promise((A,Q)=>setTimeout(()=>Q(new Error("resume timeout")),5e3));await Promise.race([W,M]),_=t.threadId}catch{process.stderr.write(`[codex] thread/resume failed, creating new thread
|
|
1377
|
+
`);let M=(await x("thread/start",{cwd:t.cwd,approvalPolicy:"never",sandbox:c,...t.model?{model:t.model}:{}})).result?.thread;M?.id&&(_=M.id)}else{let M=(await x("thread/start",{cwd:t.cwd,approvalPolicy:"never",sandbox:c,...t.model?{model:t.model}:{}})).result?.thread;M?.id&&(_=M.id)}await x("turn/start",{threadId:_,input:[{type:"text",text:e}],...t.model?{model:t.model}:{}})}catch(W){ot(d).catch(()=>{}),n(W instanceof Error?W:new Error(String(W)))}})()})}var wN,ap=T(()=>{"use strict";he();he();Yr();ci();zr();_l();he();it();bl();bl();wN=(()=>{try{let e=new URL("../../../package.json",import.meta.url),t=JSON.parse(gN(yN(e),"utf8"));return typeof t.version=="string"?t.version:"0.0.0"}catch{return"0.0.0"}})()});import{existsSync as dp,mkdirSync as bN,readFileSync as up,writeFileSync as lp}from"node:fs";import{join as Yn,resolve as SN}from"node:path";function fp(e){if(e==="allow")return!0;if(e&&typeof e=="object"&&!Array.isArray(e)){let t=Object.entries(e);if(t.length===1&&t[0][0]==="*"&&t[0][1]==="allow")return!0}return!1}function Sl(e,t,r={existsSync:dp,readFileSync:up}){let n=[];for(let s of e){if(s.provider.trim().toLowerCase()!=="opencode")continue;let i=SN(t,s.sessiondir??t);for(let o of vN(i)){let a=kN(o,r);a!==void 0&&Object.prototype.hasOwnProperty.call(a,"permission")&&(fp(a.permission)||n.push(`[${s.alias}] ${o} 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 vN(e){return[Yn(e,".opencode","opencode.jsonc"),Yn(e,"opencode.jsonc"),Yn(e,"opencode.json")]}function kN(e,t){try{if(!t.existsSync(e))return;let r=t.readFileSync(e,"utf-8"),n=JSON.parse(IN(r));return n===null||typeof n!="object"||Array.isArray(n)?void 0:n}catch{return}}function IN(e){let t="",r=!1,n="",s=!1;for(let i=0;i<e.length;i+=1){let o=e[i],a=e[i+1];if(r){t+=o,s?s=!1:o==="\\"?s=!0:o===n&&(r=!1,n="");continue}if(o==='"'||o==="'"){r=!0,n=o,t+=o;continue}if(o==="/"&&a==="/"){for(;i<e.length&&e[i]!==`
|
|
1378
|
+
`;)i+=1;i<e.length&&(t+=e[i]);continue}if(o==="/"&&a==="*"){for(i+=2;i<e.length&&!(e[i]==="*"&&e[i+1]==="/");)i+=1;i+=1;continue}t+=o}return t.replace(/,\s*([}\]])/g,"$1")}function fi(e,t={}){let r=Yn(e,".opencode"),n=Yn(r,"opencode.json");if(!dp(n)){bN(r,{recursive:!0});let o=JSON.stringify({permission:"allow"},null,2);return lp(n,o+`
|
|
1379
|
+
`,"utf-8"),!0}let s;try{s=JSON.parse(up(n,"utf-8"))}catch{return console.log(cp.yellow(` .opencode/opencode.json at ${n} is malformed \u2014 skipping opencode config install.`)),!1}if(typeof s!="object"||s===null)return console.log(cp.yellow(` .opencode/opencode.json at ${n} is not an object \u2014 skipping opencode config install.`)),!1;let i=!1;return s.permission===void 0&&(s.permission="allow",i=!0),fp(s.permission)||H({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.`}),i&&lp(n,JSON.stringify(s,null,2)+`
|
|
1380
|
+
`,"utf-8"),i}var cp,mi=T(()=>{"use strict";he();cp={yellow:e=>e}});function _p(e){let t=[...e.matchAll(NN)];if(t.length>0){let r=t[t.length-1],n=(r.index??0)+r[0].length;return mp(e.slice(n).trimStart())}return mp(ON(e.replace(xN,"")))}function ON(e){let t=AN.exec(e);if(t===null)return e;let r=e.slice(t[0].length),n=[...r.matchAll(RN)];if(n.length<2)return e;let s=n[0],i=(s.index??0)+s[0].length;return r.slice(i).trimStart()}function mp(e){let t=[...e.matchAll(LN)];if(t.length===0)return e;let r=t[t.length-1],n=(r.index??0)+r[0].length;return e.slice(n).trimStart()}function zn(e,t=""){let r=e.result;return typeof r?.sessionId=="string"&&r.sessionId.length>0?r.sessionId:t}function hp(e){let t=e.result;return typeof t?.stopReason=="string"?t.stopReason:""}function vl(e={}){let t="",r="",n="",s=!1,i=!1,o=()=>({result:e.tool==="gemini"?_p(r):r,sessionId:t,stopReason:n});return{setSessionId(a){t=a},beginTurn(){r="",n="",s=!1,i=!0},completeTurn(a){return n=hp(a),s=!0,i=!1,o()},processMessage(a){if(a.method!=="session/update")return!1;let c=a.params?.update;if(c?.sessionUpdate!=="agent_message_chunk")return!1;let d=c.content,u=typeof d?.text=="string"?d.text:"";return u&&i&&(r+=u,e.onDelta?.(u)),!0},finalize(){return s?o():null}}}var pp,NN,xN,AN,RN,LN,kl=T(()=>{"use strict";pp="(?:png|jpe?g|webp|heic|pdf)",NN=new RegExp(`\\bSTANCE:\\s*\\S+_\\d{6,}\\.${pp}\\s*`,"gi"),xN=new RegExp(`^ACK:\\s*waiting for explicit lmctl task\\.\\d{6,}\\.${pp}\\s*`,"i"),AN=/^ACK:\s*waiting for explicit lmctl task[._]?\s*/i,RN=/^STANCE:\s+\S+\s*$/gim,LN=/\[Thought:\s*true\]\s*/gi});import{spawn as $N}from"node:child_process";import{existsSync as CN}from"node:fs";import{createInterface as MN}from"node:readline";function jN(e){let t=e.stderr.trim().slice(0,500),r=`lmctl: ${e.tool} ACP process exited with code ${e.exitCode} before completing the prompt.
|
|
1381
1381
|
One possible cause: the provider process failed before a complete ACP response was delivered.`;return t?`Original provider error:
|
|
1382
1382
|
${t}
|
|
1383
1383
|
|
|
1384
|
-
${r}`:r}function gp(e,t){let r=DN[t.tool];return r?new Promise((n,s)=>{let i=t.binaryPath||r.binary;if(t.tool==="opencode")try{
|
|
1384
|
+
${r}`:r}function gp(e,t){let r=DN[t.tool];return r?new Promise((n,s)=>{let i=t.binaryPath||r.binary;if(t.tool==="opencode")try{fi(t.cwd)}catch(y){H({event:"opencode_config_install_failed",cwd:t.cwd,error_message:y instanceof Error?y.message:String(y)})}let o=t.permissionMode??"yolo",a=[...r.args];if(o==="plan")if(t.tool==="gemini"){let y=sr("gemini","plan"),w=sr("gemini","yolo");a=a.filter(I=>!(w??[]).includes(I)),y&&a.push(...y)}else t.tool==="copilot"&&process.stderr.write(`[acp] copilot has no plan-mode flag in --acp mode; --permission-mode plan is not honored (running yolo). See src/providers/yolo-contract.ts.
|
|
1385
1385
|
`);t.model&&t.tool==="gemini"&&a.push("--model",t.model);let l=t.tool==="copilot"?"yolo":o;try{at(t.tool,a,l)}catch(y){return s(y)}if(t.model&&t.tool==="copilot"&&process.stderr.write(`[acp] copilot does not support per-session model selection in --acp mode (model="${t.model}" ignored). Set the default via copilot's /model slash command in an interactive \`lmctl terminal\` session.
|
|
1386
|
-
`),t.cwd&&!CN(t.cwd))return
|
|
1387
|
-
`)})}f.on("line",y=>{let w;try{w=JSON.parse(y)}catch{return}if(Ae({event:"acp_recv",direction:"RECV",provider:t.tool,id:typeof w.id=="number"?w.id:void 0,method:typeof w.method=="string"?w.method:void 0,preview:JSON.stringify(w).slice(0,300)}),t.onEvent?.(w),typeof w.id=="number"&&m.has(w.id)){let x=m.get(w.id);if(m.delete(w.id),w.error){let U=w.error,ue=typeof U?.message=="string"&&U.message.length>0?U.message:JSON.stringify(w.error);x.reject(
|
|
1388
|
-
`);return}_.processMessage(w)}});let h="";c.stderr?.on("data",y=>{h+=y.toString()}),c.on("error",y=>{
|
|
1386
|
+
`),t.cwd&&!CN(t.cwd))return H({event:"transport_error",provider:t.tool,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${t.cwd}`,elapsed_ms:0}),s(new Se(`sessiondir missing: ${t.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=$N(i,a,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:Be(t.env,t.cwd,t.sessionId)}),d=Date.now(),u=!1;if(t.signal){if(t.signal.aborted)return u=!0,H({event:"transport_abort",provider:t.tool,phase:"pre_spawn"}),ot(c).catch(()=>{}),s(new Error("Aborted"));t.signal.addEventListener("abort",()=>{u=!0,H({event:"transport_abort",provider:t.tool,elapsed_ms:Date.now()-d}),ot(c).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let f=MN({input:c.stdout}),m=new Map,p=t.sessionId||"",_=vl({tool:t.tool,onDelta:t.onDelta});_.setSessionId(p);function g(y,w={}){return new Promise((I,x)=>{let U=PN++;m.set(U,{resolve:I,reject:x});let ue=JSON.stringify({jsonrpc:"2.0",id:U,method:y,params:w});Ae({event:"acp_send",direction:"SEND",provider:t.tool,method:y,id:U,params:w}),c.stdin?.write(ue+`
|
|
1387
|
+
`)})}f.on("line",y=>{let w;try{w=JSON.parse(y)}catch{return}if(Ae({event:"acp_recv",direction:"RECV",provider:t.tool,id:typeof w.id=="number"?w.id:void 0,method:typeof w.method=="string"?w.method:void 0,preview:JSON.stringify(w).slice(0,300)}),t.onEvent?.(w),typeof w.id=="number"&&m.has(w.id)){let x=m.get(w.id);if(m.delete(w.id),w.error){let U=w.error,ue=typeof U?.message=="string"&&U.message.length>0?U.message:JSON.stringify(w.error);x.reject(li(`ACP RPC error: ${ue}`,U))}else x.resolve(w);return}let I=w.method;if(I){if(typeof w.id=="number"){H({event:"acp_unhandled_request",provider:t.tool,method:I,id:w.id,params:w.params});let x=JSON.stringify({jsonrpc:"2.0",id:w.id,error:{code:-32601,message:`Method not found: ${I} (lmctl does not implement server-side ACP methods)`}});Ae({event:"acp_send",direction:"SEND",provider:t.tool,replyTo:w.id,error:"method not found"}),c.stdin?.write(x+`
|
|
1388
|
+
`);return}_.processMessage(w)}});let h="";c.stderr?.on("data",y=>{h+=y.toString()}),c.on("error",y=>{H({event:"transport_error",provider:t.tool,error_class:"TransportConnectionError",error_message:y.message,elapsed_ms:Date.now()-d}),s(new Se(`Failed to spawn ${r.binary} ${r.args.join(" ")}: ${y.message}`,{cause:y}))}),c.on("exit",y=>{if(u)return;let w=_.finalize();w!==null?n({result:w.result,sessionId:w.sessionId,durationMs:Date.now()-d,stopReason:w.stopReason,exitCode:y}):(H({event:"transport_error",provider:t.tool,error_class:"Error",reason:"provider_no_result",exit_code:y,stderr_tail:h.slice(0,500),elapsed_ms:Date.now()-d}),s(new Error(jN({tool:t.tool,exitCode:y,stderr:h}))))});function S(y,w={}){let I=JSON.stringify({jsonrpc:"2.0",method:y,params:w});c.stdin?.write(I+`
|
|
1389
1389
|
`)}(async()=>{try{if(await g("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),S("notifications/initialized"),t.sessionId)try{let I=await g("session/load",{sessionId:t.sessionId,cwd:t.cwd,mcpServers:[]});p=zn(I,t.sessionId),_.setSessionId(p)}catch(I){if(t.requireResume)throw new Error(`Cannot resume session ${t.sessionId} via ACP: ${I instanceof Error?I.message:String(I)}`);process.stderr.write(`[acp] session/load failed for ${t.sessionId}, creating new session
|
|
1390
1390
|
`);let x=await g("session/new",{cwd:t.cwd,mcpServers:[]});p=zn(x),_.setSessionId(p)}else{let I=await g("session/new",{cwd:t.cwd,mcpServers:[]});p=zn(I),_.setSessionId(p)}if(t.model&&t.tool==="opencode")try{await g("session/set_config_option",{sessionId:p,configId:"model",value:t.model}),wt(`acp: set_config_option(model=${t.model}) ok`)}catch(I){let x=I instanceof Error?I.message:String(I);process.stderr.write(`[acp] set_config_option(model=${t.model}) failed: ${x}
|
|
1391
1391
|
`)}if(t.effort&&t.tool==="opencode")try{await g("session/set_config_option",{sessionId:p,configId:"effort",value:t.effort}),wt(`acp: set_config_option(effort=${t.effort}) ok`)}catch(I){let x=I instanceof Error?I.message:String(I);process.stderr.write(`[acp] set_config_option(effort=${t.effort}) failed: ${x}
|
|
1392
|
-
`)}_.beginTurn(),wt(`acp: prompt sent (${e.length} chars)`);let y=await g("session/prompt",{sessionId:p,prompt:[{type:"text",text:e}]}),w=_.completeTurn(y);wt(`acp: result received (${w.result.length} chars, stopReason=${w.stopReason})`),c.stdin?.end()}catch(y){ot(c).catch(()=>{}),s(y instanceof Error?y:new Error(String(y)))}})()}):Promise.reject(new Error(`No ACP config for tool "${t.tool}"`))}var DN,PN,yp=T(()=>{"use strict";
|
|
1392
|
+
`)}_.beginTurn(),wt(`acp: prompt sent (${e.length} chars)`);let y=await g("session/prompt",{sessionId:p,prompt:[{type:"text",text:e}]}),w=_.completeTurn(y);wt(`acp: result received (${w.result.length} chars, stopReason=${w.stopReason})`),c.stdin?.end()}catch(y){ot(c).catch(()=>{}),s(y instanceof Error?y:new Error(String(y)))}})()}):Promise.reject(new Error(`No ACP config for tool "${t.tool}"`))}var DN,PN,yp=T(()=>{"use strict";he();Yr();ci();zr();mi();he();it();kl();kl();DN={gemini:{binary:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{binary:"copilot",args:["--acp","--yolo"]},opencode:{binary:"opencode",args:["acp"]}},PN=1});function pe(e,t=120){let r=e.replace(/\s+/g," ").trim();return r.length>t?r.slice(0,t-1)+"\u2026":r}function wp(e,t){return r=>{if(r.kind==="tool_use"&&typeof r.id=="string"){if(e.size>=FN){let n=e.keys().next().value;n!==void 0&&e.delete(n)}e.set(r.id,Date.now()),t(r);return}if(r.kind==="tool_result"&&typeof r.id=="string"&&r.elapsedMs===void 0){let n=e.get(r.id);if(n!==void 0){t({...r,elapsedMs:Date.now()-n}),e.delete(r.id);return}}t(r)}}function UN(){let e=new Map;return(t,r)=>{WN(t,wp(e,r))}}function WN(e,t){let r=e.type;if(r==="system"){let n=e.subtype;if(n==="api_retry"){let s=typeof e.attempt=="number"?e.attempt:void 0,i=typeof e.max_retries=="number"?e.max_retries:void 0,o=typeof e.error_status=="number"?e.error_status:void 0,a=typeof e.error=="string"?e.error:void 0,l=typeof e.retry_delay_ms=="number"?e.retry_delay_ms:void 0,c=[];s!==void 0&&c.push(i!==void 0?`attempt ${s}/${i}`:`attempt ${s}`),o!==void 0&&c.push(`HTTP ${o}`),l!==void 0&&c.push(`retry in ${Math.round(l/1e3)}s`),a&&c.push(pe(a,60));let d=c.length>0?c.join(", "):n;t({kind:"api_retry",summary:d});return}if(n==="api_error"){let s=typeof e.error_status=="number"?e.error_status:void 0,i=typeof e.error=="string"?e.error:void 0,o=["api_error"];s!==void 0&&o.push(`HTTP ${s}`),i&&o.push(pe(i,80)),t({kind:"other",summary:o.join(": "),raw:e});return}t({kind:"system",summary:n||"system",raw:e});return}if(r==="assistant"||r==="user"){let s=e.message?.content;if(!Array.isArray(s))return;for(let i of s){let o=i.type;if(o==="text"){let a=i.text||"";a&&t({kind:"text",summary:pe(a),raw:i})}else if(o==="tool_use"){let a=i.name||"tool",l=typeof i.id=="string"?i.id:void 0,c=i.input,d="";c&&(typeof c.command=="string"?d=c.command:typeof c.file_path=="string"?d=c.file_path:typeof c.path=="string"?d=c.path:typeof c.pattern=="string"?d=c.pattern:typeof c.url=="string"?d=c.url:d=pe(JSON.stringify(c))),t({kind:"tool_use",tool:a,summary:pe(d),id:l,raw:i})}else if(o==="thinking"){let a=i.thinking||"";t({kind:"thinking",summary:pe(a),raw:i})}else if(o==="tool_result"){let l=i.is_error===!0?"error":"ok",c=typeof i.tool_use_id=="string"?i.tool_use_id:void 0,d,u=i.content;if(typeof u=="string")d=`${u.split(`
|
|
1393
1393
|
`).length} lines, ${u.length} chars`;else if(Array.isArray(u)){let f=u.map(m=>typeof m=="object"&&m&&"text"in m?m.text:"").filter(Boolean).join("");f&&(d=`${f.split(`
|
|
1394
|
-
`).length} lines, ${f.length} chars`)}t({kind:"tool_result",status:l,summary:d,id:c,raw:i})}else o&&t({kind:"other",summary:o,raw:i})}return}if(r==="result"){t({kind:"system",summary:"result",raw:e});return}}async function
|
|
1394
|
+
`).length} lines, ${f.length} chars`)}t({kind:"tool_result",status:l,summary:d,id:c,raw:i})}else o&&t({kind:"other",summary:o,raw:i})}return}if(r==="result"){t({kind:"system",summary:"result",raw:e});return}}async function pi(e,t){let r=t.binary==="qwen"?"qwen":"claude",n=t.onProgress?UN():void 0,s=await rp(e,{sessionId:t.sessionId,cwd:t.cwd,env:t.env,tool:r,binaryPath:t.progPath,model:t.model,permissionMode:t.permissionMode,onText:t.onDelta,onEvent:n?i=>n(i,t.onProgress):void 0,signal:t.signal});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,numTurns:s.numTurns}}function BN(){let e=new Map;return(t,r)=>{qN(t,wp(e,r))}}function qN(e,t){if(e.method!=="session/update")return;let s=e.params?.update;if(!s)return;let i=s.sessionUpdate;if(i){if(i==="agent_message_chunk"){let a=s.content?.text||"";a&&t({kind:"text",summary:pe(a)});return}if(i==="agent_thought_chunk"){let a=s.content?.text||"";t({kind:"thinking",summary:pe(a)});return}if(i==="tool_call"){let o=s.title||s.kind||"tool",a=typeof s.toolCallId=="string"?s.toolCallId:void 0,l="",c=s.rawInput;c&&(typeof c.command=="string"?l=c.command:typeof c.file_path=="string"?l=c.file_path:typeof c.path=="string"?l=c.path:l=pe(JSON.stringify(c))),t({kind:"tool_use",tool:o,summary:pe(l),id:a});return}if(i==="tool_call_update"){let o=s.status||"",a=typeof s.toolCallId=="string"?s.toolCallId:void 0;if(o==="completed"||o==="failed")t({kind:"tool_result",summary:o,status:o==="failed"?"error":"ok",id:a});else if(o==="in_progress"){let l=s.content,c=typeof l=="string"?l:typeof l?.text=="string"?l.text:"",d=c?`running\u2026 ${pe(c,80)}`:"running\u2026";t({kind:"other",summary:d,id:a})}return}t({kind:"other",summary:i})}}async function Zr(e,t){let r=t.acpTool||t.binary;t.model&&r==="copilot"&&Ae({event:"model_ignored",provider:r,model:t.model,reason:"copilot --acp does not implement per-session model selection"});let n=t.onProgress?BN():void 0,s=await gp(e,{tool:r,sessionId:t.sessionId,cwd:t.cwd,env:t.env,binaryPath:t.progPath,model:t.model,effort:t.effort,alias:t.alias,permissionMode:t.permissionMode,onDelta:t.onDelta,onEvent:n?i=>n(i,t.onProgress):void 0,signal:t.signal});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason}}function HN(e,t){let r=e.method;if(!r)return;let n=e.params;if(r==="turn/started"){t({kind:"system",summary:"turn started"});return}if(r==="turn/completed"){t({kind:"system",summary:"turn completed"});return}if(r==="error"){let s=n?.error,i=typeof s?.message=="string"?s.message:void 0,o=i&&i.length>0?i:"(no message)",a=n?.willRetry===!0;t(a?{kind:"api_retry",summary:`codex retry: ${pe(o,120)}`}:{kind:"other",summary:`codex error: ${pe(o,120)}`});return}if(r==="item/started"||r==="item/completed"){let s=n?.item;if(!s)return;let i=s.type,o=r==="item/started";switch(i){case"commandExecution":{let a=typeof s.id=="string"?s.id:void 0,l=s.command,c=Array.isArray(l)?l.join(" "):typeof l=="string"?l:"";if(o)t({kind:"tool_use",tool:"Bash",summary:pe(c||"(command)"),id:a});else{let d=s.exitCode,u=s.status||"",f=typeof s.durationMs=="number"?s.durationMs:void 0,m=typeof d=="number"?`exit ${d}`:u||"done",p=[];typeof d=="number"?p.push(`exit ${d}`):u&&p.push(u),typeof f=="number"&&p.push(`${Math.round(f/1e3)}s`),t({kind:"tool_result",summary:p.join(", ")||"done",status:m,elapsedMs:f,id:a})}return}case"fileChange":{let a=typeof s.id=="string"?s.id:void 0;if(o){let l=s.changes,c=Array.isArray(l)?l.map(d=>d.path||"").filter(Boolean).join(", "):"";t({kind:"tool_use",tool:"FileChange",summary:pe(c||"(edit)"),id:a})}else{let l=s.status||"done";t({kind:"tool_result",summary:l,status:l,id:a})}return}case"mcpToolCall":{let a=typeof s.id=="string"?s.id:void 0,l=s.server||"mcp",c=s.tool||"tool";if(o)t({kind:"tool_use",tool:`${l}/${c}`,summary:"",id:a});else{let d=s.status||"done";t({kind:"tool_result",summary:d,status:d,id:a})}return}case"webSearch":{let a=typeof s.id=="string"?s.id:void 0;t(o?{kind:"tool_use",tool:"WebSearch",summary:pe(s.query||""),id:a}:{kind:"tool_result",summary:"done",status:"done",id:a});return}case"reasoning":{o&&t({kind:"thinking",summary:""});return}case"agentMessage":case"userMessage":return;default:{i&&t({kind:o?"tool_use":"tool_result",tool:i,summary:""});return}}}if(r==="item/agentMessage/delta"){let s=n?.delta||"";if(s){let i=typeof n?._lmctlItemPhase=="string"?n._lmctlItemPhase:void 0;t(i==="commentary"?{kind:"thinking",summary:pe(s)}:{kind:"text",summary:pe(s)})}return}if(r==="item/reasoning/summaryTextDelta"||r==="item/reasoning/textDelta"){let s=n?.delta||"";s&&t({kind:"thinking",summary:pe(s)});return}if(r==="item/commandExecution/outputDelta"){let s=(typeof n?.delta=="string"?n.delta:"")||"";if(s){let i=s.split(`
|
|
1395
1395
|
`).filter(l=>l.length>0),o=i[i.length-1]||"",a=i.length>1?`${i.length} lines: ${pe(o,60)}`:pe(s,80);t({kind:"other",summary:`running\u2026 ${a}`})}else t({kind:"other",summary:"running\u2026"});return}if(r==="item/commandExecution/terminalInteraction"||r==="item/commandExecution/outputChunk"||r==="item/commandExecution/output"){let s=(typeof n?.stdin=="string"?n.stdin:"")||(typeof n?.delta=="string"?n.delta:"")||(typeof n?.output=="string"?n.output:"")||(typeof n?.text=="string"?n.text:"")||(typeof n?.content=="string"?n.content:"")||(typeof n?.chunk=="string"?n.chunk:"")||"";if(s){let i=s.split(`
|
|
1396
|
-
`).filter(l=>l.length>0),o=i[i.length-1]||"",a=i.length>1?`${i.length} lines: ${pe(o,60)}`:pe(s,80);t({kind:"other",summary:`running\u2026 ${a}`})}else t({kind:"other",summary:"running\u2026"});return}if(r.startsWith("item/")){t({kind:"other",summary:r.slice(5)});return}}async function Ep(e,t){let r=await op(e,{threadId:t.sessionId,cwd:t.cwd,env:t.env,binaryPath:t.progPath,model:t.model,alias:t.alias,isLead:t.isLead,permissionMode:t.permissionMode,onDelta:t.onDelta,onEvent:t.onProgress?n=>HN(n,t.onProgress):void 0,signal:t.signal});return{text:r.result,sessionId:r.threadId,durationMs:r.durationMs}}var FN,Ir=T(()=>{"use strict";np();ap();yp();
|
|
1397
|
-
`);try{return JSON.stringify(e)}catch{return String(e)}}async function Sp(e){let t=0,r=0,n=0,s=0,i=0,o,a;for await(let l of We(e)){if(l.type==="response_item"&&l.payload){let c=l.payload;if(c.type==="message"&&c.role==="user"&&c.content)for(let d of c.content)d.type==="input_text"&&typeof d.text=="string"&&d.text&&t++;else if(c.type==="message"&&c.role==="assistant"&&c.content)for(let d of c.content)d.type==="output_text"&&typeof d.text=="string"&&d.text&&t++}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,i=c.reasoning_output_tokens??i;let d=KN(l.payload.info.last_token_usage);d&&(o=d),typeof l.payload.info.model_context_window=="number"&&(a=l.payload.info.model_context_window)}}return{messageCount:t,totalInputTokens:r,totalCachedInputTokens:n,totalOutputTokens:s,totalReasoningOutputTokens:i,lastTokenUsage:o,modelContextWindow:a}}var
|
|
1398
|
-
`);S.trim()&&Qn(s,m,{role:"thinking",timestamp:g,content:fe(S)});continue}}if(_.type==="event_msg"&&_.payload&&_.payload.type==="agent_reasoning"){let h=_.payload.message||_.payload.text;h&&Qn(s,m,{role:"thinking",timestamp:g,content:fe(h)})}}if(!i)return null;let p=await Sp(r);return{provider:"codex",sessionId:u,cwd:i,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:o,startCommand:f,firstUserMessage:c,lastUserMessage:d,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(t){return this.resolveSessionFile(t)}async deleteSession(t){let r=await this.resolveSessionFile(t);return r?(await XN(r),!0):!1}async resolveSessionFile(t){let r=await this.getSessionsDirs(),n=[];for(let i of r){let o=await this.findSessionFiles(i);n.push(...o)}for(let i of n)if(this.extractSessionIdFromFilename(i)===t)return i;let s=[];for(let i of n)this.extractSessionIdFromFilename(i).startsWith(t)&&s.push(i);if(s.length===1)return s[0];for(let i of n){let o=await Ce(i,1);if(o.length>0&&o[0].type==="session_meta"){let a=o[0].payload?.id;if(a===t||a&&a.startsWith(t))return i}}return null}}});function Rl(e){return new Al(e)}var Al,Ll=T(()=>{"use strict";vp();Ut();Ir();Tt();Al=class extends xe{constructor(t){super({provider:new
|
|
1399
|
-
`,resumeTemplate:"codex resume {{session_id}}",startTemplate:"codex",transport:Ep})}seedArgsFor(t){let r=super.seedArgsFor(t);return t?.model?[...r.slice(0,-1),"--model",t.model,r[r.length-1]]:r}}});function es(e){if(!e.trim())return"unknown";let t=e.split(/\r?\n/).filter(n=>n.trim().length>0);if(t.length>1)try{let n=JSON.parse(t[0]);if(n!==null&&typeof n=="object"&&!Array.isArray(n)&&"kind"in n)return"jsonl"}catch{}let r;try{r=JSON.parse(e)}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
|
|
1396
|
+
`).filter(l=>l.length>0),o=i[i.length-1]||"",a=i.length>1?`${i.length} lines: ${pe(o,60)}`:pe(s,80);t({kind:"other",summary:`running\u2026 ${a}`})}else t({kind:"other",summary:"running\u2026"});return}if(r.startsWith("item/")){t({kind:"other",summary:r.slice(5)});return}}async function Ep(e,t){let r=await op(e,{threadId:t.sessionId,cwd:t.cwd,env:t.env,binaryPath:t.progPath,model:t.model,alias:t.alias,isLead:t.isLead,permissionMode:t.permissionMode,onDelta:t.onDelta,onEvent:t.onProgress?n=>HN(n,t.onProgress):void 0,signal:t.signal});return{text:r.result,sessionId:r.threadId,durationMs:r.durationMs}}var FN,Ir=T(()=>{"use strict";np();ap();yp();he();FN=256});function Nl(e){return new Il(e)}var Il,xl=T(()=>{"use strict";Jm();Ut();Ir();Tt();Il=class extends xe{constructor(t){super({provider:new si(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"claude",seedArgs:["-p",ge,"--dangerously-skip-permissions"],resumeTemplate:"claude --resume {{session_id}}",startTemplate:"claude",transport:pi})}seedArgsFor(t){let r=super.seedArgsFor(t);return t?.model?[...r,"--model",t.model]:r}}});import{readdir as JN,stat as Tp,unlink as XN}from"node:fs/promises";import{join as Zn,basename as GN}from"node:path";function VN(e,t,r){return`${e}|${t.toISOString()}|${r}`}function Qn(e,t,r){let n=VN(r.role,r.timestamp,r.content);t.has(n)||(t.add(n),e.push(r))}function bp(e,t){return t==="exec"||e==="codex_exec"?"codex exec":"codex"}function KN(e){if(!e)return;let t=e.cached_input_tokens??e.cache_read_input_tokens;return{inputTokens:e.input_tokens,cachedInputTokens:t,outputTokens:e.output_tokens,reasoningOutputTokens:e.reasoning_output_tokens,totalTokens:e.total_tokens}}function _i(e){if(e==null)return"";if(typeof e=="string")return e;if(typeof e=="number"||typeof e=="boolean")return String(e);if(Array.isArray(e))return e.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 _i(r)}).filter(r=>r.length>0).join(`
|
|
1397
|
+
`);try{return JSON.stringify(e)}catch{return String(e)}}async function Sp(e){let t=0,r=0,n=0,s=0,i=0,o,a;for await(let l of We(e)){if(l.type==="response_item"&&l.payload){let c=l.payload;if(c.type==="message"&&c.role==="user"&&c.content)for(let d of c.content)d.type==="input_text"&&typeof d.text=="string"&&d.text&&t++;else if(c.type==="message"&&c.role==="assistant"&&c.content)for(let d of c.content)d.type==="output_text"&&typeof d.text=="string"&&d.text&&t++}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,i=c.reasoning_output_tokens??i;let d=KN(l.payload.info.last_token_usage);d&&(o=d),typeof l.payload.info.model_context_window=="number"&&(a=l.payload.info.model_context_window)}}return{messageCount:t,totalInputTokens:r,totalCachedInputTokens:n,totalOutputTokens:s,totalReasoningOutputTokens:i,lastTokenUsage:o,modelContextWindow:a}}var hi,vp=T(()=>{"use strict";nr();hi=class{name="codex";codexDirs;constructor(t={}){let r=[Zn(be,".codex"),Zn(be,".code")];if(t.codexDirs&&t.codexDirs.length>0){this.codexDirs=[...new Set(t.codexDirs)];return}let n=[t.codexDir||r[0],t.codeDir||r[1]];this.codexDirs=[...new Set(n)]}getWatchPaths(){return this.codexDirs.map(t=>({directory:Zn(t,"sessions"),filePattern:/\.jsonl$/}))}async getSessionsDirs(){let t=[];for(let r of this.codexDirs){let n=Zn(r,"sessions");try{await Tp(n),t.push(n)}catch{}}return t}async discoverSessions(){let t=[],r=await this.getSessionsDirs();for(let n of r){let s=await this.findSessionFiles(n);for(let i of s)try{let o=await this.extractSummary(i);o&&t.push(o)}catch{}}return t}async findSessionFiles(t){let r=[],n;try{n=await JN(t)}catch{return r}for(let s of n){let i=Zn(t,s),o=await Tp(i).catch(()=>null);if(o)if(o.isDirectory()){let a=await this.findSessionFiles(i);r.push(...a)}else s.endsWith(".jsonl")&&r.push(i)}return r}extractSessionIdFromFilename(t){let r=GN(t,".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(t){let r=await Ce(t,30),n=await Ne(t),s=this.extractSessionIdFromFilename(t),i="",o,a,l,c,d,u,f;for(let p of r){if(p.type==="session_meta"&&p.payload&&(p.payload.id&&(s=p.payload.id),p.payload.cwd&&(i=p.payload.cwd),p.payload.cli_version&&(o=p.payload.cli_version),p.payload.timestamp&&(l=new Date(p.payload.timestamp)),p.payload.originator&&(u=p.payload.originator),p.payload.source&&(f=p.payload.source)),p.type==="turn_context"&&p.payload&&(p.payload.model&&(a=p.payload.model),!i&&p.payload.cwd&&(i=p.payload.cwd)),p.type==="event_msg"&&p.payload?.type==="user_message"){let _=p.payload.message||p.payload.text;_&&(c||(c=J(_.trim(),80)),d=J(_.trim(),80))}if(p.type==="response_item"&&p.payload?.type==="message"&&p.payload.role==="user"&&p.payload.content){let _=p.payload.content.find(g=>g.type==="input_text"&&typeof g.text=="string"&&g.text);typeof _?.text=="string"&&(c||(c=J(_.text.trim(),80)),d=J(_.text.trim(),80))}}if(!i)return null;let m=await Sp(t);return{provider:"codex",sessionId:s,cwd:i,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:o,startCommand:bp(u,f),firstUserMessage:c,lastUserMessage:d,messageCount:m.messageCount,filePath:t,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(t){let r=await this.resolveSessionFile(t);if(!r)return null;let n=await Ne(r),s=[],i="",o,a,l,c,d,u=t,f,m=new Set;for await(let _ of We(r)){let g=_.timestamp?new Date(_.timestamp):new Date;if(_.type==="session_meta"&&_.payload){_.payload.id&&(u=_.payload.id),_.payload.cwd&&(i=_.payload.cwd),_.payload.cli_version&&(o=_.payload.cli_version),_.payload.timestamp&&(l=new Date(_.payload.timestamp)),f=bp(_.payload.originator,_.payload.source);continue}if(_.type==="turn_context"&&_.payload){_.payload.model&&(a=_.payload.model),!i&&_.payload.cwd&&(i=_.payload.cwd);continue}if(_.type==="response_item"&&_.payload){let h=_.payload;if(h.type==="message"){if(h.role==="user"&&h.content){for(let S of h.content)if(S.type==="input_text"&&typeof S.text=="string"&&S.text){let y=S.text.trim();c||(c=J(y,80)),d=J(y,80),Qn(s,m,{role:"user",timestamp:g,content:fe(y)})}continue}if(h.role==="assistant"&&h.content){for(let S of h.content)S.type==="output_text"&&typeof S.text=="string"&&S.text&&Qn(s,m,{role:"assistant",timestamp:g,content:fe(S.text),model:a});continue}if(h.role!=="user"&&h.role!=="assistant"&&h.content){for(let S of h.content)(S.type==="input_text"||S.type==="output_text")&&typeof S.text=="string"&&S.text&&Qn(s,m,{role:"system",timestamp:g,content:fe(S.text.trim())});continue}}if(h.type==="function_call"){s.push({role:"tool_use",timestamp:g,content:h.name||"unknown tool",toolName:h.name,toolInput:h.arguments!==void 0?fe(_i(h.arguments)):void 0,toolCallId:h.call_id});continue}if(h.type==="function_call_output"){s.push({role:"tool_result",timestamp:g,content:fe(_i(h.output)),toolCallId:h.call_id});continue}if(h.type==="reasoning"&&h.summary){let S=h.summary.map(y=>_i(y.text)).join(`
|
|
1398
|
+
`);S.trim()&&Qn(s,m,{role:"thinking",timestamp:g,content:fe(S)});continue}}if(_.type==="event_msg"&&_.payload&&_.payload.type==="agent_reasoning"){let h=_.payload.message||_.payload.text;h&&Qn(s,m,{role:"thinking",timestamp:g,content:fe(h)})}}if(!i)return null;let p=await Sp(r);return{provider:"codex",sessionId:u,cwd:i,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:o,startCommand:f,firstUserMessage:c,lastUserMessage:d,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(t){return this.resolveSessionFile(t)}async deleteSession(t){let r=await this.resolveSessionFile(t);return r?(await XN(r),!0):!1}async resolveSessionFile(t){let r=await this.getSessionsDirs(),n=[];for(let i of r){let o=await this.findSessionFiles(i);n.push(...o)}for(let i of n)if(this.extractSessionIdFromFilename(i)===t)return i;let s=[];for(let i of n)this.extractSessionIdFromFilename(i).startsWith(t)&&s.push(i);if(s.length===1)return s[0];for(let i of n){let o=await Ce(i,1);if(o.length>0&&o[0].type==="session_meta"){let a=o[0].payload?.id;if(a===t||a&&a.startsWith(t))return i}}return null}}});function Rl(e){return new Al(e)}var Al,Ll=T(()=>{"use strict";vp();Ut();Ir();Tt();Al=class extends xe{constructor(t){super({provider:new hi(t),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:`${ge}
|
|
1399
|
+
`,resumeTemplate:"codex resume {{session_id}}",startTemplate:"codex",transport:Ep})}seedArgsFor(t){let r=super.seedArgsFor(t);return t?.model?[...r.slice(0,-1),"--model",t.model,r[r.length-1]]:r}}});function es(e){if(!e.trim())return"unknown";let t=e.split(/\r?\n/).filter(n=>n.trim().length>0);if(t.length>1)try{let n=JSON.parse(t[0]);if(n!==null&&typeof n=="object"&&!Array.isArray(n)&&"kind"in n)return"jsonl"}catch{}let r;try{r=JSON.parse(e)}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 gi(e){let t=es(e);if(t==="unknown")throw new Error("gemini session content matches neither known format (old .json with messages[] or new .jsonl with kind metadata)");if(t==="json"){let a=JSON.parse(e);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=e.split(`
|
|
1400
1400
|
`).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 i=[],o=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 d=c;if(typeof d.id=="string"){let u=o.get(d.id);u?YN(u,d):(i.push(d),o.set(d.id,d))}else i.push(d)}}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:i}}function YN(e,t){for(let[r,n]of Object.entries(t))if(n!==void 0){if(r==="tokens"&&kp(e.tokens)&&kp(n)){e.tokens={...e.tokens,...n};continue}e[r]=n}}function kp(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Ip(e,t){if(t==="json")return JSON.stringify(e,null,2);let{messages:r,...n}=e,s=[JSON.stringify(n)];for(let i of r)s.push(JSON.stringify(i));return s.join(`
|
|
1401
1401
|
`)+`
|
|
1402
|
-
`}var Ol=T(()=>{"use strict"});import{createHash as zN}from"node:crypto";import{readdir as ts,readFile as Np,stat as
|
|
1403
|
-
`).trim();x&&i.push({role:"thinking",timestamp:Nr(I.timestamp,h),content:fe(x)})}i.push({role:"assistant",timestamp:h,content:y,model:g.model});continue}let w=S?`[${S}] `:"";i.push({role:"system",timestamp:h,content:`${w}${y}`.trim()})}let m=Nr(n.startTime,s.createdAt),p=Nr(n.lastUpdated,s.modifiedAt),_=Rp(o);return{provider:"gemini",sessionId:a,cwd:c,createdAt:m,modifiedAt:p,model:f,startCommand:"gemini",firstUserMessage:d,lastUserMessage:u,messageCount:i.filter(g=>g.role==="user"||g.role==="assistant").length,filePath:r,totalInputTokens:_.totalInputTokens||void 0,totalCachedInputTokens:_.totalCachedInputTokens||void 0,totalOutputTokens:_.totalOutputTokens||void 0,totalReasoningOutputTokens:_.totalReasoningOutputTokens||void 0,lastInputTokens:_.lastInputTokens||void 0,lastTokenUsage:_.lastTokenUsage,messages:i}}async extractSummary(t){let r=await this.readSessionFile(t);if(!r)return null;let n=await Ne(t),s=r.messages||[],i=r.sessionId||this.extractSessionIdFromFilename(t),o=r.projectHash||"",a=await this.resolveWorkspace(o),l,c,d,u=0;for(let m of s)if(Ap(m.type)){u++;let p=xp(m.content).trim();p&&(l||(l=
|
|
1404
|
-
`)}seedArgsFor(t){let r=super.seedArgsFor(t);return t?.model?[...r,"--model",t.model]:r}manualSeedHint(t){return{launchCommand:`cd ${t} && gemini --skip-trust`,postLaunchNote:
|
|
1405
|
-
`)){let n=r.match(/^(\w+):\s*(.*)$/);n&&(t[n[1]]=n[2].trim())}return{id:t.id,cwd:t.cwd,summary_count:t.summary_count?parseInt(t.summary_count,10):void 0,created_at:t.created_at,updated_at:t.updated_at,summary:t.summary}}function xr(e){if(!e)return;let t=new Date(e);return Number.isNaN(t.getTime())?void 0:t}async function _0(e){let t=0;for await(let r of We(e))(r.type==="user.message"||r.type==="assistant.message"&&(r.data?.content||"").trim())&&t++;return t}var
|
|
1402
|
+
`}var Ol=T(()=>{"use strict"});import{createHash as zN}from"node:crypto";import{readdir as ts,readFile as Np,stat as yi,unlink as ZN}from"node:fs/promises";import{join as Ge,basename as QN,dirname as e0}from"node:path";import{cwd as t0}from"node:process";function xp(e){return e?typeof e=="string"?e:Array.isArray(e)?e.map(t=>t.text||"").join(""):"":""}function Ap(e){return e==="user"}function $l(e){return e==="gemini"||e==="assistant"}function Nr(e,t=new Date(0)){if(!e)return t;let r=new Date(e);return Number.isNaN(r.getTime())?t:r}function r0(e){return`${e.sessionId}\0${e.cwd}`}function n0(e,t){let r=e.filePaths??[e.filePath],n=t.filePaths??[t.filePath],s=[...new Set([...r,...n])],i=t.modifiedAt.getTime()>=e.modifiedAt.getTime()?t:e;return{...i,createdAt:e.createdAt.getTime()<=t.createdAt.getTime()?e.createdAt:t.createdAt,modifiedAt:i.modifiedAt,filePath:i.filePath,filePaths:s}}function wi(e){let t=Number(e??0);return Number.isFinite(t)?Math.max(0,Math.round(t)):0}function Rp(e){let t=0,r=0,n=0,s=0,i=0,o;for(let a of e){if(!$l(a.type)||!a.tokens)continue;let l=wi(a.tokens.input),c=wi(a.tokens.cached),d=Math.max(l-c,0),u=wi(a.tokens.output),f=wi(a.tokens.thoughts);t+=l,r+=c,n+=u,s+=f,i=l,o={inputTokens:d,cachedInputTokens:c,cacheWriteInputTokens:0,outputTokens:u,reasoningOutputTokens:f,totalTokens:l+u+f}}return{totalInputTokens:t,totalCachedInputTokens:r,totalOutputTokens:n,totalReasoningOutputTokens:s,lastInputTokens:i,lastTokenUsage:o}}function s0(e){return zN("sha256").update(e).digest("hex")}function rs(e,t){let r=t;for(;r&&!e.has(r);){e.add(r);let n=e0(r);if(n===r)break;r=n}}var Ei,Lp=T(()=>{"use strict";nr();Ol();he();Ei=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(t={}){let r=t.geminiDir||Ge(be,".gemini");this.geminiProjectsFile=Ge(r,"projects.json"),this.geminiTmpDir=Ge(r,"tmp");let n=t.claudeDir||Ge(be,".claude");this.claudeProjectsDir=Ge(n,"projects");let s=[Ge(be,".codex"),Ge(be,".code")],i=t.codexDirs&&t.codexDirs.length>0?t.codexDirs:[t.codexDir||s[0],t.codeDir||s[1]];this.codexSessionDirs=[...new Set(i)].map(o=>Ge(o,"sessions")),this.extraWorkspacePaths=t.extraWorkspacePaths||[]}getWatchPaths(){return[{directory:this.geminiTmpDir,filePattern:/\.jsonl?$/}]}async discoverSessions(){let t=await this.findSessionFiles(),r=new Map;for(let n of t)try{let s=await this.extractSummary(n);if(!s)continue;let i=r0(s),o=r.get(i);r.set(i,o?n0(o,s):s)}catch{}return[...r.values()]}async loadSession(t){let r=await this.resolveSessionFile(t);if(!r)return null;let n;try{n=await this.readSessionFile(r)}catch{return null}if(!n)return null;let s=await Ne(r),i=[],o=n.messages||[],a=n.sessionId||this.extractSessionIdFromFilename(r),l=n.projectHash||"",c=await this.resolveWorkspace(l),d,u,f;for(let g of o){let h=Nr(g.timestamp),S=g.type,y=fe(xp(g.content));if(Ap(S)){let I=y.trim();I&&(d||(d=J(I,80)),u=J(I,80)),i.push({role:"user",timestamp:h,content:I||y});continue}if($l(S)){g.model&&(f=g.model);for(let I of g.thoughts||[]){let x=[I.subject,I.description].filter(Boolean).join(`
|
|
1403
|
+
`).trim();x&&i.push({role:"thinking",timestamp:Nr(I.timestamp,h),content:fe(x)})}i.push({role:"assistant",timestamp:h,content:y,model:g.model});continue}let w=S?`[${S}] `:"";i.push({role:"system",timestamp:h,content:`${w}${y}`.trim()})}let m=Nr(n.startTime,s.createdAt),p=Nr(n.lastUpdated,s.modifiedAt),_=Rp(o);return{provider:"gemini",sessionId:a,cwd:c,createdAt:m,modifiedAt:p,model:f,startCommand:"gemini",firstUserMessage:d,lastUserMessage:u,messageCount:i.filter(g=>g.role==="user"||g.role==="assistant").length,filePath:r,totalInputTokens:_.totalInputTokens||void 0,totalCachedInputTokens:_.totalCachedInputTokens||void 0,totalOutputTokens:_.totalOutputTokens||void 0,totalReasoningOutputTokens:_.totalReasoningOutputTokens||void 0,lastInputTokens:_.lastInputTokens||void 0,lastTokenUsage:_.lastTokenUsage,messages:i}}async extractSummary(t){let r=await this.readSessionFile(t);if(!r)return null;let n=await Ne(t),s=r.messages||[],i=r.sessionId||this.extractSessionIdFromFilename(t),o=r.projectHash||"",a=await this.resolveWorkspace(o),l,c,d,u=0;for(let m of s)if(Ap(m.type)){u++;let p=xp(m.content).trim();p&&(l||(l=J(fe(p),80)),c=J(fe(p),80))}else $l(m.type)&&(u++,m.model&&(d=m.model));let f=Rp(s);return{provider:"gemini",sessionId:i,cwd:a,createdAt:Nr(r.startTime,n.createdAt),modifiedAt:Nr(r.lastUpdated,n.modifiedAt),model:d,startCommand:"gemini",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:t,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(t){let r=await Np(t,"utf-8");if(es(r)==="unknown")return H({event:"gemini_session_format_unknown",provider:"gemini",file:t,preview:r.slice(0,120),message:`gemini session file at ${t} 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 gi(r)}catch{return null}}extractSessionIdFromFilename(t){let r=QN(t).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 t=[],r;try{r=await ts(this.geminiTmpDir)}catch{return t}for(let n of r){let s=Ge(this.geminiTmpDir,n,"chats");if(!(await yi(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await ts(s)}catch{continue}for(let a of o)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||t.push(Ge(s,a)))}return t}async resolveSessionPath(t){return this.resolveSessionFile(t)}async deleteSession(t){let r=await this.resolveSessionFile(t);return r?(await ZN(r),!0):!1}async resolveSessionFile(t){let r=await this.findSessionFiles(),n=[];for(let s of r){let i=await this.readSessionFile(s).catch(()=>null),o=this.extractSessionIdFromFilename(s),a=i?.sessionId||o,l=a===t||a.startsWith(t),c=o===t||o.startsWith(t)||o.length>=8&&t.startsWith(o);if(!l&&!c)continue;let d=await Ne(s).catch(()=>({createdAt:new Date(0),modifiedAt:new Date(0)}));n.push({filePath:s,modifiedAt:Nr(i?.lastUpdated,d.modifiedAt)})}return n.sort((s,i)=>{let o=i.modifiedAt.getTime()-s.modifiedAt.getTime();return o!==0?o:i.filePath.localeCompare(s.filePath)}),n[0]?.filePath??null}async resolveWorkspace(t){return t?(await this.getWorkspaceHashMap()).get(t)||`[hash:${t.slice(0,16)}]`:"(unknown workspace)"}async getWorkspaceHashMap(){if(this.workspaceHashMap)return this.workspaceHashMap;let t=new Set;rs(t,t0());for(let n of this.extraWorkspacePaths)rs(t,n);for(let n of await this.collectGeminiProjectPaths())rs(t,n);for(let n of await this.collectCodexCwds())rs(t,n);for(let n of await this.collectClaudeCwds())rs(t,n);let r=new Map;for(let n of t)r.set(s0(n),n);return this.workspaceHashMap=r,r}async collectGeminiProjectPaths(){let t;try{t=await Np(this.geminiProjectsFile,"utf-8")}catch{return[]}try{let n=JSON.parse(t).projects;return!n||typeof n!="object"||Array.isArray(n)?[]:Object.keys(n)}catch{return[]}}async collectCodexCwds(){let t=new Set;for(let r of this.codexSessionDirs){let n=await this.findJsonlFiles(r);for(let s of n){let o=(await Ce(s,1).catch(()=>[]))[0]?.payload?.cwd;o&&t.add(o)}}return[...t]}async collectClaudeCwds(){let t=new Set,r;try{r=await ts(this.claudeProjectsDir)}catch{return[]}for(let n of r){let s=Ge(this.claudeProjectsDir,n);if(!(await yi(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await ts(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=Ge(s,a),d=(await Ce(l,1).catch(()=>[]))[0]?.cwd;d&&t.add(d)}}return[...t]}async findJsonlFiles(t){let r=[];if(!(await yi(t).catch(()=>null))?.isDirectory())return r;let s;try{s=await ts(t)}catch{return r}for(let i of s){let o=Ge(t,i),a=await yi(o).catch(()=>null);if(a)if(a.isDirectory()){let l=await this.findJsonlFiles(o);r.push(...l)}else i.endsWith(".jsonl")&&r.push(o)}return r}}});import{readFileSync as i0,writeFileSync as o0,mkdirSync as a0}from"node:fs";import{join as l0,dirname as c0}from"node:path";import{randomUUID as d0}from"node:crypto";function Ml(e){return new Cl(e)}var Cl,jl=T(()=>{"use strict";Lp();Ut();Ir();Tt();Ol();Cl=class extends xe{constructor(t){super({provider:new Ei(t),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",ge,"-y","--skip-trust"],resumeTemplate:"gemini --resume {{session_id}} --skip-trust",startTemplate:"gemini --skip-trust",transport:(r,n)=>Zr(r,{...n,acpTool:"gemini"})})}forkHint(t){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(`
|
|
1404
|
+
`)}seedArgsFor(t){let r=super.seedArgsFor(t);return t?.model?[...r,"--model",t.model]:r}manualSeedHint(t){return{launchCommand:`cd ${t} && gemini --skip-trust`,postLaunchNote:oi,lsCommand:`lmctl ls --provider gemini --sessiondir ${t}`}}async fork(t,r){let n=await this.resolvePath(t);if(!n)return{success:!1,error:`Session file not found for ${t}`};try{let s=i0(n,"utf-8"),i=es(s),o=gi(s),a=d0();o.sessionId=a,o.kind="main";let l=c0(n),c=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),d=i==="jsonl"?".jsonl":".json",u=`session-${c}-${a.slice(0,8)}${d}`,f=l0(l,u);return a0(l,{recursive:!0}),o0(f,Ip(o,i),"utf-8"),{success:!0,sessionId:a,filePath:f}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}}});import{readdir as Op,readFile as u0,rm as f0,stat as Qr}from"node:fs/promises";import{basename as m0,join as lt}from"node:path";function p0(e){let t={};for(let r of e.split(`
|
|
1405
|
+
`)){let n=r.match(/^(\w+):\s*(.*)$/);n&&(t[n[1]]=n[2].trim())}return{id:t.id,cwd:t.cwd,summary_count:t.summary_count?parseInt(t.summary_count,10):void 0,created_at:t.created_at,updated_at:t.updated_at,summary:t.summary}}function xr(e){if(!e)return;let t=new Date(e);return Number.isNaN(t.getTime())?void 0:t}async function _0(e){let t=0;for await(let r of We(e))(r.type==="user.message"||r.type==="assistant.message"&&(r.data?.content||"").trim())&&t++;return t}var Ti,$p=T(()=>{"use strict";nr();Ti=class{name="copilot";sessionStateDir;constructor(t={}){let r=t.copilotDir||lt(be,".copilot");this.sessionStateDir=lt(r,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let t=[],r;try{r=await Op(this.sessionStateDir)}catch{return t}for(let n of r){let s=lt(this.sessionStateDir,n);if((await Qr(s).catch(()=>null))?.isDirectory())try{let o=await this.extractSummary(s,n);o&&t.push(o)}catch{}}return t}async loadSession(t){let r=await this.resolveSessionDir(t);if(!r)return null;let n=await this.readWorkspaceYaml(r),s=lt(r,"events.jsonl"),i=await Qr(s).catch(()=>null),o=i?s:lt(r,"workspace.yaml"),a=await Ne(i?s:r),l=[],c=n?.cwd||"(unknown workspace)",d,u,f,m,p,_,g=n?.id||m0(r)||t;if(i)for await(let h of We(s)){let S=xr(h.timestamp)||a.modifiedAt;if(h.type==="session.start"&&h.data){h.data.sessionId&&(g=h.data.sessionId),h.data.copilotVersion&&(u=h.data.copilotVersion),h.data.startTime&&(_=xr(h.data.startTime)),h.data.selectedModel&&(d=h.data.selectedModel),h.data.context&&(h.data.context.cwd&&(c=h.data.context.cwd),h.data.context.branch&&(f=h.data.context.branch));continue}if(h.type==="session.model_change"&&h.data?.newModel){d=h.data.newModel;continue}if(h.type==="user.message"&&h.data){let y=h.data.content||"",w=y.trim();w&&(m||(m=J(w,80)),p=J(w,80)),l.push({role:"user",timestamp:S,content:fe(w||y)});continue}if(h.type==="assistant.message"&&h.data){let y=(h.data.content||"").trim();if(y&&l.push({role:"assistant",timestamp:S,content:fe(y),model:d}),h.data.toolRequests)for(let w of h.data.toolRequests)l.push({role:"tool_use",timestamp:S,content:w.name||"unknown tool",toolName:w.name,toolInput:w.arguments?JSON.stringify(w.arguments,null,2):void 0,toolCallId:w.toolCallId});continue}if(h.type==="tool.execution_complete"&&h.data){let y=h.data.result?.content||"",w=h.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:S,content:fe(y),toolDetailedContent:w?fe(w):void 0,toolCallId:h.data.toolCallId});continue}if(h.type==="assistant.reasoning"&&h.data?.content){l.push({role:"thinking",timestamp:S,content:fe(h.data.content)});continue}if(h.type==="session.error"||h.type==="session.warning"||h.type==="session.info"||h.type==="system.message"){let y=h.data?.message||"";y.trim()&&l.push({role:"system",timestamp:S,content:fe(y)});continue}}if(!m){let h=(n?.summary||"").trim();h&&(m=J(h,80))}return{provider:"copilot",sessionId:g,cwd:c,createdAt:_??xr(n?.created_at)??a.createdAt,modifiedAt:xr(n?.updated_at)??a.modifiedAt,model:d,cliVersion:u,startCommand:"copilot",gitBranch:f,firstUserMessage:m,lastUserMessage:p,messageCount:l.filter(h=>h.role==="user"||h.role==="assistant").length,filePath:o,messages:l}}async extractSummary(t,r){let n=await this.readWorkspaceYaml(t),s=lt(t,"events.jsonl"),i=await Qr(s).catch(()=>null),o=i?s:lt(t,"workspace.yaml"),a=await Ne(i?s:t),l=i?await Ce(s,20):[],c=n?.id||r,d=n?.cwd||"(unknown workspace)",u,f,m,p,_;for(let h of l)if(h.type==="session.start"&&h.data&&(h.data.sessionId&&(c=h.data.sessionId),h.data.copilotVersion&&(f=h.data.copilotVersion),h.data.startTime&&(m=xr(h.data.startTime)),h.data.selectedModel&&(u=h.data.selectedModel),h.data.context?.cwd&&(d=h.data.context.cwd)),h.type==="session.model_change"&&h.data?.newModel&&(u||(u=h.data.newModel)),h.type==="user.message"&&h.data){let S=(h.data.content||"").trim();S&&(p||(p=J(S,80)),_=J(S,80))}if(!p){let h=(n?.summary||"").trim();h&&(p=J(h,80))}let g=i?await _0(s):0;return{provider:"copilot",sessionId:c,cwd:d,createdAt:m??xr(n?.created_at)??a.createdAt,modifiedAt:xr(n?.updated_at)??a.modifiedAt,model:u,cliVersion:f,startCommand:"copilot",firstUserMessage:p,lastUserMessage:_,messageCount:g,filePath:o}}async readWorkspaceYaml(t){let r=lt(t,"workspace.yaml");try{let n=await u0(r,"utf-8");return p0(n)}catch{return null}}async resolveSessionPath(t){return this.resolveSessionDir(t)}async deleteSession(t){let r=await this.resolveSessionDir(t);return r?(await f0(r,{recursive:!0}),!0):!1}async resolveSessionDir(t){let r;try{r=await Op(this.sessionStateDir)}catch{return null}if(r.includes(t)){let s=lt(this.sessionStateDir,t);if((await Qr(s).catch(()=>null))?.isDirectory())return s}let n=[];for(let s of r)if(s.startsWith(t)){let i=lt(this.sessionStateDir,s);(await Qr(i).catch(()=>null))?.isDirectory()&&n.push(i)}if(n.length===1)return n[0];for(let s of r){let i=lt(this.sessionStateDir,s);if(!(await Qr(i).catch(()=>null))?.isDirectory())continue;let a=await this.readWorkspaceYaml(i);if(a&&(a.id===t||a.id?.startsWith(t)))return i}return null}}});function Pl(e){return new Dl(e)}var Dl,Fl=T(()=>{"use strict";$p();Ut();Ir();he();Tt();Dl=class extends xe{constructor(t){super({provider:new Ti(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"copilot",seedArgs:["-p",ge,"--yolo"],resumeTemplate:"copilot --resume={{session_id}}",startTemplate:"copilot",transport:(r,n)=>Zr(r,{...n,acpTool:"copilot"})})}async seed(t,r){let n=await super.seed(t,r);if(r?.model===void 0||r.model.trim().length===0)return n;let s="copilot seed does not implement per-session model selection";return Ae({event:"model_ignored",provider:"copilot",model:r.model,reason:s}),{...n,warnings:[...n.warnings??[],`copilot seed ignored model=${r.model}: ${s}`]}}}});import{existsSync as Cp,readdirSync as h0,statSync as Mp}from"node:fs";import{join as or}from"node:path";import{createRequire as g0}from"node:module";function jp(){return Ul===null&&(Ul=g0(import.meta.url)("node:sqlite").DatabaseSync),Ul}function y0(){let e=process.env.XDG_DATA_HOME||or(be,".local","share"),t=process.env.XDG_CONFIG_HOME||or(be,".config");return[or(e,"opencode","opencode.db"),or(t,"opencode","opencode.db")]}function w0(){if(process.env.OPENCODE_DB)return[process.env.OPENCODE_DB];let e=process.env.XDG_DATA_HOME||or(be,".local","share"),t=or(e,"lmplayer"),r=or(t,"opencode-local.db"),n=[r];try{let s=h0(t).filter(i=>/^opencode.*\.db$/u.test(i)).map(i=>or(t,i)).filter(i=>i!==r).sort((i,o)=>{try{return Mp(o).mtimeMs-Mp(i).mtimeMs}catch{return 0}});n.push(...s)}catch{}return n}function E0(e){return e==="lmplayer"?w0():y0()}var Ul,en,Wl=T(()=>{"use strict";nr();Ul=null;en=class{name;startCommand;dbPaths;constructor(t){this.name=t?.providerName??"opencode",this.startCommand=t?.startCommand??this.name,t?.dbPath?this.dbPaths=[t.dbPath]:this.dbPaths=E0(this.name)}existingDbPaths(){return this.dbPaths.filter(t=>Cp(t))}openDb(t){return Cp(t)?new(jp())(t,{open:!0,readOnly:!0}):null}async discoverSessions(){let t=[];for(let r of this.existingDbPaths()){let n=this.openDb(r);if(n)try{let s=new Map,i=n.prepare("SELECT id, worktree, name FROM project").all();for(let a of i)s.set(a.id,a);let o=n.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
|
|
1406
1406
|
s.time_created, s.time_updated
|
|
1407
1407
|
FROM session s
|
|
1408
1408
|
ORDER BY s.time_updated DESC`).all();for(let a of o){let l=s.get(a.project_id),c=a.directory||l?.worktree||"(unknown)",d=n.prepare(`SELECT m.id, m.data, m.time_created FROM message m
|
|
1409
|
-
WHERE m.session_id = ? ORDER BY m.time_created ASC`).all(a.id),u=0,f,m,p,_=[];for(let h of d){let S;try{S=JSON.parse(h.data)}catch{continue}p||(p=S.model?.modelID||S.modelID),(S.role==="user"||S.role==="assistant")&&u++,S.role==="user"&&_.push(h.id)}let g=[..._.length>0?[_[0]]:[],..._.length>1?[_[_.length-1]]:[]];for(let h of g){let S=n.prepare("SELECT id, data FROM part WHERE message_id = ? ORDER BY time_created ASC").all(h),y=this.extractText(S);y&&(f||(f=
|
|
1410
|
-
FROM message WHERE session_id = ? ORDER BY time_created ASC`).all(r.id),a=[],l=0,c,d,u;for(let f of o){let m;try{m=JSON.parse(f.data)}catch{continue}c||(c=m.model?.modelID||m.modelID);let p=m.model?.modelID||m.modelID,_=new Date(m.time?.created||f.time_created),g=t.prepare("SELECT id, data FROM part WHERE message_id = ? ORDER BY time_created ASC").all(f.id);if(m.role==="user"){let h=this.extractText(g);h&&(d||(d=
|
|
1409
|
+
WHERE m.session_id = ? ORDER BY m.time_created ASC`).all(a.id),u=0,f,m,p,_=[];for(let h of d){let S;try{S=JSON.parse(h.data)}catch{continue}p||(p=S.model?.modelID||S.modelID),(S.role==="user"||S.role==="assistant")&&u++,S.role==="user"&&_.push(h.id)}let g=[..._.length>0?[_[0]]:[],..._.length>1?[_[_.length-1]]:[]];for(let h of g){let S=n.prepare("SELECT id, data FROM part WHERE message_id = ? ORDER BY time_created ASC").all(h),y=this.extractText(S);y&&(f||(f=J(y,80)),m=J(y,80))}t.push({provider:this.name,sessionId:a.id,slug:a.slug,cwd:c,createdAt:new Date(a.time_created),modifiedAt:new Date(a.time_updated),model:p,startCommand:this.startCommand,firstUserMessage:f,lastUserMessage:m,messageCount:u,filePath:r})}}catch{}finally{n.close()}}return t.sort((r,n)=>n.modifiedAt.getTime()-r.modifiedAt.getTime())}async loadSession(t){for(let r of this.existingDbPaths()){let n=this.openDb(r);if(n)try{let s=this.findSessionRow(n,t);if(!s)continue;return this.buildSessionDetail(n,s,r)}catch{}finally{n.close()}}return null}buildSessionDetail(t,r,n){let s=t.prepare("SELECT id, worktree, name FROM project WHERE id = ?").get(r.project_id),i=r.directory||s?.worktree||"(unknown)",o=t.prepare(`SELECT id, session_id, time_created, time_updated, data
|
|
1410
|
+
FROM message WHERE session_id = ? ORDER BY time_created ASC`).all(r.id),a=[],l=0,c,d,u;for(let f of o){let m;try{m=JSON.parse(f.data)}catch{continue}c||(c=m.model?.modelID||m.modelID);let p=m.model?.modelID||m.modelID,_=new Date(m.time?.created||f.time_created),g=t.prepare("SELECT id, data FROM part WHERE message_id = ? ORDER BY time_created ASC").all(f.id);if(m.role==="user"){let h=this.extractText(g);h&&(d||(d=J(h,80)),u=J(h,80)),a.push({role:"user",timestamp:_,content:h||"(empty)"}),l++}else if(m.role==="assistant"){for(let h of g){let S;try{S=JSON.parse(h.data)}catch{continue}S.type==="text"&&S.text?a.push({role:"assistant",timestamp:_,content:S.text,model:p}):S.type==="reasoning"&&S.text?a.push({role:"thinking",timestamp:_,content:S.text}):S.type==="tool"&&S.tool&&(a.push({role:"tool_use",timestamp:_,content:`${S.tool}`,toolName:S.tool,toolCallId:S.callID,toolInput:S.state?.input?JSON.stringify(S.state.input):void 0}),(S.state?.output||S.state?.error)&&a.push({role:"tool_result",timestamp:_,content:S.state.error||S.state.output||"",toolCallId:S.callID}))}l++}}return{provider:this.name,sessionId:r.id,slug:r.slug,cwd:i,createdAt:new Date(r.time_created),modifiedAt:new Date(r.time_updated),model:c,startCommand:this.startCommand,firstUserMessage:d,lastUserMessage:u,messageCount:l,filePath:n,messages:a}}extractText(t){let r=[];for(let n of t){let s;try{s=JSON.parse(n.data)}catch{continue}s.type==="text"&&s.text&&r.push(s.text)}return r.join(`
|
|
1411
1411
|
`).trim()}async resolveSessionPath(t){for(let r of this.existingDbPaths()){let n=this.openDb(r);if(n)try{if(this.findSessionRow(n,t))return r}catch{}finally{n.close()}}return null}async deleteSession(t){for(let r of this.existingDbPaths()){let n=new(jp())(r,{open:!0});try{let s=this.findSessionRow(n,t);if(!s)continue;return n.prepare("DELETE FROM session WHERE id = ?").run(s.id).changes>0}catch{}finally{n.close()}}return!1}findSessionRow(t,r){let n=t.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
|
|
1412
1412
|
s.time_created, s.time_updated
|
|
1413
1413
|
FROM session s WHERE s.id = ?`).get(r);if(n)return n;let s=t.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
|
|
@@ -1415,12 +1415,12 @@ ${r}`:r}function gp(e,t){let r=DN[t.tool];return r?new Promise((n,s)=>{let i=t.b
|
|
|
1415
1415
|
FROM session s
|
|
1416
1416
|
WHERE s.id LIKE ?
|
|
1417
1417
|
ORDER BY s.time_updated DESC
|
|
1418
|
-
LIMIT 2`).all(`${r}%`);return s.length!==1?null:s[0]}}});function ql(){return new Bl}var Bl,Hl=T(()=>{"use strict";Wl();Ut();Ir();Tt();Bl=class extends xe{constructor(){super({provider:new en,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",
|
|
1418
|
+
LIMIT 2`).all(`${r}%`);return s.length!==1?null:s[0]}}});function ql(){return new Bl}var Bl,Hl=T(()=>{"use strict";Wl();Ut();Ir();Tt();Bl=class extends xe{constructor(){super({provider:new en,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",ge],resumeTemplate:"opencode --session {{session_id}}",startTemplate:"opencode",transport:(t,r)=>Zr(t,{...r,acpTool:"opencode"})})}seedArgsFor(t){let r=["run"];return t?.model&&r.push("--model",t.model),t?.effort&&r.push("--variant",t.effort),r.push(t?.prompt??ge),r}}});import{spawn as T0}from"node:child_process";import{mkdirSync as b0}from"node:fs";function Xl(e){return new Jl(e)}async function S0(e,t){let r=Date.now(),n=Dp({prompt:e,sessionId:t.sessionId,model:t.model,effort:t.effort,formatJson:!0,permissionMode:t.permissionMode??"yolo"});at("lmplayer",n,t.permissionMode??"yolo");let s=await Pp(t.binary,n,{cwd:t.cwd,env:Be(t.env,t.cwd,t.sessionId),signal:t.signal,onText:i=>{t.onProgress?.({kind:"text",summary:i.slice(0,120)}),t.onDelta?.(i)}});if(s.code!==0&&s.code!==null)throw new Error(s.stderr.trim().slice(0,200)||`lmplayer exited with code ${s.code}`);return{text:s.text.trim(),sessionId:s.sessionId??t.sessionId,durationMs:Date.now()-r}}function Dp(e){let t=["run"];return e.model&&t.push("--model",e.model),e.sessionId&&t.push("--session",e.sessionId),e.formatJson&&t.push("--format","json"),e.effort&&t.push("--effort",e.effort),t.push(...sr("lmplayer",e.permissionMode)??[]),t.push(e.prompt),t}function Pp(e,t,r){return new Promise((n,s)=>{let i;try{i=T0(e,t,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(g){s(g);return}let o="",a="",l="",c,d,u=[],f=!1,m=r.timeoutMs===void 0?void 0:setTimeout(()=>{f||(f=!0,i.kill(),p(),s(new Error(`lmplayer seed timed out after ${r.timeoutMs}ms`)))},r.timeoutMs),p=()=>{m!==void 0&&clearTimeout(m)},_=g=>{let h=g.trim();if(!h)return;let S;try{S=JSON.parse(h)}catch{u.push(g),r.onText?.(g);return}if(!Si(S))return;let y=bi(S,!1);c===void 0&&y!==void 0&&(c=y),d=bi(S,!0)??d;let w=Fp(S);w&&(u.push(w),r.onText?.(w))};i.stdout?.on("data",g=>{let h=g.toString("utf8");o+=h,l+=h;let S=l.indexOf(`
|
|
1419
1419
|
`);for(;S>=0;){let y=l.slice(0,S);l=l.slice(S+1),_(y),S=l.indexOf(`
|
|
1420
|
-
`)}}),i.stderr?.on("data",g=>{a+=g.toString("utf8")}),r.signal&&(r.signal.aborted?i.kill():r.signal.addEventListener("abort",()=>i.kill(),{once:!0})),i.on("exit",g=>{f||(f=!0,p(),l.length>0&&_(l),n({code:g,stdout:o,stderr:a,sessionId:c??d,text:u.join("")}))}),i.on("error",g=>{f||(f=!0,p(),s(g))})})}function Fp(e){for(let t of["text","content","delta","output","message"]){let r=e[t];if(typeof r=="string")return r}for(let t of["data","event","payload","part"]){let r=e[t];if(
|
|
1420
|
+
`)}}),i.stderr?.on("data",g=>{a+=g.toString("utf8")}),r.signal&&(r.signal.aborted?i.kill():r.signal.addEventListener("abort",()=>i.kill(),{once:!0})),i.on("exit",g=>{f||(f=!0,p(),l.length>0&&_(l),n({code:g,stdout:o,stderr:a,sessionId:c??d,text:u.join("")}))}),i.on("error",g=>{f||(f=!0,p(),s(g))})})}function Fp(e){for(let t of["text","content","delta","output","message"]){let r=e[t];if(typeof r=="string")return r}for(let t of["data","event","payload","part"]){let r=e[t];if(Si(r)){let n=Fp(r);if(n)return n}}}function bi(e,t){for(let n of["sessionID","sessionId","session_id"]){let s=e[n];if(typeof s=="string"&&s.length>0)return s}let r=e.session;if(typeof r=="string"&&r.length>0)return r;if(Si(r)){let n=bi(r,t);if(n!==void 0)return n}if(t){let n=e.id;if(typeof n=="string"&&n.length>0)return n}for(let n of["data","event","payload","part"]){let s=e[n];if(Si(s)){let i=bi(s,t);if(i!==void 0)return i}}}function Si(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var Jl,Gl=T(()=>{"use strict";Wl();Ut();Tt();zr();it();Jl=class extends xe{constructor(t){super({provider:new en({providerName:"lmplayer",startCommand:"lmplayer",dbPath:t?.lmplayerDbPath}),capabilities:{canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!0},injection:{leaderMode:"none"},binary:"lmplayer",seedArgs:["run","--format","json","--dangerously-skip-permissions",ge],resumeTemplate:"lmplayer run --session {{session_id}} --dangerously-skip-permissions",startTemplate:"lmplayer run --dangerously-skip-permissions",transport:S0})}seedArgsFor(t){return Dp({prompt:t?.prompt??ge,model:t?.model,effort:t?.effort,formatJson:!0,permissionMode:"yolo"})}async seed(t,r){b0(t,{recursive:!0});let n=this.seedArgsFor(r);at("lmplayer",n);try{let s=await Pp(this.binary,n,{cwd:t,env:Ft(void 0,t),timeoutMs:6e4});return s.code!==0&&s.code!==null?{success:!1,error:s.stderr.trim().slice(0,200)||`exit code ${s.code}`}:s.sessionId?{success:!0,sessionId:s.sessionId}:{success:!1,error:"lmplayer seed failed; provider did not report a sessionID"}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}manualSeedHint(t){return{launchCommand:`cd ${t} && lmplayer run --format json --dangerously-skip-permissions "${ge}"`,postLaunchNote:"Copy the sessionID reported by lmplayer into this member's sessionid= field.",lsCommand:`lmctl ls --provider lmplayer --sessiondir ${t}`}}}});import{readdir as vi,readFile as v0,rm as k0}from"node:fs/promises";import{basename as Up,join as ar}from"node:path";function Wp(e){return e.type==="user"||e.message?.role==="user"}function Bp(e){return e.type==="assistant"||e.message?.role==="assistant"||e.message?.role==="model"}function qp(e){let t=e.message;return t?typeof t.content=="string"?t.content:Array.isArray(t.content)?t.content.filter(r=>r.type==="text").map(r=>r.text||"").join(`
|
|
1421
1421
|
`):Array.isArray(t.parts)?t.parts.filter(r=>!r.thought&&r.type!=="thinking").map(r=>r.text||"").join(`
|
|
1422
|
-
`):"":""}function Hp(e){return e.model||e.message?.model}var vi,Jp=T(()=>{"use strict";nr();vi=class{name="qwen";baseDir;constructor(t){this.baseDir=t?.qwenDir||ar(be,".qwen")}async discoverSessions(){let t=ar(this.baseDir,"projects"),r;try{r=await Si(t)}catch{return[]}let n=[];for(let s of r){let i=ar(t,s,"chats"),o;try{o=await Si(i)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=ar(i,a);try{let d=await this.extractSummary(c,l);d&&n.push(d)}catch{}}}return n}async extractSummary(t,r){let n=await Ce(t,30);if(n.length===0)return null;let s=await Ne(t),i="(unknown)",o,a,l,c,d=0;for(let u of n){if(u.cwd&&(i=u.cwd,u.version&&(a=u.version)),u.type==="system"&&u.cwd&&(i=u.cwd,u.version&&(a=u.version),u.model&&(o=u.model)),Wp(u)){let f=qp(u).trim();f&&(l||(l=H(f,80)),c=H(f,80)),d++}if(Bp(u)){let f=Hp(u);f&&(o=f),d++}}return{provider:"qwen",sessionId:r,cwd:i,createdAt:s.createdAt,modifiedAt:s.modifiedAt,model:o,cliVersion:a,startCommand:"qwen",firstUserMessage:l,lastUserMessage:c,messageCount:d,filePath:t}}async loadSession(t){let r=await this.resolveSessionPath(t);if(!r)return null;let n=Up(r,".jsonl");return this.loadFromFile(r,n)}async loadFromFile(t,r){let n=await Ne(t),s="(unknown)",i,o,a,l,c,d,u=[];for await(let f of We(t)){if(f.cwd&&(s=f.cwd,f.version&&(o=f.version),f.gitBranch&&(a=f.gitBranch)),f.type==="system"&&f.cwd&&(s=f.cwd,f.version&&(o=f.version),f.model&&(i=f.model),f.gitBranch&&(a=f.gitBranch)),!f.message)continue;let m=f.message,p=f.timestamp?new Date(f.timestamp):n.modifiedAt;if(Wp(f)){let _=qp(f);_.trim()&&(c||(c=H(_.trim(),80)),d=H(_.trim(),80)),u.push({role:"user",timestamp:p,content:_})}else if(Bp(f)){let _=Hp(f);if(_&&(i=_),Array.isArray(m.content))for(let g of m.content)g.type==="text"&&g.text?u.push({role:"assistant",timestamp:p,content:g.text,model:_}):g.type==="thinking"&&g.thinking&&u.push({role:"thinking",timestamp:p,content:g.thinking});else if(typeof m.content=="string")u.push({role:"assistant",timestamp:p,content:m.content,model:_});else if(Array.isArray(m.parts))for(let g of m.parts)if(g.thought||g.type==="thinking"){let h=g.thinking||g.text;h&&u.push({role:"thinking",timestamp:p,content:h})}else g.text&&u.push({role:"assistant",timestamp:p,content:g.text,model:_})}}return{provider:"qwen",sessionId:r,slug:l,cwd:s,createdAt:n.createdAt,modifiedAt:n.modifiedAt,model:i,cliVersion:o,gitBranch:a,startCommand:"qwen",firstUserMessage:c,lastUserMessage:d,messageCount:u.length,filePath:t,messages:u}}async resolveSessionPath(t){let r=ar(this.baseDir,"projects");try{let n=await Si(r),s=[];for(let i of n){let o=ar(r,i,"chats",`${t}.jsonl`);try{return await v0(o,{flag:"r"}),o}catch{continue}}for(let i of n){let o=ar(r,i,"chats"),a;try{a=await Si(o)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;Up(l,".jsonl").startsWith(t)&&s.push(ar(o,l))}}if(s.length===1)return s[0]}catch{}return null}async deleteSession(t){let r=await this.resolveSessionPath(t);if(!r)return!1;try{return await k0(r),!0}catch{return!1}}}});function Kl(){return new Vl}var Vl,Yl=T(()=>{"use strict";Jp();Ut();Ir();Tt();Vl=class extends xe{constructor(){super({provider:new vi,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",he,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:mi})}seedArgsFor(t){let r=super.seedArgsFor(t);return t?.model?[...r,"--model",t.model]:r}}});import{readdir as Xp,readFile as I0,rm as Gp,stat as Vp}from"node:fs/promises";import{basename as zl,join as qt}from"node:path";async function N0(e){let t=await Promise.all(e.map(r=>Ne(r)));return{createdAt:new Date(Math.min(...t.map(r=>r.createdAt.getTime()))),modifiedAt:new Date(Math.max(...t.map(r=>r.modifiedAt.getTime())))}}function x0(e,t){if(!e)return t;let r=new Date(e);return Number.isNaN(r.getTime())?t:r}function Kp(e){return e.type==="USER_INPUT"}function Yp(e){return e.source==="MODEL"&&e.type==="PLANNER_RESPONSE"}function A0(e){return e.source==="MODEL"&&e.type!=="PLANNER_RESPONSE"}function zp(e){if(!e)return"";let t=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(e);return t?t[1]:e}function Zp(e){if(!e)return;let t=/Model Selection` from [^\n]+? to ([^\n]+)/.exec(e);if(t)return t[1].replace(/\. No need\b[\s\S]*$/,"").replace(/\. If reporting\b[\s\S]*$/,"").replace(/\.\s*$/,"").trim()}function R0(e){if(e===void 0)return"";try{return JSON.stringify(e)}catch{return String(e)}}async function L0(e){for await(let t of We(e)){let r=t.tool_calls?.map(s=>s.args)??[];for(let s of r){let i=O0(s);if(i)return i}let n=$0(t.content);if(n)return n}return null}function O0(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t=e,r=t.Cwd??t.cwd??t.DirectoryPath;return typeof r!="string"?null:r.replace(/^"|"$/g,"")}function $0(e){return e?/"Cwd":"([^"]+)"/.exec(e)?.[1]??null:null}function Qp(e){if(e.endsWith(".db"))return zl(e,".db");let t="/brain/",r=e.indexOf(t);return r===-1?null:e.slice(r+t.length).split("/")[0]||null}var ki,e_=T(()=>{"use strict";nr();ki=class{name="agy";baseDir;constructor(t={}){this.baseDir=t.agyDir||qt(be,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:qt(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let t=qt(this.baseDir,"conversations"),r;try{r=await Xp(t)}catch{return[]}let n=[];for(let s of r){if(!s.endsWith(".db"))continue;let i=zl(s,".db");try{let o=await this.extractSummary(i);o&&n.push(o)}catch{}}return n}conversationPath(t){return qt(this.baseDir,"conversations",`${t}.db`)}transcriptPath(t){return qt(this.baseDir,"brain",t,".system_generated","logs","transcript.jsonl")}async existingTranscriptPath(t){let r=this.transcriptPath(t);try{return await Vp(r),r}catch{return null}}async extractSummary(t){let r=this.conversationPath(t),n=await this.existingTranscriptPath(t),s=n??r,i=await N0([r,n].filter(Boolean)),o=await this.resolveCwd(t,n),a,l,c,d=0;if(n){let u=await Ce(n,80);for(let f of u){let m=Zp(f.content);if(m&&(a=m),Kp(f)){let p=zp(f.content).trim();p&&(l||(l=H(p,80)),c=H(p,80)),d++}else Yp(f)&&d++}}return{provider:"agy",sessionId:t,cwd:o,createdAt:i.createdAt,modifiedAt:i.modifiedAt,model:a,startCommand:"agy",firstUserMessage:l,lastUserMessage:c,messageCount:d,filePath:s,filePaths:n?[r,n]:[r]}}async loadSession(t){let r=await this.resolveSessionPath(t);if(!r)return null;let n=Qp(r);if(!n)return null;let s=await this.extractSummary(n);if(!s)return null;let i=await this.existingTranscriptPath(n),o=[],a=s.model,l=s.firstUserMessage,c=s.lastUserMessage;if(i)for await(let d of We(i)){let u=x0(d.created_at,s.modifiedAt),f=Zp(d.content);if(f&&(a=f),Kp(d)){let m=zp(d.content),p=m.trim();p&&(l||(l=H(p,80)),c=H(p,80)),o.push({role:"user",timestamp:u,content:m});continue}if(Array.isArray(d.tool_calls))for(let m of d.tool_calls)o.push({role:"tool_use",timestamp:u,content:R0(m.args),toolName:m.name||"tool"});Yp(d)&&d.content?o.push({role:"assistant",timestamp:u,content:d.content,model:a}):A0(d)&&d.content&&o.push({role:"tool_result",timestamp:u,content:d.content,toolName:d.type?.toLowerCase()}),d.thinking&&o.push({role:"thinking",timestamp:u,content:d.thinking})}return{...s,model:a,firstUserMessage:l,lastUserMessage:c,messageCount:o.length,messages:o}}async resolveSessionPath(t){let r=this.conversationPath(t);try{return await Vp(r),r}catch{}let n=qt(this.baseDir,"conversations");try{let s=[];for(let i of await Xp(n)){if(!i.endsWith(".db"))continue;zl(i,".db").startsWith(t)&&s.push(qt(n,i))}if(s.length===1)return s[0]}catch{}return null}async deleteSession(t){let r=await this.resolveSessionPath(t);if(!r)return!1;let n=Qp(r);return n?(await Gp(this.conversationPath(n),{force:!0}),await Gp(qt(this.baseDir,"brain",n),{recursive:!0,force:!0}),!0):!1}async resolveCwd(t,r){let n=await this.cwdFromLastConversationCache(t);if(n)return n;if(r){let s=await L0(r);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(t){let r=qt(this.baseDir,"cache","last_conversations.json");try{let n=JSON.parse(await I0(r,"utf8"));for(let[s,i]of Object.entries(n))if(i===t)return s}catch{}return null}}});import{spawn as C0}from"node:child_process";function Ql(e){return new Zl(e)}async function M0(e,t){let r=Date.now(),n=["--conversation",t.sessionId,"-p",e,"--dangerously-skip-permissions","--print-timeout",D0(t.timeoutMs)];t.model&&n.push("--model",t.model),at("agy",n,t.permissionMode??"yolo"),t.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await j0(t.binary,n,{cwd:t.cwd,env:Be(t.env,t.cwd,t.sessionId),signal:t.signal});return t.onProgress?.({kind:"system",summary:"agy -p one-shot completed"}),{text:s.trimEnd(),sessionId:t.sessionId,durationMs:Date.now()-r}}function j0(e,t,r){return new Promise((n,s)=>{let i;try{i=C0(e,t,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(c){s(c);return}let o="",a="";i.stdout?.on("data",c=>{o+=c.toString()}),i.stderr?.on("data",c=>{a+=c.toString()});let l=()=>{i.kill("SIGTERM"),s(new Error("agy turn aborted"))};if(r.signal){if(r.signal.aborted){l();return}r.signal.addEventListener("abort",l,{once:!0})}i.on("error",c=>{r.signal?.removeEventListener("abort",l),s(c)}),i.on("exit",(c,d)=>{if(r.signal?.removeEventListener("abort",l),c===0){n({stdout:o,stderr:a});return}let u=d?`signal ${d}`:`exit code ${c}`,f=a.trim()||o.trim();s(new Error(`agy failed (${u})${f?`: ${f}`:""}`))})})}function D0(e){return!e||e<=0?"8h":`${Math.max(1,Math.ceil(e/1e3))}s`}var Zl,ec=T(()=>{"use strict";e_();Ut();Tt();it();zr();Zl=class extends xe{constructor(t){super({provider:new ki(t),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",he,"--dangerously-skip-permissions","--print-timeout","2m"],resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:M0})}seedArgsFor(t){let r=[...super.seedArgsFor(t)];return t?.model&&r.push("--model",t.model),r}manualSeedHint(t){return{launchCommand:`cd ${t} && agy --dangerously-skip-permissions`,postLaunchNote:"Send the lmctl seed instruction, wait for the conversation to write, then exit.",lsCommand:`lmctl ls --provider agy --sessiondir ${t}`}}}});import{createHash as P0}from"node:crypto";import{existsSync as F0,mkdirSync as U0,readFileSync as W0,renameSync as B0,writeFileSync as q0}from"node:fs";import{dirname as i_,join as t_,resolve as tc}from"node:path";function H0(e){return P0("sha256").update(e).digest("hex").slice(0,8)}function J0(e){let t=e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return t.length>0?t:"session"}function X0(e,t){let r=t?.prompt??"",n=/\bYou are alias\s+([A-Za-z][A-Za-z0-9_-]*)\b/.exec(r);return n!==null?n[1]:e.split(/[\\/]/).filter(Boolean).pop()??"session"}function o_(e){return e.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function Ii(e){return Math.max(1,Math.ceil(e.length/4))}function rn(e=process.cwd()){let t=process.env.LMCTL_CLAUDE_MOCK_STORE;if(t!==void 0&&t.trim().length>0)return tc(t);let r=process.env.LMCTL_DB;return r!==void 0&&r.trim().length>0?t_(i_(tc(r)),".lmctl-claude-mock","sessions.json"):t_(tc(e),".lmctl-claude-mock","sessions.json")}function r_(){return{schemaVersion:1,sessions:{}}}function ns(e){if(!F0(e))return r_();try{let t=JSON.parse(W0(e,"utf8")),r=typeof t.sessions=="object"&&t.sessions!==null?t.sessions:{},n=typeof t.script=="object"&&t.script!==null?t.script:void 0;return{schemaVersion:1,sessions:r,...n!==void 0?{script:n}:{}}}catch{return r_()}}function a_(e,t){U0(i_(e),{recursive:!0});let r=`${e}.${process.pid}.${Date.now()}.tmp`;q0(r,`${JSON.stringify(t,null,2)}
|
|
1423
|
-
`,"utf8"),B0(r,e)}function G0(e){return{...e,timestamp:e.timestamp.toISOString()}}function V0(e){return{...e,timestamp:new Date(e.timestamp)}}function K0(e){return{...e,createdAt:e.createdAt.toISOString(),modifiedAt:e.modifiedAt.toISOString(),messages:e.messages.map(G0)}}function l_(e){return{...e,createdAt:new Date(e.createdAt),modifiedAt:new Date(e.modifiedAt),messages:e.messages.map(V0)}}function Ni(e,t=process.cwd()){let r=tn.get(e);if(r!==void 0)return r;let s=ns(rn(t)).sessions[e];if(s===void 0)return;let i=l_(s);return tn.set(i.sessionId,i),i}function n_(e){tn.set(e.sessionId,e);let t=rn(e.cwd),r=ns(t);r.sessions[e.sessionId]=K0({...e,filePath:t}),a_(t,r)}function Y0(){let e=ns(rn()),t=Object.values(e.sessions).map(l_);for(let r of t)tn.set(r.sessionId,r);return t}function z0(e,t){let r=t.script;if(r===void 0)return;let n=r[e],s=r[o_(e)],i=n??s;if(typeof i=="string")return i;if(i!==void 0&&typeof i.text=="string")return i.text}function s_(e){return{provider:"ClaudeMock",sessionId:e.sessionId,cwd:e.cwd,createdAt:e.createdAt,modifiedAt:e.modifiedAt,messageCount:e.messages.length,filePath:e.filePath,cliVersion:"ClaudeMock/0",model:"claude-mock",totalInputTokens:e.totalInputTokens,totalOutputTokens:e.totalOutputTokens,lastTokenUsage:{totalTokens:e.totalInputTokens+e.totalOutputTokens}}}function sc(){return new nc}var tn,rc,nc,ic=T(()=>{"use strict";tn=new Map;rc=class{name="ClaudeMock";async discoverSessions(){let t=new Map;for(let r of Y0())t.set(r.sessionId,r);for(let r of tn.values())t.set(r.sessionId,r);return[...t.values()].map(s_)}async loadSession(t){let r=Ni(t);return r===void 0?null:{...s_(r),messages:r.messages.slice()}}async resolveSessionPath(t){return Ni(t)?.filePath??null}async deleteSession(t){let r=tn.delete(t),n=rn(),s=ns(n),i=s.sessions[t]!==void 0;return delete s.sessions[t],i&&a_(n,s),r||i}},nc=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new rc;discover(){return this.provider.discoverSessions()}load(t){return this.provider.loadSession(t)}resolvePath(t){return this.provider.resolveSessionPath(t)}delete(t){return this.provider.deleteSession(t)}getWatchPaths(){return[]}async seed(t,r){let n=J0(X0(t,r)),s=`mock-${n}-${H0(`${t}:${n}`)}`,i=new Date,o=rn(t),a=Ni(s,t),l=r?.prompt??"ClaudeMock seed",c=Ii(l),d={sessionId:s,cwd:t,filePath:o,createdAt:a?.createdAt??i,modifiedAt:i,messages:a?.messages.slice()??[],totalInputTokens:a?.totalInputTokens??0,totalOutputTokens:a?.totalOutputTokens??0};return d.messages.push({role:"user",timestamp:i,content:l}),d.messages.push({role:"assistant",timestamp:i,content:"ACK: ClaudeMock seeded"}),d.totalInputTokens+=c,d.totalOutputTokens+=Ii("ACK: ClaudeMock seeded"),n_(d),{success:!0,sessionId:s}}resumeCommand(t){return`ClaudeMock --resume ${t}`}startCommand(){return"ClaudeMock"}manualSeedHint(t){return{launchCommand:`cd ${t} && ClaudeMock`,postLaunchNote:"ClaudeMock is a hermetic test provider; no manual seed is required.",lsCommand:`lmctl ls --provider ClaudeMock --sessiondir ${t}`}}forkHint(t){return"ClaudeMock does not support fork."}async fork(t,r){return{success:!1,error:"ClaudeMock does not support fork."}}async sendTurn(t,r){let n=Date.now(),s=Ni(r.sessionId,r.cwd);if(s===void 0)throw new Error(`ClaudeMock session not found: ${r.sessionId}`);let i=new Date,o=ns(rn(r.cwd)),a=z0(t,o)??`ClaudeMock ack: ${o_(t)}`;return s.messages.push({role:"user",timestamp:i,content:t}),s.messages.push({role:"assistant",timestamp:i,content:a,model:r.model??"claude-mock"}),s.modifiedAt=i,s.totalInputTokens+=Ii(t),s.totalOutputTokens+=Ii(a),n_(s),r.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),{text:a,sessionId:r.sessionId,durationMs:Math.max(1,Date.now()-n),stopReason:"mock_stop",numTurns:1,status:"ok"}}}});function bt(e){let t=[Nl({claudeDir:e?.claudeDir}),Rl({codexDir:e?.codexDir,codeDir:e?.codeDir}),Ml({geminiDir:e?.geminiDir,claudeDir:e?.claudeDir,codexDir:e?.codexDir,codeDir:e?.codeDir}),Pl({copilotDir:e?.copilotDir}),ql(),Xl({lmplayerDbPath:e?.lmplayerDbPath}),Kl(),Ql({agyDir:e?.agyDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&t.push(sc()),t}var oc=T(()=>{"use strict";xl();Ll();jl();Fl();Hl();Gl();Yl();ec();ic();xl();Ll();jl();Fl();Hl();Gl();Yl();ec();ic()});var dc={};ye(dc,{ProviderRegistry:()=>Vn,TransportConnectionError:()=>Se,TransportError:()=>Qe,TransportJsonError:()=>oi,TransportProcessError:()=>Wt,TransportRpcError:()=>Bt,_resetDefaultRegistryForTests:()=>Z0,chat:()=>St,countTokens:()=>cc,createAdapterRegistry:()=>Et,createAllAdapters:()=>bt,listSessions:()=>lc,seed:()=>ac});function Ai(){return xi===null&&(xi=Et(bt())),xi}function Z0(){xi=null}function d_(e,t){let r=e.getAdapter(t);if(!r)throw new Error(`provider "${t}" is not registered in this registry`);return r}async function St(e){let t=e.registry??Ai(),r=d_(t,e.provider),n={sessionId:e.sessionId,cwd:e.cwd,env:e.env,onDelta:e.onDelta,onProgress:e.onProgress,signal:e.signal,timeoutMs:e.timeoutMs,model:e.model,effort:e.effort,progPath:e.progPath,alias:e.alias,isLead:e.isLead,permissionMode:e.permissionMode},s=await r.sendTurn(e.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 ac(e){let t=e.registry??Ai(),r=d_(t,e.provider),n=await c_(t,e.provider,e.cwd),s=await r.seed(e.cwd,{model:e.model,effort:e.effort,prompt:e.prompt}),i=s.warnings!==void 0&&s.warnings.length>0?{warnings:s.warnings}:{};if(!s.success)return{success:!1,error:s.error,...i};if(s.sessionId)return{success:!0,sessionId:s.sessionId,...i};let o=await c_(t,e.provider,e.cwd),a=Q0(n,o);return a?{success:!0,sessionId:a,...i}:{success:!0,...i}}async function c_(e,t,r){let n=await e.listAll({provider:t,workspace:r}),s=new Map;for(let i of n)s.set(i.sessionId,i.modifiedAt);return s}function Q0(e,t){let r=[];for(let n of t.keys())e.has(n)||r.push(n);return r.length===1?r[0]:void 0}async function lc(e={}){return(e.registry??Ai()).listAll({provider:e.provider,workspace:e.workspace,limit:e.limit,from:e.from,to:e.to})}async function cc(e){let r=await(e.registry??Ai()).getSession(e.sessionId,e.provider);if(!r)throw new Error(`session "${e.sessionId}" not found`);let n=r.totalInputTokens??0,s=r.totalCachedInputTokens??0,i=r.totalCacheWriteInputTokens??0,o=r.totalOutputTokens??0,a=r.totalReasoningOutputTokens??0;return{provider:r.provider,sessionId:r.sessionId,input:n,cachedInput:s,cacheWriteInput:i,output:o,reasoningOutput:a,total:n+s+i+o+a,lastTurn:r.lastTokenUsage}}var xi,vt=T(()=>{"use strict";ll();oc();ll();oc();Yr();xi=null});function ex(){return uc===null&&(uc=Et(bt())),uc}async function Ri(e){let{dal:t,team_member_id:r}=e,n=t!==void 0&&r!==void 0;n&&t.setMemberState(r,"in_chat");let s=!1,i;try{return await rx(e)}catch(o){throw s=!0,i=o,o}finally{if(n)if(!s)nn.delete(r),t.setMemberState(r,"idle");else{let o=tx(i,r);t.setMemberState(r,o!==null?"attention_needed":"idle",o)}}}function tx(e,t){if(!(e instanceof ve))return nn.delete(t),null;if(e.kind==="sessiondir_missing")return"sessiondir_missing";if(e.kind==="enoent")return"binary_missing";if(e.kind==="nonzero_exit"&&(e.exit_status===137||e.exit_status===139))return"oom_exit";if(e.kind==="timeout"){let r=(nn.get(t)??0)+1;return r>=3?(nn.delete(t),"consecutive_timeouts"):(nn.set(t,r),null)}return nn.delete(t),null}async function rx(e){let t=e.timeoutMs,r=typeof t=="number"&&t>0,n=ex(),s;try{let d=await n.resolveSession(e.sessionid);if(!d)return Promise.reject(new ve("other",null,`library: sessionid "${e.sessionid}" matched no registered provider`,fc(e.sessionid,e.sessiondir,"unresolved")));s=d.provider.name}catch(d){return Promise.reject(new ve("other",null,`library: session resolution failed: ${u_(d)}`,fc(e.sessionid,e.sessiondir,"unresolved")))}let i=fc(e.sessionid,e.sessiondir,s),o=new AbortController,a=r?setTimeout(()=>o.abort(),t):null,l=!1;o.signal.addEventListener("abort",()=>{l=!0},{once:!0});let c=Date.now();try{let d=await St({provider:s,sessionId:e.sessionid,cwd:e.sessiondir,prompt:e.prompt,timeoutMs:0,signal:o.signal,registry:n,onProgress:e.onProgress,permissionMode:e.permissionMode});if(d.status==="stalled")throw new ve("timeout",null,`library: stalled after ${d.stalledAfterMs??0}ms`,i);return{text:d.text,ms:Date.now()-c,exit_status:0,argv:i}}catch(d){throw l?new ve("timeout",null,`library: wall-clock timeout after ${t??0}ms`,i):nx(d,i)}finally{a!==null&&clearTimeout(a)}}function fc(e,t,r){return["<library>","chat",e,t,"--provider",r]}function u_(e){return e instanceof Error?e.message:String(e)}function nx(e,t){if(e instanceof ve)return e;if(e instanceof Se){let r=e.cause;return r?.code==="ENOENT_CWD"?new ve("sessiondir_missing",null,e.message,t):r?.code==="ENOENT"?new ve("enoent",null,e.message,t):new ve("other",null,e.message,t)}return e instanceof Wt?new ve("nonzero_exit",e.exitCode??null,e.stderr??e.message,t):e instanceof Bt?new ve("nonzero_exit",e.rpcCode??null,e.message,t):e instanceof Qe?new ve("other",null,e.message,t):new ve("other",null,u_(e),t)}var ve,uc,nn,Li=T(()=>{"use strict";vt();ve=class extends Error{kind;exit_status;stderr;argv;constructor(t,r,n,s){super(`lmctl chat failed: ${t}`),this.kind=t,this.exit_status=r,this.stderr=n,this.argv=s,this.name="ChatError"}},uc=null;nn=new Map});function f_(){return mc===null&&(mc=Et(bt())),mc}function ix(e,t){if(!sx.test(e))return e;let r=t.getConfig(`workspace.${e}`);if(r===null||r.length===0)throw new ke("other",null,`workspace has no mapping for ${e}; run \`lmctl workspace init\` (or set workspace.${e} in lmctl_config)`,["<library>","seed","--provider",e]);return r}async function Oi(e){let t=ix(e.member.provider,e.dal),r=t===e.member.provider?e.member:{...e.member,provider:t},n=await ox({member:r});return e.dal.setMemberProviderResolved(e.member.id,t),{sessionid:n.sessionid,provider_resolved:t}}async function ox(e){let t=e.member.provider,r=e.member.sessiondir,n=pc("seed",r,t);try{let s=await ac({provider:t,cwd:r,registry:f_()});if(!s.success)throw lx(s.error,n);if(!s.sessionId)throw new ke("parse",0,"",n);return{sessionid:s.sessionId}}catch(s){throw s instanceof ke?s:_c(s,n)}}async function m_(e){return ax(e)}async function ax(e){let t=f_(),r=pc("tokens",e.sessionid,"unresolved"),n;try{let i=await t.resolveSession(e.sessionid);if(!i)throw new ke("parse",0,`library: sessionid "${e.sessionid}" matched no registered provider`,r);n=i.provider.name}catch(i){throw i instanceof ke?i:_c(i,r)}let s=pc("tokens",e.sessionid,n);try{let i=await cc({sessionId:e.sessionid,provider:n,registry:t});return{input_tokens:i.input,cache_tokens:i.cachedInput+i.cacheWriteInput,output_tokens:i.output,total_tokens:i.total}}catch(i){throw i instanceof ke?i:_c(i,s)}}function pc(e,t,r){return["<library>",e,t,"--provider",r]}function lx(e,t){let r=e??"";if(/\bENOENT\b/i.test(r))return new ke("enoent",null,r,t);if(/timed?\s*out/i.test(r))return new ke("timeout",null,r,t);if(/\bexit code\s+(-?\d+)\b/i.test(r)){let n=/\bexit code\s+(-?\d+)\b/i.exec(r);return new ke("nonzero_exit",Number(n[1]),r,t)}return new ke("other",null,r,t)}function _c(e,t){return e instanceof ke?e:e instanceof Se?e.cause?.code==="ENOENT"?new ke("enoent",null,e.message,t):new ke("other",null,e.message,t):e instanceof Wt?new ke("nonzero_exit",e.exitCode??null,e.stderr??e.message,t):e instanceof Bt?new ke("nonzero_exit",e.rpcCode??null,e.message,t):e instanceof Qe?new ke("other",null,e.message,t):new ke("other",null,e instanceof Error?e.message:String(e),t)}var ke,mc,sx,hc=T(()=>{"use strict";vt();ke=class extends Error{kind;exit_status;stderr;argv;constructor(t,r,n,s){super(`lmctl seed failed: ${t}`),this.kind=t,this.exit_status=r,this.stderr=n,this.argv=s,this.name="SeedError"}},mc=null;sx=/^provider[123]$/});function $i(e){return Buffer.from(e,"utf8").toString("base64url")}function is(e){return Buffer.from(e,"base64url").toString("utf8")}async function p_(e,t=r=>m_({sessionid:r})){if(process.env.LMCTL_SESSION_SIZE_DISABLED==="1")return{recorded:0,failed:0};let r=0,n=0;for(let s of cx(e)){let i=s.member.sessionid;if(i!==null)try{let o=await t(i);e.recordSessionSize({team_name:s.team_name,alias:s.member.alias,sessionid:i,...o}),r+=1}catch(o){n+=1;try{e.raiseAttention({kind:"daemon_session_size_failed",severity:"warn",payload:JSON.stringify({team_name:s.team_name,alias:s.member.alias,sessionid:i,error:o instanceof Error?o.message:String(o)})})}catch{}}}return{recorded:r,failed:n}}async function __(e,t,r){let n=h_(e,t,r);if(n===null||n.member.sessionid===null)throw new Error("session member not found");if(n.member.state!=="idle")throw new ss(r,n.member.state);e.setMemberState(n.member.id,"in_chat","compacting");try{return await Ri({sessionid:n.member.sessionid,sessiondir:n.member.sessiondir,prompt:"/compact"}),e.setMemberState(n.member.id,"idle",null),{ok:!0,row:g_(e,t,r)}}catch(s){throw e.setMemberState(n.member.id,"attention_needed",`compact failed: ${s instanceof Error?s.message:String(s)}`),s}}async function gc(e,t,r){let n=h_(e,t,r);if(n===null)throw new Error("session member not found");let s=await Oi({member:n.member,dal:e});return e.updateTeamMemberSession(n.member.id,s.sessionid),{ok:!0,sessionid:s.sessionid,row:g_(e,t,r)}}function cx(e){return e.listTeams().flatMap(t=>e.listTeamMembers(t.id).filter(r=>r.sessionid!==null).map(r=>({team_name:t.name,member:r})))}function h_(e,t,r){let n=e.findTeamByName(t);if(n===null)return null;let s=e.findTeamMemberByAlias(n.id,r);return s===null?null:{team_name:n.name,member:s}}function g_(e,t,r){return e.sessionSizeHistory(t,r,1)[0]??null}var ss,Ci=T(()=>{"use strict";Li();hc();ss=class extends Error{constructor(t,r){super(`member ${t} is currently ${r}; cannot compact while busy`),this.name="MemberBusyError"}}});async function yc(e){let t=e.dal,r=e.nowMs??Date.now(),n=e.thresholdMs??ux(t),s=r-n,i=t.query(`
|
|
1422
|
+
`):"":""}function Hp(e){return e.model||e.message?.model}var ki,Jp=T(()=>{"use strict";nr();ki=class{name="qwen";baseDir;constructor(t){this.baseDir=t?.qwenDir||ar(be,".qwen")}async discoverSessions(){let t=ar(this.baseDir,"projects"),r;try{r=await vi(t)}catch{return[]}let n=[];for(let s of r){let i=ar(t,s,"chats"),o;try{o=await vi(i)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=ar(i,a);try{let d=await this.extractSummary(c,l);d&&n.push(d)}catch{}}}return n}async extractSummary(t,r){let n=await Ce(t,30);if(n.length===0)return null;let s=await Ne(t),i="(unknown)",o,a,l,c,d=0;for(let u of n){if(u.cwd&&(i=u.cwd,u.version&&(a=u.version)),u.type==="system"&&u.cwd&&(i=u.cwd,u.version&&(a=u.version),u.model&&(o=u.model)),Wp(u)){let f=qp(u).trim();f&&(l||(l=J(f,80)),c=J(f,80)),d++}if(Bp(u)){let f=Hp(u);f&&(o=f),d++}}return{provider:"qwen",sessionId:r,cwd:i,createdAt:s.createdAt,modifiedAt:s.modifiedAt,model:o,cliVersion:a,startCommand:"qwen",firstUserMessage:l,lastUserMessage:c,messageCount:d,filePath:t}}async loadSession(t){let r=await this.resolveSessionPath(t);if(!r)return null;let n=Up(r,".jsonl");return this.loadFromFile(r,n)}async loadFromFile(t,r){let n=await Ne(t),s="(unknown)",i,o,a,l,c,d,u=[];for await(let f of We(t)){if(f.cwd&&(s=f.cwd,f.version&&(o=f.version),f.gitBranch&&(a=f.gitBranch)),f.type==="system"&&f.cwd&&(s=f.cwd,f.version&&(o=f.version),f.model&&(i=f.model),f.gitBranch&&(a=f.gitBranch)),!f.message)continue;let m=f.message,p=f.timestamp?new Date(f.timestamp):n.modifiedAt;if(Wp(f)){let _=qp(f);_.trim()&&(c||(c=J(_.trim(),80)),d=J(_.trim(),80)),u.push({role:"user",timestamp:p,content:_})}else if(Bp(f)){let _=Hp(f);if(_&&(i=_),Array.isArray(m.content))for(let g of m.content)g.type==="text"&&g.text?u.push({role:"assistant",timestamp:p,content:g.text,model:_}):g.type==="thinking"&&g.thinking&&u.push({role:"thinking",timestamp:p,content:g.thinking});else if(typeof m.content=="string")u.push({role:"assistant",timestamp:p,content:m.content,model:_});else if(Array.isArray(m.parts))for(let g of m.parts)if(g.thought||g.type==="thinking"){let h=g.thinking||g.text;h&&u.push({role:"thinking",timestamp:p,content:h})}else g.text&&u.push({role:"assistant",timestamp:p,content:g.text,model:_})}}return{provider:"qwen",sessionId:r,slug:l,cwd:s,createdAt:n.createdAt,modifiedAt:n.modifiedAt,model:i,cliVersion:o,gitBranch:a,startCommand:"qwen",firstUserMessage:c,lastUserMessage:d,messageCount:u.length,filePath:t,messages:u}}async resolveSessionPath(t){let r=ar(this.baseDir,"projects");try{let n=await vi(r),s=[];for(let i of n){let o=ar(r,i,"chats",`${t}.jsonl`);try{return await v0(o,{flag:"r"}),o}catch{continue}}for(let i of n){let o=ar(r,i,"chats"),a;try{a=await vi(o)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;Up(l,".jsonl").startsWith(t)&&s.push(ar(o,l))}}if(s.length===1)return s[0]}catch{}return null}async deleteSession(t){let r=await this.resolveSessionPath(t);if(!r)return!1;try{return await k0(r),!0}catch{return!1}}}});function Kl(){return new Vl}var Vl,Yl=T(()=>{"use strict";Jp();Ut();Ir();Tt();Vl=class extends xe{constructor(){super({provider:new ki,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",ge,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:pi})}seedArgsFor(t){let r=super.seedArgsFor(t);return t?.model?[...r,"--model",t.model]:r}}});import{readdir as Xp,readFile as I0,rm as Gp,stat as Vp}from"node:fs/promises";import{basename as zl,join as qt}from"node:path";async function N0(e){let t=await Promise.all(e.map(r=>Ne(r)));return{createdAt:new Date(Math.min(...t.map(r=>r.createdAt.getTime()))),modifiedAt:new Date(Math.max(...t.map(r=>r.modifiedAt.getTime())))}}function x0(e,t){if(!e)return t;let r=new Date(e);return Number.isNaN(r.getTime())?t:r}function Kp(e){return e.type==="USER_INPUT"}function Yp(e){return e.source==="MODEL"&&e.type==="PLANNER_RESPONSE"}function A0(e){return e.source==="MODEL"&&e.type!=="PLANNER_RESPONSE"}function zp(e){if(!e)return"";let t=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(e);return t?t[1]:e}function Zp(e){if(!e)return;let t=/Model Selection` from [^\n]+? to ([^\n]+)/.exec(e);if(t)return t[1].replace(/\. No need\b[\s\S]*$/,"").replace(/\. If reporting\b[\s\S]*$/,"").replace(/\.\s*$/,"").trim()}function R0(e){if(e===void 0)return"";try{return JSON.stringify(e)}catch{return String(e)}}async function L0(e){for await(let t of We(e)){let r=t.tool_calls?.map(s=>s.args)??[];for(let s of r){let i=O0(s);if(i)return i}let n=$0(t.content);if(n)return n}return null}function O0(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t=e,r=t.Cwd??t.cwd??t.DirectoryPath;return typeof r!="string"?null:r.replace(/^"|"$/g,"")}function $0(e){return e?/"Cwd":"([^"]+)"/.exec(e)?.[1]??null:null}function Qp(e){if(e.endsWith(".db"))return zl(e,".db");let t="/brain/",r=e.indexOf(t);return r===-1?null:e.slice(r+t.length).split("/")[0]||null}var Ii,e_=T(()=>{"use strict";nr();Ii=class{name="agy";baseDir;constructor(t={}){this.baseDir=t.agyDir||qt(be,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:qt(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let t=qt(this.baseDir,"conversations"),r;try{r=await Xp(t)}catch{return[]}let n=[];for(let s of r){if(!s.endsWith(".db"))continue;let i=zl(s,".db");try{let o=await this.extractSummary(i);o&&n.push(o)}catch{}}return n}conversationPath(t){return qt(this.baseDir,"conversations",`${t}.db`)}transcriptPath(t){return qt(this.baseDir,"brain",t,".system_generated","logs","transcript.jsonl")}async existingTranscriptPath(t){let r=this.transcriptPath(t);try{return await Vp(r),r}catch{return null}}async extractSummary(t){let r=this.conversationPath(t),n=await this.existingTranscriptPath(t),s=n??r,i=await N0([r,n].filter(Boolean)),o=await this.resolveCwd(t,n),a,l,c,d=0;if(n){let u=await Ce(n,80);for(let f of u){let m=Zp(f.content);if(m&&(a=m),Kp(f)){let p=zp(f.content).trim();p&&(l||(l=J(p,80)),c=J(p,80)),d++}else Yp(f)&&d++}}return{provider:"agy",sessionId:t,cwd:o,createdAt:i.createdAt,modifiedAt:i.modifiedAt,model:a,startCommand:"agy",firstUserMessage:l,lastUserMessage:c,messageCount:d,filePath:s,filePaths:n?[r,n]:[r]}}async loadSession(t){let r=await this.resolveSessionPath(t);if(!r)return null;let n=Qp(r);if(!n)return null;let s=await this.extractSummary(n);if(!s)return null;let i=await this.existingTranscriptPath(n),o=[],a=s.model,l=s.firstUserMessage,c=s.lastUserMessage;if(i)for await(let d of We(i)){let u=x0(d.created_at,s.modifiedAt),f=Zp(d.content);if(f&&(a=f),Kp(d)){let m=zp(d.content),p=m.trim();p&&(l||(l=J(p,80)),c=J(p,80)),o.push({role:"user",timestamp:u,content:m});continue}if(Array.isArray(d.tool_calls))for(let m of d.tool_calls)o.push({role:"tool_use",timestamp:u,content:R0(m.args),toolName:m.name||"tool"});Yp(d)&&d.content?o.push({role:"assistant",timestamp:u,content:d.content,model:a}):A0(d)&&d.content&&o.push({role:"tool_result",timestamp:u,content:d.content,toolName:d.type?.toLowerCase()}),d.thinking&&o.push({role:"thinking",timestamp:u,content:d.thinking})}return{...s,model:a,firstUserMessage:l,lastUserMessage:c,messageCount:o.length,messages:o}}async resolveSessionPath(t){let r=this.conversationPath(t);try{return await Vp(r),r}catch{}let n=qt(this.baseDir,"conversations");try{let s=[];for(let i of await Xp(n)){if(!i.endsWith(".db"))continue;zl(i,".db").startsWith(t)&&s.push(qt(n,i))}if(s.length===1)return s[0]}catch{}return null}async deleteSession(t){let r=await this.resolveSessionPath(t);if(!r)return!1;let n=Qp(r);return n?(await Gp(this.conversationPath(n),{force:!0}),await Gp(qt(this.baseDir,"brain",n),{recursive:!0,force:!0}),!0):!1}async resolveCwd(t,r){let n=await this.cwdFromLastConversationCache(t);if(n)return n;if(r){let s=await L0(r);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(t){let r=qt(this.baseDir,"cache","last_conversations.json");try{let n=JSON.parse(await I0(r,"utf8"));for(let[s,i]of Object.entries(n))if(i===t)return s}catch{}return null}}});import{spawn as C0}from"node:child_process";function Ql(e){return new Zl(e)}async function M0(e,t){let r=Date.now(),n=["--conversation",t.sessionId,"-p",e,"--dangerously-skip-permissions","--print-timeout",D0(t.timeoutMs)];t.model&&n.push("--model",t.model),at("agy",n,t.permissionMode??"yolo"),t.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await j0(t.binary,n,{cwd:t.cwd,env:Be(t.env,t.cwd,t.sessionId),signal:t.signal});return t.onProgress?.({kind:"system",summary:"agy -p one-shot completed"}),{text:s.trimEnd(),sessionId:t.sessionId,durationMs:Date.now()-r}}function j0(e,t,r){return new Promise((n,s)=>{let i;try{i=C0(e,t,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(c){s(c);return}let o="",a="";i.stdout?.on("data",c=>{o+=c.toString()}),i.stderr?.on("data",c=>{a+=c.toString()});let l=()=>{i.kill("SIGTERM"),s(new Error("agy turn aborted"))};if(r.signal){if(r.signal.aborted){l();return}r.signal.addEventListener("abort",l,{once:!0})}i.on("error",c=>{r.signal?.removeEventListener("abort",l),s(c)}),i.on("exit",(c,d)=>{if(r.signal?.removeEventListener("abort",l),c===0){n({stdout:o,stderr:a});return}let u=d?`signal ${d}`:`exit code ${c}`,f=a.trim()||o.trim();s(new Error(`agy failed (${u})${f?`: ${f}`:""}`))})})}function D0(e){return!e||e<=0?"8h":`${Math.max(1,Math.ceil(e/1e3))}s`}var Zl,ec=T(()=>{"use strict";e_();Ut();Tt();it();zr();Zl=class extends xe{constructor(t){super({provider:new Ii(t),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",ge,"--dangerously-skip-permissions","--print-timeout","2m"],resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:M0})}seedArgsFor(t){let r=[...super.seedArgsFor(t)];return t?.model&&r.push("--model",t.model),r}manualSeedHint(t){return{launchCommand:`cd ${t} && agy --dangerously-skip-permissions`,postLaunchNote:"Send the lmctl seed instruction, wait for the conversation to write, then exit.",lsCommand:`lmctl ls --provider agy --sessiondir ${t}`}}}});import{createHash as P0}from"node:crypto";import{existsSync as F0,mkdirSync as U0,readFileSync as W0,renameSync as B0,writeFileSync as q0}from"node:fs";import{dirname as i_,join as t_,resolve as tc}from"node:path";function H0(e){return P0("sha256").update(e).digest("hex").slice(0,8)}function J0(e){let t=e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return t.length>0?t:"session"}function X0(e,t){let r=t?.prompt??"",n=/\bYou are alias\s+([A-Za-z][A-Za-z0-9_-]*)\b/.exec(r);return n!==null?n[1]:e.split(/[\\/]/).filter(Boolean).pop()??"session"}function o_(e){return e.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function Ni(e){return Math.max(1,Math.ceil(e.length/4))}function rn(e=process.cwd()){let t=process.env.LMCTL_CLAUDE_MOCK_STORE;if(t!==void 0&&t.trim().length>0)return tc(t);let r=process.env.LMCTL_DB;return r!==void 0&&r.trim().length>0?t_(i_(tc(r)),".lmctl-claude-mock","sessions.json"):t_(tc(e),".lmctl-claude-mock","sessions.json")}function r_(){return{schemaVersion:1,sessions:{}}}function ns(e){if(!F0(e))return r_();try{let t=JSON.parse(W0(e,"utf8")),r=typeof t.sessions=="object"&&t.sessions!==null?t.sessions:{},n=typeof t.script=="object"&&t.script!==null?t.script:void 0;return{schemaVersion:1,sessions:r,...n!==void 0?{script:n}:{}}}catch{return r_()}}function a_(e,t){U0(i_(e),{recursive:!0});let r=`${e}.${process.pid}.${Date.now()}.tmp`;q0(r,`${JSON.stringify(t,null,2)}
|
|
1423
|
+
`,"utf8"),B0(r,e)}function G0(e){return{...e,timestamp:e.timestamp.toISOString()}}function V0(e){return{...e,timestamp:new Date(e.timestamp)}}function K0(e){return{...e,createdAt:e.createdAt.toISOString(),modifiedAt:e.modifiedAt.toISOString(),messages:e.messages.map(G0)}}function l_(e){return{...e,createdAt:new Date(e.createdAt),modifiedAt:new Date(e.modifiedAt),messages:e.messages.map(V0)}}function xi(e,t=process.cwd()){let r=tn.get(e);if(r!==void 0)return r;let s=ns(rn(t)).sessions[e];if(s===void 0)return;let i=l_(s);return tn.set(i.sessionId,i),i}function n_(e){tn.set(e.sessionId,e);let t=rn(e.cwd),r=ns(t);r.sessions[e.sessionId]=K0({...e,filePath:t}),a_(t,r)}function Y0(){let e=ns(rn()),t=Object.values(e.sessions).map(l_);for(let r of t)tn.set(r.sessionId,r);return t}function z0(e,t){let r=t.script;if(r===void 0)return;let n=r[e],s=r[o_(e)],i=n??s;if(typeof i=="string")return i;if(i!==void 0&&typeof i.text=="string")return i.text}function s_(e){return{provider:"ClaudeMock",sessionId:e.sessionId,cwd:e.cwd,createdAt:e.createdAt,modifiedAt:e.modifiedAt,messageCount:e.messages.length,filePath:e.filePath,cliVersion:"ClaudeMock/0",model:"claude-mock",totalInputTokens:e.totalInputTokens,totalOutputTokens:e.totalOutputTokens,lastTokenUsage:{totalTokens:e.totalInputTokens+e.totalOutputTokens}}}function sc(){return new nc}var tn,rc,nc,ic=T(()=>{"use strict";tn=new Map;rc=class{name="ClaudeMock";async discoverSessions(){let t=new Map;for(let r of Y0())t.set(r.sessionId,r);for(let r of tn.values())t.set(r.sessionId,r);return[...t.values()].map(s_)}async loadSession(t){let r=xi(t);return r===void 0?null:{...s_(r),messages:r.messages.slice()}}async resolveSessionPath(t){return xi(t)?.filePath??null}async deleteSession(t){let r=tn.delete(t),n=rn(),s=ns(n),i=s.sessions[t]!==void 0;return delete s.sessions[t],i&&a_(n,s),r||i}},nc=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new rc;discover(){return this.provider.discoverSessions()}load(t){return this.provider.loadSession(t)}resolvePath(t){return this.provider.resolveSessionPath(t)}delete(t){return this.provider.deleteSession(t)}getWatchPaths(){return[]}async seed(t,r){let n=J0(X0(t,r)),s=`mock-${n}-${H0(`${t}:${n}`)}`,i=new Date,o=rn(t),a=xi(s,t),l=r?.prompt??"ClaudeMock seed",c=Ni(l),d={sessionId:s,cwd:t,filePath:o,createdAt:a?.createdAt??i,modifiedAt:i,messages:a?.messages.slice()??[],totalInputTokens:a?.totalInputTokens??0,totalOutputTokens:a?.totalOutputTokens??0};return d.messages.push({role:"user",timestamp:i,content:l}),d.messages.push({role:"assistant",timestamp:i,content:"ACK: ClaudeMock seeded"}),d.totalInputTokens+=c,d.totalOutputTokens+=Ni("ACK: ClaudeMock seeded"),n_(d),{success:!0,sessionId:s}}resumeCommand(t){return`ClaudeMock --resume ${t}`}startCommand(){return"ClaudeMock"}manualSeedHint(t){return{launchCommand:`cd ${t} && ClaudeMock`,postLaunchNote:"ClaudeMock is a hermetic test provider; no manual seed is required.",lsCommand:`lmctl ls --provider ClaudeMock --sessiondir ${t}`}}forkHint(t){return"ClaudeMock does not support fork."}async fork(t,r){return{success:!1,error:"ClaudeMock does not support fork."}}async sendTurn(t,r){let n=Date.now(),s=xi(r.sessionId,r.cwd);if(s===void 0)throw new Error(`ClaudeMock session not found: ${r.sessionId}`);let i=new Date,o=ns(rn(r.cwd)),a=z0(t,o)??`ClaudeMock ack: ${o_(t)}`;return s.messages.push({role:"user",timestamp:i,content:t}),s.messages.push({role:"assistant",timestamp:i,content:a,model:r.model??"claude-mock"}),s.modifiedAt=i,s.totalInputTokens+=Ni(t),s.totalOutputTokens+=Ni(a),n_(s),r.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),{text:a,sessionId:r.sessionId,durationMs:Math.max(1,Date.now()-n),stopReason:"mock_stop",numTurns:1,status:"ok"}}}});function bt(e){let t=[Nl({claudeDir:e?.claudeDir}),Rl({codexDir:e?.codexDir,codeDir:e?.codeDir}),Ml({geminiDir:e?.geminiDir,claudeDir:e?.claudeDir,codexDir:e?.codexDir,codeDir:e?.codeDir}),Pl({copilotDir:e?.copilotDir}),ql(),Xl({lmplayerDbPath:e?.lmplayerDbPath}),Kl(),Ql({agyDir:e?.agyDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&t.push(sc()),t}var oc=T(()=>{"use strict";xl();Ll();jl();Fl();Hl();Gl();Yl();ec();ic();xl();Ll();jl();Fl();Hl();Gl();Yl();ec();ic()});var dc={};we(dc,{ProviderRegistry:()=>Vn,TransportConnectionError:()=>Se,TransportError:()=>Qe,TransportJsonError:()=>ai,TransportProcessError:()=>Wt,TransportRpcError:()=>Bt,_resetDefaultRegistryForTests:()=>Z0,chat:()=>St,countTokens:()=>cc,createAdapterRegistry:()=>Et,createAllAdapters:()=>bt,listSessions:()=>lc,seed:()=>ac});function Ri(){return Ai===null&&(Ai=Et(bt())),Ai}function Z0(){Ai=null}function d_(e,t){let r=e.getAdapter(t);if(!r)throw new Error(`provider "${t}" is not registered in this registry`);return r}async function St(e){let t=e.registry??Ri(),r=d_(t,e.provider),n={sessionId:e.sessionId,cwd:e.cwd,env:e.env,onDelta:e.onDelta,onProgress:e.onProgress,signal:e.signal,timeoutMs:e.timeoutMs,model:e.model,effort:e.effort,progPath:e.progPath,alias:e.alias,isLead:e.isLead,permissionMode:e.permissionMode},s=await r.sendTurn(e.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 ac(e){let t=e.registry??Ri(),r=d_(t,e.provider),n=await c_(t,e.provider,e.cwd),s=await r.seed(e.cwd,{model:e.model,effort:e.effort,prompt:e.prompt}),i=s.warnings!==void 0&&s.warnings.length>0?{warnings:s.warnings}:{};if(!s.success)return{success:!1,error:s.error,...i};if(s.sessionId)return{success:!0,sessionId:s.sessionId,...i};let o=await c_(t,e.provider,e.cwd),a=Q0(n,o);return a?{success:!0,sessionId:a,...i}:{success:!0,...i}}async function c_(e,t,r){let n=await e.listAll({provider:t,workspace:r}),s=new Map;for(let i of n)s.set(i.sessionId,i.modifiedAt);return s}function Q0(e,t){let r=[];for(let n of t.keys())e.has(n)||r.push(n);return r.length===1?r[0]:void 0}async function lc(e={}){return(e.registry??Ri()).listAll({provider:e.provider,workspace:e.workspace,limit:e.limit,from:e.from,to:e.to})}async function cc(e){let r=await(e.registry??Ri()).getSession(e.sessionId,e.provider);if(!r)throw new Error(`session "${e.sessionId}" not found`);let n=r.totalInputTokens??0,s=r.totalCachedInputTokens??0,i=r.totalCacheWriteInputTokens??0,o=r.totalOutputTokens??0,a=r.totalReasoningOutputTokens??0;return{provider:r.provider,sessionId:r.sessionId,input:n,cachedInput:s,cacheWriteInput:i,output:o,reasoningOutput:a,total:n+s+i+o+a,lastTurn:r.lastTokenUsage}}var Ai,vt=T(()=>{"use strict";ll();oc();ll();oc();Yr();Ai=null});function ex(){return uc===null&&(uc=Et(bt())),uc}async function Li(e){let{dal:t,team_member_id:r}=e,n=t!==void 0&&r!==void 0;n&&t.setMemberState(r,"in_chat");let s=!1,i;try{return await rx(e)}catch(o){throw s=!0,i=o,o}finally{if(n)if(!s)nn.delete(r),t.setMemberState(r,"idle");else{let o=tx(i,r);t.setMemberState(r,o!==null?"attention_needed":"idle",o)}}}function tx(e,t){if(!(e instanceof ve))return nn.delete(t),null;if(e.kind==="sessiondir_missing")return"sessiondir_missing";if(e.kind==="enoent")return"binary_missing";if(e.kind==="nonzero_exit"&&(e.exit_status===137||e.exit_status===139))return"oom_exit";if(e.kind==="timeout"){let r=(nn.get(t)??0)+1;return r>=3?(nn.delete(t),"consecutive_timeouts"):(nn.set(t,r),null)}return nn.delete(t),null}async function rx(e){let t=e.timeoutMs,r=typeof t=="number"&&t>0,n=ex(),s;try{let d=await n.resolveSession(e.sessionid);if(!d)return Promise.reject(new ve("other",null,`library: sessionid "${e.sessionid}" matched no registered provider`,fc(e.sessionid,e.sessiondir,"unresolved")));s=d.provider.name}catch(d){return Promise.reject(new ve("other",null,`library: session resolution failed: ${u_(d)}`,fc(e.sessionid,e.sessiondir,"unresolved")))}let i=fc(e.sessionid,e.sessiondir,s),o=new AbortController,a=r?setTimeout(()=>o.abort(),t):null,l=!1;o.signal.addEventListener("abort",()=>{l=!0},{once:!0});let c=Date.now();try{let d=await St({provider:s,sessionId:e.sessionid,cwd:e.sessiondir,prompt:e.prompt,timeoutMs:0,signal:o.signal,registry:n,onProgress:e.onProgress,permissionMode:e.permissionMode});if(d.status==="stalled")throw new ve("timeout",null,`library: stalled after ${d.stalledAfterMs??0}ms`,i);return{text:d.text,ms:Date.now()-c,exit_status:0,argv:i}}catch(d){throw l?new ve("timeout",null,`library: wall-clock timeout after ${t??0}ms`,i):nx(d,i)}finally{a!==null&&clearTimeout(a)}}function fc(e,t,r){return["<library>","chat",e,t,"--provider",r]}function u_(e){return e instanceof Error?e.message:String(e)}function nx(e,t){if(e instanceof ve)return e;if(e instanceof Se){let r=e.cause;return r?.code==="ENOENT_CWD"?new ve("sessiondir_missing",null,e.message,t):r?.code==="ENOENT"?new ve("enoent",null,e.message,t):new ve("other",null,e.message,t)}return e instanceof Wt?new ve("nonzero_exit",e.exitCode??null,e.stderr??e.message,t):e instanceof Bt?new ve("nonzero_exit",e.rpcCode??null,e.message,t):e instanceof Qe?new ve("other",null,e.message,t):new ve("other",null,u_(e),t)}var ve,uc,nn,Oi=T(()=>{"use strict";vt();ve=class extends Error{kind;exit_status;stderr;argv;constructor(t,r,n,s){super(`lmctl chat failed: ${t}`),this.kind=t,this.exit_status=r,this.stderr=n,this.argv=s,this.name="ChatError"}},uc=null;nn=new Map});function f_(){return mc===null&&(mc=Et(bt())),mc}function ix(e,t){if(!sx.test(e))return e;let r=t.getConfig(`workspace.${e}`);if(r===null||r.length===0)throw new ke("other",null,`workspace has no mapping for ${e}; run \`lmctl workspace init\` (or set workspace.${e} in lmctl_config)`,["<library>","seed","--provider",e]);return r}async function $i(e){let t=ix(e.member.provider,e.dal),r=t===e.member.provider?e.member:{...e.member,provider:t},n=await ox({member:r});return e.dal.setMemberProviderResolved(e.member.id,t),{sessionid:n.sessionid,provider_resolved:t}}async function ox(e){let t=e.member.provider,r=e.member.sessiondir,n=pc("seed",r,t);try{let s=await ac({provider:t,cwd:r,registry:f_()});if(!s.success)throw lx(s.error,n);if(!s.sessionId)throw new ke("parse",0,"",n);return{sessionid:s.sessionId}}catch(s){throw s instanceof ke?s:_c(s,n)}}async function m_(e){return ax(e)}async function ax(e){let t=f_(),r=pc("tokens",e.sessionid,"unresolved"),n;try{let i=await t.resolveSession(e.sessionid);if(!i)throw new ke("parse",0,`library: sessionid "${e.sessionid}" matched no registered provider`,r);n=i.provider.name}catch(i){throw i instanceof ke?i:_c(i,r)}let s=pc("tokens",e.sessionid,n);try{let i=await cc({sessionId:e.sessionid,provider:n,registry:t});return{input_tokens:i.input,cache_tokens:i.cachedInput+i.cacheWriteInput,output_tokens:i.output,total_tokens:i.total}}catch(i){throw i instanceof ke?i:_c(i,s)}}function pc(e,t,r){return["<library>",e,t,"--provider",r]}function lx(e,t){let r=e??"";if(/\bENOENT\b/i.test(r))return new ke("enoent",null,r,t);if(/timed?\s*out/i.test(r))return new ke("timeout",null,r,t);if(/\bexit code\s+(-?\d+)\b/i.test(r)){let n=/\bexit code\s+(-?\d+)\b/i.exec(r);return new ke("nonzero_exit",Number(n[1]),r,t)}return new ke("other",null,r,t)}function _c(e,t){return e instanceof ke?e:e instanceof Se?e.cause?.code==="ENOENT"?new ke("enoent",null,e.message,t):new ke("other",null,e.message,t):e instanceof Wt?new ke("nonzero_exit",e.exitCode??null,e.stderr??e.message,t):e instanceof Bt?new ke("nonzero_exit",e.rpcCode??null,e.message,t):e instanceof Qe?new ke("other",null,e.message,t):new ke("other",null,e instanceof Error?e.message:String(e),t)}var ke,mc,sx,hc=T(()=>{"use strict";vt();ke=class extends Error{kind;exit_status;stderr;argv;constructor(t,r,n,s){super(`lmctl seed failed: ${t}`),this.kind=t,this.exit_status=r,this.stderr=n,this.argv=s,this.name="SeedError"}},mc=null;sx=/^provider[123]$/});function Ci(e){return Buffer.from(e,"utf8").toString("base64url")}function is(e){return Buffer.from(e,"base64url").toString("utf8")}async function p_(e,t=r=>m_({sessionid:r})){if(process.env.LMCTL_SESSION_SIZE_DISABLED==="1")return{recorded:0,failed:0};let r=0,n=0;for(let s of cx(e)){let i=s.member.sessionid;if(i!==null)try{let o=await t(i);e.recordSessionSize({team_name:s.team_name,alias:s.member.alias,sessionid:i,...o}),r+=1}catch(o){n+=1;try{e.raiseAttention({kind:"daemon_session_size_failed",severity:"warn",payload:JSON.stringify({team_name:s.team_name,alias:s.member.alias,sessionid:i,error:o instanceof Error?o.message:String(o)})})}catch{}}}return{recorded:r,failed:n}}async function __(e,t,r){let n=h_(e,t,r);if(n===null||n.member.sessionid===null)throw new Error("session member not found");if(n.member.state!=="idle")throw new ss(r,n.member.state);e.setMemberState(n.member.id,"in_chat","compacting");try{return await Li({sessionid:n.member.sessionid,sessiondir:n.member.sessiondir,prompt:"/compact"}),e.setMemberState(n.member.id,"idle",null),{ok:!0,row:g_(e,t,r)}}catch(s){throw e.setMemberState(n.member.id,"attention_needed",`compact failed: ${s instanceof Error?s.message:String(s)}`),s}}async function gc(e,t,r){let n=h_(e,t,r);if(n===null)throw new Error("session member not found");let s=await $i({member:n.member,dal:e});return e.updateTeamMemberSession(n.member.id,s.sessionid),{ok:!0,sessionid:s.sessionid,row:g_(e,t,r)}}function cx(e){return e.listTeams().flatMap(t=>e.listTeamMembers(t.id).filter(r=>r.sessionid!==null).map(r=>({team_name:t.name,member:r})))}function h_(e,t,r){let n=e.findTeamByName(t);if(n===null)return null;let s=e.findTeamMemberByAlias(n.id,r);return s===null?null:{team_name:n.name,member:s}}function g_(e,t,r){return e.sessionSizeHistory(t,r,1)[0]??null}var ss,Mi=T(()=>{"use strict";Oi();hc();ss=class extends Error{constructor(t,r){super(`member ${t} is currently ${r}; cannot compact while busy`),this.name="MemberBusyError"}}});async function yc(e){let t=e.dal,r=e.nowMs??Date.now(),n=e.thresholdMs??ux(t),s=r-n,i=t.query(`
|
|
1424
1424
|
SELECT
|
|
1425
1425
|
isess.id AS interactive_session_id,
|
|
1426
1426
|
isess.run_id,
|
|
@@ -1446,16 +1446,16 @@ ${r}`:r}function gp(e,t){let r=DN[t.tool];return r?new Promise((n,s)=>{let i=t.b
|
|
|
1446
1446
|
JOIN step s ON s.id = isess.step_id
|
|
1447
1447
|
WHERE isess.status = 'waiting_agent'
|
|
1448
1448
|
AND r.terminal_state IS NULL
|
|
1449
|
-
`),o={scanned:i.length,hung_detected:0,attentions_created:0,duplicates_suppressed:0};for(let a of i){let l=px(a.workflow_definition,a.session_state_name,a.step_state_name);if(l===null)continue;let c=fx(t,a.team_id,l);if(c===null||c.sessionid===null)continue;let d=c.alias.toLowerCase()!=="lead",u=a.last_activity_at<s&&(a.last_event_at===null||a.last_event_at<s),f=a.started_at<s;if(!d||!u||!f)continue;let m={session_id:c.sessionid,step_id:a.step_id,member_alias:c.alias,provider:Ue(c),last_activity_at:a.last_activity_at,elapsed_ms:r-a.started_at,session_state:a.session_status,factors:{leaf:!0,no_activity:!0,elapsed:!0}};if(o.hung_detected+=1,mx(t,a.run_id,a.step_id,c.sessionid)){o.duplicates_suppressed+=1;continue}let p={run_id:a.run_id,project_id:a.project_id,payload:m};t.raiseAttention({kind:"session_hung",severity:"warn",project_id:a.project_id,run_id:a.run_id,requires_user:!0,payload:JSON.stringify(m)}),o.attentions_created+=1,e.enableKillHook===!0&&e.killHook!==void 0&&await e.killHook(p)}return o}function ux(e){return y_(e.getConfig(
|
|
1449
|
+
`),o={scanned:i.length,hung_detected:0,attentions_created:0,duplicates_suppressed:0};for(let a of i){let l=px(a.workflow_definition,a.session_state_name,a.step_state_name);if(l===null)continue;let c=fx(t,a.team_id,l);if(c===null||c.sessionid===null)continue;let d=c.alias.toLowerCase()!=="lead",u=a.last_activity_at<s&&(a.last_event_at===null||a.last_event_at<s),f=a.started_at<s;if(!d||!u||!f)continue;let m={session_id:c.sessionid,step_id:a.step_id,member_alias:c.alias,provider:Ue(c),last_activity_at:a.last_activity_at,elapsed_ms:r-a.started_at,session_state:a.session_status,factors:{leaf:!0,no_activity:!0,elapsed:!0}};if(o.hung_detected+=1,mx(t,a.run_id,a.step_id,c.sessionid)){o.duplicates_suppressed+=1;continue}let p={run_id:a.run_id,project_id:a.project_id,payload:m};t.raiseAttention({kind:"session_hung",severity:"warn",project_id:a.project_id,run_id:a.run_id,requires_user:!0,payload:JSON.stringify(m)}),o.attentions_created+=1,e.enableKillHook===!0&&e.killHook!==void 0&&await e.killHook(p)}return o}function ux(e){return y_(e.getConfig(ji),dx)*1e3}function wc(e,t){return y_(e.getConfig(Di),t)}function y_(e,t){if(e===null||e.trim().length===0)return t;let r=Number(e);return Number.isFinite(r)&&r>0?Math.floor(r):t}function fx(e,t,r){return e.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",t,r)[0]??null}function mx(e,t,r,n){return e.query(`SELECT * FROM attention
|
|
1450
1450
|
WHERE kind = 'session_hung'
|
|
1451
1451
|
AND run_id = ?
|
|
1452
|
-
AND acknowledged_at IS NULL`,t).some(i=>{let o=w_(i.payload);return o!==null&&o.step_id===r&&o.session_id===n})}function px(e,t,r){let n=w_(e);return n===null?null:_x(n,t,r)??hx(n,t,r)}function _x(e,t,r){if(!Array.isArray(e.steps))return null;let n=e.steps.filter(gx),s=n.find(a=>a.id===t)??n.find(a=>a.name===t)??n.find(a=>a.name===r);if(s===void 0||s.type!=="lmctl/interactive")return null;let i=Ar(s.members)?s.members:null,o=i!==null&&Ar(i.agent)?i.agent:null;return typeof o?.alias=="string"?o.alias:null}function hx(e,t,r){if(!Ar(e.states))return null;let n=e.states[t]??e.states[r];if(!Ar(n))return null;let s=n;if(!Ar(s.agent))return null;let i=s.agent;return typeof i.alias=="string"?i.alias:null}function gx(e){return Ar(e)}function w_(e){if(e===null)return null;try{let t=JSON.parse(e);return Ar(t)?t:null}catch{return null}}function Ar(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}var
|
|
1452
|
+
AND acknowledged_at IS NULL`,t).some(i=>{let o=w_(i.payload);return o!==null&&o.step_id===r&&o.session_id===n})}function px(e,t,r){let n=w_(e);return n===null?null:_x(n,t,r)??hx(n,t,r)}function _x(e,t,r){if(!Array.isArray(e.steps))return null;let n=e.steps.filter(gx),s=n.find(a=>a.id===t)??n.find(a=>a.name===t)??n.find(a=>a.name===r);if(s===void 0||s.type!=="lmctl/interactive")return null;let i=Ar(s.members)?s.members:null,o=i!==null&&Ar(i.agent)?i.agent:null;return typeof o?.alias=="string"?o.alias:null}function hx(e,t,r){if(!Ar(e.states))return null;let n=e.states[t]??e.states[r];if(!Ar(n))return null;let s=n;if(!Ar(s.agent))return null;let i=s.agent;return typeof i.alias=="string"?i.alias:null}function gx(e){return Ar(e)}function w_(e){if(e===null)return null;try{let t=JSON.parse(e);return Ar(t)?t:null}catch{return null}}function Ar(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}var ji,Di,dx,Ec=T(()=>{"use strict";Ze();ji="monitor.session_hung.elapsed_threshold_seconds",Di="monitor.session_hung.check_interval_ms",dx=600});function Fi(e){let t=e.query(`
|
|
1453
1453
|
SELECT status, COUNT(*) AS count FROM job GROUP BY status
|
|
1454
|
-
`),r={queued:
|
|
1454
|
+
`),r={queued:Pi(t,"queued"),running:Pi(t,"running"),done:Pi(t,"done"),failed:Pi(t,"failed"),total:bc(t)},n=e.query(`
|
|
1455
1455
|
SELECT terminal_state, COUNT(*) AS count FROM run GROUP BY terminal_state
|
|
1456
1456
|
`),s=e.query(`
|
|
1457
1457
|
SELECT acknowledged_at, COUNT(*) AS count FROM attention GROUP BY acknowledged_at IS NOT NULL
|
|
1458
|
-
`);return{generated_at:new Date().toISOString(),jobs:r,runs:{active:n.filter(i=>i.terminal_state===null).reduce((i,o)=>i+o.count,0),terminal:n.filter(i=>i.terminal_state!==null).reduce((i,o)=>i+o.count,0),total:bc(n)},attentions:{unacked:s.filter(i=>i.acknowledged_at===null).reduce((i,o)=>i+o.count,0),total:bc(s)},projects:Tc(e,"project"),teams:Tc(e,"team"),workflows:Tc(e,"workflow")}}function
|
|
1458
|
+
`);return{generated_at:new Date().toISOString(),jobs:r,runs:{active:n.filter(i=>i.terminal_state===null).reduce((i,o)=>i+o.count,0),terminal:n.filter(i=>i.terminal_state!==null).reduce((i,o)=>i+o.count,0),total:bc(n)},attentions:{unacked:s.filter(i=>i.acknowledged_at===null).reduce((i,o)=>i+o.count,0),total:bc(s)},projects:Tc(e,"project"),teams:Tc(e,"team"),workflows:Tc(e,"workflow")}}function Ui(e){return e.listProjects()}function b_(e){return e.listTeams().map(t=>({...t,members:e.listTeamMembers(t.id)}))}function Wi(e){return e.query(`
|
|
1459
1459
|
SELECT w.*
|
|
1460
1460
|
FROM workflow w
|
|
1461
1461
|
JOIN (
|
|
@@ -1464,7 +1464,7 @@ ${r}`:r}function gp(e,t){let r=DN[t.tool];return r?new Promise((n,s)=>{let i=t.b
|
|
|
1464
1464
|
GROUP BY name
|
|
1465
1465
|
) latest ON latest.name = w.name AND latest.version = w.version
|
|
1466
1466
|
ORDER BY w.name ASC
|
|
1467
|
-
`)}function S_(e,t={}){return t.status!==void 0?e.query("SELECT * FROM job WHERE status = ? ORDER BY priority DESC, id ASC",t.status):e.query("SELECT * FROM job ORDER BY priority DESC, id ASC LIMIT 100")}function v_(e,t={}){if(t.pr_url!==void 0){let r=e.findSubmittedPrByUrl(t.pr_url);return r===null?[]:[r]}return e.listSubmittedPrs({status:t.status})}function k_(e,t){return e.getSubmittedPr(t)}function
|
|
1467
|
+
`)}function S_(e,t={}){return t.status!==void 0?e.query("SELECT * FROM job WHERE status = ? ORDER BY priority DESC, id ASC",t.status):e.query("SELECT * FROM job ORDER BY priority DESC, id ASC LIMIT 100")}function v_(e,t={}){if(t.pr_url!==void 0){let r=e.findSubmittedPrByUrl(t.pr_url);return r===null?[]:[r]}return e.listSubmittedPrs({status:t.status})}function k_(e,t){return e.getSubmittedPr(t)}function Bi(e,t){return e.query("SELECT * FROM job WHERE id = ?",t)[0]??null}function sn(e,t={}){return e.query("SELECT * FROM run ORDER BY id DESC LIMIT ?",t.limit??100)}function Rr(e,t){let r=e.query("SELECT * FROM run WHERE id = ?",t)[0];return r===void 0?null:{...r,job:Bi(e,r.job_id),workflow:e.query("SELECT * FROM workflow WHERE id = ?",r.workflow_id)[0]??null,team:e.getTeam(r.team_id),steps:yx(e,r.id)}}function yx(e,t){return e.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",t).map(r=>({...r,artifacts:I_(e,r.id)}))}function Sc(e,t,r){let n=e.query("SELECT * FROM step WHERE run_id = ? AND id = ?",t,r)[0];return n===void 0?null:{...n,artifacts:I_(e,n.id)}}function I_(e,t){return e.query("SELECT * FROM step_artifact WHERE step_id = ? ORDER BY id ASC",t)}function Lr(e,t,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?e.query(n,t):e.query(n,t,r)}function N_(e,t,r){let n=Sc(e,t,r);return n===null?null:(n.artifacts.find(i=>i.kind===`${n.state_name}_transcript`)??n.artifacts.find(i=>i.content!==null))?.content??null}function x_(e,t={}){return t.type!==void 0?e.query("SELECT * FROM external_object WHERE type = ? ORDER BY id DESC",t.type):e.query("SELECT * FROM external_object ORDER BY id DESC LIMIT 100")}function A_(e,t={}){return t.unhandled===!0?e.query("SELECT * FROM external_signal WHERE handled_at IS NULL ORDER BY id DESC"):e.query("SELECT * FROM external_signal ORDER BY id DESC LIMIT 100")}function cr(e,t={}){return t.unacked===!0?e.query("SELECT * FROM attention WHERE acknowledged_at IS NULL ORDER BY id DESC"):e.query("SELECT * FROM attention ORDER BY id DESC LIMIT 100")}function qi(e,t={}){let r=[],n="a.kind IN ('interactive_waiting_operator', 'workflow_escalation')";return t.all!==!0&&(n+=" AND a.acknowledged_at IS NULL"),t.project!==void 0&&(n+=" AND p.name = ?",r.push(t.project)),t.since!==void 0&&(n+=" AND a.created_at >= ?",r.push(t.since)),e.query(`${R_}
|
|
1468
1468
|
WHERE ${n}
|
|
1469
1469
|
ORDER BY a.created_at DESC`,...r).map(L_)}function kt(e,t){let n=e.query(`${R_}
|
|
1470
1470
|
WHERE a.id = ?`,t)[0];return n===void 0?null:L_(n)}function L_(e){let{payload_json:t,...r}=e,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(t==null)return n;let s;try{s=JSON.parse(t)}catch{return n}if(s===null||typeof s!="object")return n;let i=s;if(Array.isArray(i.node_path)&&i.node_path.every(o=>typeof o=="string")&&(n.node_path=i.node_path),i.expected_response!==null&&typeof i.expected_response=="object"){let o=i.expected_response;if(typeof o.kind=="string"){let a=Array.isArray(o.choices)&&o.choices.every(l=>typeof l=="string")?o.choices:null;n.expected_response={kind:o.kind,choices:a}}}if(Array.isArray(i.transcript_tail)&&i.transcript_tail.every(o=>typeof o=="string")&&(n.transcript_tail=i.transcript_tail),typeof i.paused_at=="string"&&(n.paused_at=i.paused_at),i.created_run_inputs!==null&&typeof i.created_run_inputs=="object"&&!Array.isArray(i.created_run_inputs)&&(n.created_run_inputs=i.created_run_inputs),typeof i.workflow_version_id=="number"?n.workflow_version_id=i.workflow_version_id:i.workflow_version_id===null&&(n.workflow_version_id=null),i.step!==null&&typeof i.step=="object"&&!Array.isArray(i.step)){let o=i.step;typeof o.id=="string"&&o.id.length>0&&(n.workflow_step={id:o.id,name:typeof o.name=="string"?o.name:null,type:typeof o.type=="string"?o.type:null})}return typeof i.tier=="string"&&(n.escalation_tier=i.tier),typeof i.token=="string"&&(n.escalation_token=i.token),typeof i.reason=="string"&&(n.escalation_reason=i.reason),Array.isArray(i.declared_outcomes)&&i.declared_outcomes.every(o=>typeof o=="string")&&(n.declared_outcomes=i.declared_outcomes),typeof i.agent_output=="string"&&(n.agent_output=i.agent_output),n}function O_(e){return e.query(`
|
|
@@ -1473,7 +1473,7 @@ ${r}`:r}function gp(e,t){let r=DN[t.tool];return r?new Promise((n,s)=>{let i=t.b
|
|
|
1473
1473
|
JOIN workflow w ON w.id = r.workflow_id
|
|
1474
1474
|
GROUP BY w.name, r.terminal_state
|
|
1475
1475
|
ORDER BY w.name ASC, r.terminal_state ASC
|
|
1476
|
-
`)}function Tc(e,t){return e.query(`SELECT COUNT(*) AS count FROM ${t}`)[0]?.count??0}function
|
|
1476
|
+
`)}function Tc(e,t){return e.query(`SELECT COUNT(*) AS count FROM ${t}`)[0]?.count??0}function Pi(e,t){return e.find(r=>r.status===t)?.count??0}function bc(e){return e.reduce((t,r)=>t+r.count,0)}function vc(e,t,r){let n=r!==void 0?new Date(Date.now()-Math.trunc(r)*864e5).toISOString():null,s=[t];n!==null&&s.push(n);let i=e.query(`SELECT s.state_name, s.outcome
|
|
1477
1477
|
FROM step s
|
|
1478
1478
|
JOIN run r ON r.id = s.run_id
|
|
1479
1479
|
JOIN job j ON j.id = r.job_id
|
|
@@ -1540,9 +1540,9 @@ ${r}`:r}function gp(e,t){let r=DN[t.tool];return r?new Promise((n,s)=>{let i=t.b
|
|
|
1540
1540
|
json_extract(payload, '$.elapsedMs') ASC`,r),o=new Map;for(let l of i){let c=o.get(l.tool_name)??[];c.push(l.elapsed_ms),o.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,d=o.get(l.tool_name)??[],u=d.length>0?d.reduce((p,_)=>p+_,0)/d.length:null,f=d.length>0?d[Math.floor(d.length*.5)]??null:null,m=d.length>0?d[Math.floor(d.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:u!==null?Math.round(u):null,p50_latency_ms:f,p95_latency_ms:m}})}function $_(e){try{let t=JSON.parse(e);if(t.schema_version==="lmctl/v3"&&Array.isArray(t.steps)){let r=[],n=new Map,s=new Map;for(let i of t.steps){let o=typeof i.id=="string"?i.id:null;o!==null&&(r.push(o),typeof i.type=="string"&&s.set(o,i.type),typeof i.name=="string"&&i.name.length>0&&n.set(i.name,o))}return{schema:"v3",nodes:r,nodeTypes:s,nameToId:n}}if(t.states!==null&&typeof t.states=="object"){let r=t.states,n=new Map;for(let[l,c]of Object.entries(r))if(c!==null&&typeof c=="object"){let d=c.type;typeof d=="string"&&n.set(l,d)}let s=typeof t.start_at=="string"?t.start_at:null,i=Object.keys(r),o=s!==null&&i.includes(s)?[s,...i.filter(l=>l!==s)]:i,a=t.terminals!==null&&typeof t.terminals=="object"?Object.keys(t.terminals).map(l=>`@terminal:${l}`):[];for(let l of a)n.set(l,"Terminal");return{schema:"v2",nodes:[...o,...a],nodeTypes:n,nameToId:new Map}}}catch{}return{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map}}function on(e,t){let r=e.query("SELECT * FROM run WHERE id = ?",t)[0];if(r===void 0)return null;let n=e.query("SELECT * FROM workflow WHERE id = ?",r.workflow_id)[0]??null,s=(()=>{let g=e.query("SELECT * FROM job WHERE id = ?",r.job_id)[0];return g===void 0?null:e.query("SELECT * FROM project WHERE id = ?",g.project_id)[0]?.name??null})(),i=n!==null?$_(n.definition):{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map},o=e.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",t),a=g=>i.schema==="v3"&&i.nameToId.has(g)?i.nameToId.get(g):g,l=new Map;for(let g of o)l.set(a(g.state_name),g);let c=e.query(`SELECT state_name, status, last_agent_output
|
|
1541
1541
|
FROM interactive_session
|
|
1542
1542
|
WHERE run_id = ? AND status = 'waiting_operator'
|
|
1543
|
-
ORDER BY id DESC LIMIT 1`,t)[0],d=c!==void 0?a(c.state_name):null,u=d,f=c?.last_agent_output??null;if(u===null){let g=o.find(h=>h.ended_at===null);g!==void 0?u=a(g.state_name):o.length>0?u=a(o[o.length-1].state_name):u=r.current_state}r.terminal_state!==null&&(u=`@terminal:${r.terminal_state}`,f=null);let m=new Set,p=[...i.nodes];for(let g of o){let h=a(g.state_name);!i.nodes.includes(h)&&!p.includes(h)&&p.push(h)}u!==null&&!p.includes(u)&&p.push(u);let _=[];for(let g of p){if(m.has(g))continue;m.add(g);let h=g===u,S=l.get(g),y="pending",w=null;if(g.startsWith("@terminal:"))y=r.terminal_state===g.slice(10)?"done":"pending";else if(S!==void 0&&(S.ended_at===null?y=h&&d===g?"paused":"running":S.outcome===null?y="failed":y="done",S.ended_at!==null)){let I=Date.parse(S.started_at),x=Date.parse(S.ended_at);!Number.isNaN(I)&&!Number.isNaN(x)&&(w=x-I)}h&&d===g&&(y="paused"),_.push({id:g,status:y,is_current:h,elapsed_ms:w,prompt:h&&y==="paused"?f:null,expected:h&&y==="paused"?"free_text":null})}return{run_id:t,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:u,nodes:_}}function
|
|
1543
|
+
ORDER BY id DESC LIMIT 1`,t)[0],d=c!==void 0?a(c.state_name):null,u=d,f=c?.last_agent_output??null;if(u===null){let g=o.find(h=>h.ended_at===null);g!==void 0?u=a(g.state_name):o.length>0?u=a(o[o.length-1].state_name):u=r.current_state}r.terminal_state!==null&&(u=`@terminal:${r.terminal_state}`,f=null);let m=new Set,p=[...i.nodes];for(let g of o){let h=a(g.state_name);!i.nodes.includes(h)&&!p.includes(h)&&p.push(h)}u!==null&&!p.includes(u)&&p.push(u);let _=[];for(let g of p){if(m.has(g))continue;m.add(g);let h=g===u,S=l.get(g),y="pending",w=null;if(g.startsWith("@terminal:"))y=r.terminal_state===g.slice(10)?"done":"pending";else if(S!==void 0&&(S.ended_at===null?y=h&&d===g?"paused":"running":S.outcome===null?y="failed":y="done",S.ended_at!==null)){let I=Date.parse(S.started_at),x=Date.parse(S.ended_at);!Number.isNaN(I)&&!Number.isNaN(x)&&(w=x-I)}h&&d===g&&(y="paused"),_.push({id:g,status:y,is_current:h,elapsed_ms:w,prompt:h&&y==="paused"?f:null,expected:h&&y==="paused"?"free_text":null})}return{run_id:t,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:u,nodes:_}}function Hi(e){let t=[],r=e.workflow_name??"?",n=e.workflow_version!==null?`v${e.workflow_version}`:"v?",s=e.terminal_state!==null?`terminal:${e.terminal_state}`:e.paused?"paused":"running";t.push(`run: ${e.run_id} (${r}, ${n}) - ${s}`),e.project!==null&&t.push(`project: ${e.project}`),t.push(""),t.push("workflow tree:");for(let i of e.nodes)t.push(...wx(i));return`${t.join(`
|
|
1544
1544
|
`)}
|
|
1545
|
-
`}function wx(e){let t=[],r=Ex(e.status),n=[];e.status==="done"&&e.elapsed_ms!==null?n.push(`done, ${(e.elapsed_ms/1e3).toFixed(1)}s`):e.status==="failed"?n.push("failed"):e.status==="paused"?n.push("paused, waiting for operator input"):e.status==="running"?n.push("running"):e.status==="pending"&&n.push("pending");let s=n.length>0?`(${n.join(", ")})`:"",i=e.is_current?" <- CURRENT":"",o=e.id.padEnd(28);if(t.push(` ${r} ${o} ${s}${i}`.trimEnd()),e.is_current&&e.status==="paused"&&e.prompt!==null){let a=e.prompt.split(/\r?\n/)[0]??"",l=a.length>80?`${a.slice(0,80)}...`:a;t.push(` \u2514 prompt: "${l}"`),e.expected!==null&&t.push(` \u2514 expected: ${e.expected}`)}return t}function Ex(e){switch(e){case"done":return"[x]";case"failed":return"[!]";case"paused":return"[*]";case"running":return"[>]";case"pending":return"[ ]";default:return" "}}function
|
|
1545
|
+
`}function wx(e){let t=[],r=Ex(e.status),n=[];e.status==="done"&&e.elapsed_ms!==null?n.push(`done, ${(e.elapsed_ms/1e3).toFixed(1)}s`):e.status==="failed"?n.push("failed"):e.status==="paused"?n.push("paused, waiting for operator input"):e.status==="running"?n.push("running"):e.status==="pending"&&n.push("pending");let s=n.length>0?`(${n.join(", ")})`:"",i=e.is_current?" <- CURRENT":"",o=e.id.padEnd(28);if(t.push(` ${r} ${o} ${s}${i}`.trimEnd()),e.is_current&&e.status==="paused"&&e.prompt!==null){let a=e.prompt.split(/\r?\n/)[0]??"",l=a.length>80?`${a.slice(0,80)}...`:a;t.push(` \u2514 prompt: "${l}"`),e.expected!==null&&t.push(` \u2514 expected: ${e.expected}`)}return t}function Ex(e){switch(e){case"done":return"[x]";case"failed":return"[!]";case"paused":return"[*]";case"running":return"[>]";case"pending":return"[ ]";default:return" "}}function Ji(e,t,r={}){let n=r.nowMs??Date.now(),s=e.query("SELECT * FROM run WHERE id = ?",t)[0];if(s===void 0)return null;let i=e.query("SELECT * FROM workflow WHERE id = ?",s.workflow_id)[0]??null,o=s.workflow_version_id===null?null:e.query("SELECT version FROM workflow_version WHERE id = ?",s.workflow_version_id)[0]??null,a=e.query("SELECT * FROM job WHERE id = ?",s.job_id)[0]??null,l=a===null?null:e.query("SELECT * FROM project WHERE id = ?",a.project_id)[0]??null,c=i!==null?$_(i.definition):{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map},d=I=>c.schema==="v3"&&c.nameToId.has(I)?c.nameToId.get(I):I,u=e.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",t),f=new Map;for(let I of u)f.set(d(I.state_name),I);let m=e.query("SELECT * FROM interactive_session WHERE run_id = ? ORDER BY id ASC",t),p=new Map;for(let I of m)p.set(d(I.state_name),I);let _=new Map,g=e.query("SELECT MAX(timestamp_ms) AS timestamp_ms FROM session_event WHERE run_id = ? AND step_id IS NULL",t)[0]?.timestamp_ms??null;for(let I of e.query(`SELECT step_id, MAX(timestamp_ms) AS timestamp_ms
|
|
1546
1546
|
FROM session_event
|
|
1547
1547
|
WHERE run_id = ? AND step_id IS NOT NULL
|
|
1548
1548
|
GROUP BY step_id`,t))I.step_id!==null&&_.set(I.step_id,I.timestamp_ms);let h=Tx(c,u,d),S=bx(s.current_state),y=e.query(`SELECT kind, severity, payload
|
|
@@ -1550,9 +1550,9 @@ ${r}`:r}function gp(e,t){let r=DN[t.tool];return r?new Promise((n,s)=>{let i=t.b
|
|
|
1550
1550
|
WHERE run_id = ?
|
|
1551
1551
|
AND kind = 'session_hung'
|
|
1552
1552
|
AND acknowledged_at IS NULL
|
|
1553
|
-
ORDER BY id ASC`,t).map(I=>({kind:I.kind,severity:I.severity,payload:Ax(I.payload)})),w=h.map(I=>{let x=f.get(I),U=p.get(I),ue=Sx(s,I,S,x,U),W=x===void 0?null:Date.parse(x.started_at),M=x?.ended_at===null||x===void 0?null:Date.parse(x.ended_at),A=x===void 0||Number.isNaN(W??NaN)?null:M!==null&&!Number.isNaN(M)?M-W:ue==="running"||ue==="paused"?n-W:null,Q=x===void 0?null:_.get(x.id)??null,B=Rx(U?.last_activity_at??null,Q,g),k=i===null||U===void 0?void 0:Ix(e,s.team_id,i.definition,U.state_name,x?.state_name??I);return{step_id:x?.id??null,state_id:I,status:ue,started_at:x?.started_at??null,ended_at:x?.ended_at??null,last_activity_at:B,elapsed_ms:A,...k!==void 0?{member:k}:{},...U!==void 0?{interactive_session:{id:U.id,status:U.status,turn_count:U.turn_count,state_name:U.state_name}}:{}}});return{run_id:t,workflow_name:i?.name??null,workflow_version:o?.version??i?.version??null,workflow_version_id:s.workflow_version_id,project:l?.name??null,status:kx(s,a,w),submitted_at:a?.enqueued_at??s.started_at,nodes:w,current_node_index:vx(w,s.terminal_state!==null),related_attentions:y}}function
|
|
1553
|
+
ORDER BY id ASC`,t).map(I=>({kind:I.kind,severity:I.severity,payload:Ax(I.payload)})),w=h.map(I=>{let x=f.get(I),U=p.get(I),ue=Sx(s,I,S,x,U),W=x===void 0?null:Date.parse(x.started_at),M=x?.ended_at===null||x===void 0?null:Date.parse(x.ended_at),A=x===void 0||Number.isNaN(W??NaN)?null:M!==null&&!Number.isNaN(M)?M-W:ue==="running"||ue==="paused"?n-W:null,Q=x===void 0?null:_.get(x.id)??null,B=Rx(U?.last_activity_at??null,Q,g),k=i===null||U===void 0?void 0:Ix(e,s.team_id,i.definition,U.state_name,x?.state_name??I);return{step_id:x?.id??null,state_id:I,status:ue,started_at:x?.started_at??null,ended_at:x?.ended_at??null,last_activity_at:B,elapsed_ms:A,...k!==void 0?{member:k}:{},...U!==void 0?{interactive_session:{id:U.id,status:U.status,turn_count:U.turn_count,state_name:U.state_name}}:{}}});return{run_id:t,workflow_name:i?.name??null,workflow_version:o?.version??i?.version??null,workflow_version_id:s.workflow_version_id,project:l?.name??null,status:kx(s,a,w),submitted_at:a?.enqueued_at??s.started_at,nodes:w,current_node_index:vx(w,s.terminal_state!==null),related_attentions:y}}function Xi(e,t={}){let r=t.nowMs??Date.now(),n=[],s=e.workflow_name??"?",i=e.workflow_version!==null?`v${e.workflow_version}`:"v?";n.push(`run ${e.run_id} - ${s}, ${i} - ${e.status}`);let o=`${e.submitted_at} (${T_(Date.parse(e.submitted_at),r)} ago)`;n.push(`project: ${e.project??"?"} | submitted: ${o}`),n.push(""),n.push("timeline:"),n.push(`${E_(e.submitted_at,e.submitted_at)} submit`);for(let a of e.nodes){let l=a.started_at===null?"[ ]":E_(e.submitted_at,a.started_at),c=a.status.padEnd(7),d=a.elapsed_ms===null?"":` elapsed ${Gi(a.elapsed_ms)}`;if(n.push(`${l} ${a.state_id.padEnd(24)} ${c}${d}`.trimEnd()),a.interactive_session!==void 0){let u=a.last_activity_at===null?"last activity unknown":`last activity ${T_(a.last_activity_at,r)} ago`,f=a.member!==void 0?`${a.member.alias} member`:"interactive member";n.push(` ${" ".repeat(24)} ${u}`),n.push(` ${" ".repeat(24)} ${f}, ${a.interactive_session.status}`)}}if(e.related_attentions.length>0){n.push(""),n.push("attentions:");for(let a of e.related_attentions)n.push(`- ${a.kind}${Lx(a.payload)}`)}return`${n.join(`
|
|
1554
1554
|
`)}
|
|
1555
|
-
`}function Tx(e,t,r){let n=e.nodes.filter(s=>s.startsWith("@terminal:")?!1:e.nodeTypes.get(s)!=="lmctl/terminal"&&e.nodeTypes.get(s)!=="Terminal");for(let s of t){let i=r(s.state_name);n.includes(i)||n.push(i)}return n}function bx(e){return e===null?null:e.startsWith("__paused__:")?e.slice(11):e}function Sx(e,t,r,n,s){return n===void 0?"pending":n.ended_at===null?s?.status==="waiting_operator"||e.paused_at!==null&&r===t?"paused":"running":n.outcome===null?"failed":"done"}function vx(e,t){if(e.length===0)return null;let r=e.findIndex(s=>s.status==="running"||s.status==="paused"||s.status==="failed");if(r>=0)return r;if(t){for(let s=e.length-1;s>=0;s-=1)if(e[s].status==="done")return s}let n=e.findIndex(s=>s.status==="pending");return n>=0?n:e.length-1}function kx(e,t,r){return e.terminal_state!==null?e.terminal_state:e.paused_at!==null?"paused":t?.status==="failed"||r.some(n=>n.status==="failed")?"failed":"running"}function Ix(e,t,r,n,s){let i=Nx(r,n,s);if(i===null)return;let o=e.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",t,i)[0];return o===void 0?void 0:{alias:o.alias,provider:Ue(o)}}function Nx(e,t,r){let n=xx(e);if(n===null)return null;if(Array.isArray(n.steps)){let s=n.steps.find(a=>lr(a)?a.id===t||a.name===t||a.name===r:!1),i=lr(s?.members)?s.members:null,o=i!==null&&lr(i.agent)?i.agent:null;return typeof o?.alias=="string"?o.alias:null}if(lr(n.states)){let s=n.states[t]??n.states[r];if(!lr(s))return null;let i=lr(s.agent)?s.agent:null;return typeof i?.alias=="string"?i.alias:null}return null}function xx(e){try{let t=JSON.parse(e);return lr(t)?t:null}catch{return null}}function Ax(e){if(e===null)return null;try{return JSON.parse(e)}catch{return e}}function lr(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Rx(...e){let t=e.filter(r=>r!==null&&Number.isFinite(r));return t.length===0?null:Math.max(...t)}function E_(e,t){let r=Date.parse(e),n=Date.parse(t);return Number.isNaN(r)||Number.isNaN(n)?"[+? ]":`[+${
|
|
1555
|
+
`}function Tx(e,t,r){let n=e.nodes.filter(s=>s.startsWith("@terminal:")?!1:e.nodeTypes.get(s)!=="lmctl/terminal"&&e.nodeTypes.get(s)!=="Terminal");for(let s of t){let i=r(s.state_name);n.includes(i)||n.push(i)}return n}function bx(e){return e===null?null:e.startsWith("__paused__:")?e.slice(11):e}function Sx(e,t,r,n,s){return n===void 0?"pending":n.ended_at===null?s?.status==="waiting_operator"||e.paused_at!==null&&r===t?"paused":"running":n.outcome===null?"failed":"done"}function vx(e,t){if(e.length===0)return null;let r=e.findIndex(s=>s.status==="running"||s.status==="paused"||s.status==="failed");if(r>=0)return r;if(t){for(let s=e.length-1;s>=0;s-=1)if(e[s].status==="done")return s}let n=e.findIndex(s=>s.status==="pending");return n>=0?n:e.length-1}function kx(e,t,r){return e.terminal_state!==null?e.terminal_state:e.paused_at!==null?"paused":t?.status==="failed"||r.some(n=>n.status==="failed")?"failed":"running"}function Ix(e,t,r,n,s){let i=Nx(r,n,s);if(i===null)return;let o=e.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",t,i)[0];return o===void 0?void 0:{alias:o.alias,provider:Ue(o)}}function Nx(e,t,r){let n=xx(e);if(n===null)return null;if(Array.isArray(n.steps)){let s=n.steps.find(a=>lr(a)?a.id===t||a.name===t||a.name===r:!1),i=lr(s?.members)?s.members:null,o=i!==null&&lr(i.agent)?i.agent:null;return typeof o?.alias=="string"?o.alias:null}if(lr(n.states)){let s=n.states[t]??n.states[r];if(!lr(s))return null;let i=lr(s.agent)?s.agent:null;return typeof i?.alias=="string"?i.alias:null}return null}function xx(e){try{let t=JSON.parse(e);return lr(t)?t:null}catch{return null}}function Ax(e){if(e===null)return null;try{return JSON.parse(e)}catch{return e}}function lr(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Rx(...e){let t=e.filter(r=>r!==null&&Number.isFinite(r));return t.length===0?null:Math.max(...t)}function E_(e,t){let r=Date.parse(e),n=Date.parse(t);return Number.isNaN(r)||Number.isNaN(n)?"[+? ]":`[+${Gi(Math.max(0,n-r)).padEnd(6)}]`}function T_(e,t){return Number.isNaN(e)?"?":Gi(Math.max(0,t-e))}function Gi(e){let t=Math.max(0,Math.round(e/1e3));if(t<60)return`${t}s`;let r=Math.floor(t/60),n=t%60;if(r<60)return n===0?`${r}m`:`${r}m${n}s`;let s=Math.floor(r/60),i=r%60;return i===0?`${s}h`:`${s}h${i}m`}function Lx(e){if(!lr(e))return"";let t=typeof e.step_id=="number"?` on step ${e.step_id}`:"",r=typeof e.member_alias=="string"?e.member_alias:null,n=typeof e.provider=="string"?e.provider:null,s=typeof e.elapsed_ms=="number"?`, ${Gi(e.elapsed_ms)} elapsed`:"",i=r===null?"":` (${r}${n===null?"":` ${n}`}${s})`;return`${t}${i}`}var R_,Ht=T(()=>{"use strict";Ze();R_=`SELECT a.id AS attention_id,
|
|
1556
1556
|
a.kind AS kind,
|
|
1557
1557
|
a.severity AS severity,
|
|
1558
1558
|
a.created_at AS created_at,
|
|
@@ -1574,10 +1574,10 @@ ${r}`:r}function gp(e,t){let r=DN[t.tool];return r?new Promise((n,s)=>{let i=t.b
|
|
|
1574
1574
|
ON isess.run_id = a.run_id
|
|
1575
1575
|
AND isess.id = (
|
|
1576
1576
|
SELECT MAX(id) FROM interactive_session WHERE run_id = a.run_id
|
|
1577
|
-
)`});var K_={};
|
|
1577
|
+
)`});var K_={};we(K_,{parseApiArgs:()=>P_,readApiClientConfig:()=>Ic,runApi:()=>Dx});import{readFileSync as Ox}from"node:fs";import{basename as $x,extname as Cx}from"node:path";async function Dx(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(jx),0;if(e[0]==="config")return Fx(e.slice(1),t);let r=G_(e,"--direct");if(r.rest[0]==="escalations")return Ux(r.rest.slice(1),t,r.present);if(r.rest[0]==="workflows"&&r.rest[1]==="verify"&&Yi(r.rest.slice(2)))return t.stdout.write(`${Hx}
|
|
1578
1578
|
`),0;if(r.rest[0]==="workflows"&&r.rest[1]==="verify")return r.present?(t.stderr.write(`error: --direct is not supported for workflows verify; use the HTTP api route
|
|
1579
|
-
`),2):PA(r.rest.slice(2),t);if(r.rest[0]==="run"&&r.rest[1]==="where"&&
|
|
1580
|
-
`),0;if(r.rest[0]==="run"&&r.rest[1]==="timeline"&&
|
|
1579
|
+
`),2):PA(r.rest.slice(2),t);if(r.rest[0]==="run"&&r.rest[1]==="where"&&Yi(r.rest.slice(2)))return t.stdout.write(`${Bx}
|
|
1580
|
+
`),0;if(r.rest[0]==="run"&&r.rest[1]==="timeline"&&Yi(r.rest.slice(2)))return t.stdout.write(`${qx}
|
|
1581
1581
|
`),0;if(r.rest[0]==="run"&&r.rest[1]==="where")return r.present?CA(r.rest.slice(2),t):MA(r.rest.slice(2),t);if(r.rest[0]==="run"&&r.rest[1]==="timeline")return r.present?jA(r.rest.slice(2),t):DA(r.rest.slice(2),t);if(r.present)return wA(r.rest,t);let n=P_(e);if(typeof n=="string")return t.stderr.write(`error: ${n}
|
|
1582
1582
|
`),2;let s=Or(t),i=s.baseUrl,o=dr(n.accept,s.token),a=n.body;if(n.upload!==void 0)try{a=Zx(n.upload.filePath,n.upload.project)}catch(c){return t.stderr.write(`error: upload failed: ${c instanceof Error?c.message:String(c)}
|
|
1583
1583
|
`),2}else n.body!==void 0&&n.contentType!==void 0?o["Content-Type"]=n.contentType:n.body!==void 0&&(o["Content-Type"]="application/json");let l;try{l=await fetch(new URL(n.path,i),{method:n.method,headers:o,body:a})}catch(c){return t.stderr.write(`error: network failure: ${c instanceof Error?c.message:String(c)}
|
|
@@ -1589,24 +1589,24 @@ ${r}`:r}function gp(e,t){let r=DN[t.tool];return r?new Promise((n,s)=>{let i=t.b
|
|
|
1589
1589
|
`):t.stdout.write(`${JSON.stringify(f)}
|
|
1590
1590
|
`)}else n.json?t.stdout.write(`${JSON.stringify(await l.json(),null,2)}
|
|
1591
1591
|
`):(t.stdout.write(await l.text()),t.stdout.write(`
|
|
1592
|
-
`));return 0}function P_(e){let t=W_(e);if(typeof t=="string")return t;let r=t.args,n=t.format!=="text",[s,...i]=r;return s===void 0?"usage: lmctl api <subcommand>":s==="status"?
|
|
1592
|
+
`));return 0}function P_(e){let t=W_(e);if(typeof t=="string")return t;let r=t.args,n=t.format!=="text",[s,...i]=r;return s===void 0?"usage: lmctl api <subcommand>":s==="status"?Ki(i,"/api/status",n):s==="projects"?Ki(i,"/api/projects",n):s==="teams"?Ki(i,"/api/teams",n):s==="workflows"?i[0]==="verify"?lA(i.slice(1),t.format):Ki(i,"/api/workflows",n):s==="workflow"?aA(i,n):s==="upload"?iA(i,n):s==="submit-job"?oA(i,n):s==="issues"?sA(i,n):s==="jobs"?os(i,"--status","/api/jobs","status",n):s==="job"?nA(i,n):s==="project"?cA(i,n):s==="artifact"?fA(i,n):s==="runs"?os(i,"--limit","/api/runs","limit",n,!0):s==="external-objects"?os(i,"--type","/api/external-objects","type",n):s==="external-signals"?M_(i,"--unhandled","/api/external-signals","unhandled",n):s==="attentions"||s==="attention"?i[0]==="ack"?mA(i,n):M_(i,"--unacked","/api/attentions","unacked",n):s==="stats"?pA(i,n):s==="daemon"?_A(i,n):s==="intake"?hA(i,n):s==="session"?gA(i,n):s==="run"?yA(i,t.format):s==="prs"?os(i,"--status","/api/submitted-prs","status",n):s==="pr"?tA(i,n):`unknown subcommand: ${s}`}function dr(e,t){let r={Accept:e};return t!==null&&t.length>0&&(r.Authorization=`Bearer ${t}`),r}function Or(e){if(e.dal!==void 0)return Ic(e.dal,process.env,e);let t=Ie({path:le()});try{return Ic(t,process.env,e)}finally{t.close()}}function Ic(e,t,r){let n=[],s=e.getConfig("api.url"),i;s!==null?i=s:t.LMCTL_API_URL!==void 0&&t.LMCTL_API_URL.length>0?(i=t.LMCTL_API_URL,n.push("api.url")):i=Mx;let o=e.getConfig("api.token"),a;o!==null?a=o:t.LMCTL_API_TOKEN!==void 0&&t.LMCTL_API_TOKEN.length>0?(a=t.LMCTL_API_TOKEN,n.push("api.token")):a=null;for(let l of n)r.stderr.write(`note: ${Px(l)} env var read; consider \`lmctl api config set ${l} ...\` to make this DB-canonical.
|
|
1593
1593
|
`);return{baseUrl:i,token:a}}function Px(e){switch(e){case"api.port":return"LMCTL_API_PORT";case"api.token":return"LMCTL_API_TOKEN";case"api.url":return"LMCTL_API_URL";default:return`LMCTL_${e.replaceAll(".","_").toUpperCase()}`}}async function Fx(e,t){let[r,...n]=e;if(r===void 0)return t.stderr.write(`usage: lmctl api config <get|set|list>
|
|
1594
1594
|
`),2;let s=t.dal===void 0,i=t.dal??Ie({path:le()});try{if(r==="get"){if(n.length!==1)return t.stderr.write(`usage: lmctl api config get <key>
|
|
1595
|
-
`),2;let o=n[0];if(!
|
|
1595
|
+
`),2;let o=n[0];if(!Vi.has(o))return t.stderr.write(`error: unsupported config key: ${o} (Phase A keys: ${[...Vi].join(", ")})
|
|
1596
1596
|
`),2;let a=i.getConfig(o);return a===null?(t.stderr.write(`error: ${o} is not set
|
|
1597
1597
|
`),1):(t.stdout.write(`${a}
|
|
1598
1598
|
`),0)}if(r==="set"){if(n.length!==2)return t.stderr.write(`usage: lmctl api config set <key> <value>
|
|
1599
|
-
`),2;let[o,a]=n;if(!
|
|
1599
|
+
`),2;let[o,a]=n;if(!Vi.has(o))return t.stderr.write(`error: unsupported config key: ${o} (Phase A keys: ${[...Vi].join(", ")})
|
|
1600
1600
|
`),2;let l=zx(o,a);return l!==null?(t.stderr.write(`error: ${l}
|
|
1601
1601
|
`),2):(i.setConfig(o,a),t.stdout.write(`${o} = ${C_(o,a,!1)}
|
|
1602
1602
|
`),0)}if(r==="list"){let o=!1;for(let c of n){if(c==="--show-secrets"){o=!0;continue}return t.stderr.write(`error: unknown flag: ${c}
|
|
1603
1603
|
`),2}let a=i.getConfigAll(),l=Object.keys(a).sort();if(l.length===0)return t.stdout.write(`(no config rows)
|
|
1604
1604
|
`),0;for(let c of l)t.stdout.write(`${c} = ${C_(c,a[c],o)}
|
|
1605
1605
|
`);return 0}return t.stderr.write(`error: unknown api config verb: ${r}
|
|
1606
|
-
`),2}finally{s&&i.close()}}async function Ux(e,t,r){if(
|
|
1606
|
+
`),2}finally{s&&i.close()}}async function Ux(e,t,r){if(Yi(e))return t.stdout.write(`${Wx}
|
|
1607
1607
|
`),0;let n=G_(e,"--direct"),s=r||n.present,i=n.rest,[o,...a]=i;return o===void 0?(t.stderr.write(`usage: lmctl api escalations <list|show|respond>
|
|
1608
1608
|
`),2):s?Jx(o,a,t):o==="list"?Gx(a,t):o==="show"?Kx(a,t):o==="respond"?Yx(a,t):(t.stderr.write(`error: unknown api escalations verb: ${o}
|
|
1609
|
-
`),2)}function
|
|
1609
|
+
`),2)}function Yi(e){return e.some(t=>t==="--help"||t==="-h")}function Jx(e,t,r){let n=r.dal===void 0,s=r.dal??Ie({path:le()});try{return V_(s,[e,...t],r)}finally{n&&s.close()}}function F_(e){let t,r=!1,n=!1,s;for(let o=0;o<e.length;o+=1){let a=e[o];if(a==="--json"){r=!0;continue}if(a==="--all"){n=!0;continue}if(a==="--project"){let l=e[++o];if(l===void 0||l.startsWith("--"))return"missing value for --project";t=l;continue}if(a==="--since"){let l=e[++o];if(l===void 0||l.startsWith("--"))return"missing value for --since";let c=Xx(l);if(typeof c=="object"&&"error"in c)return c.error;s=c.iso;continue}return re(a)}let i={json:r,all:n};return t!==void 0&&(i.project=t),s!==void 0&&(i.since=s),i}function Xx(e){let t=/^(\d+)([smhd])$/.exec(e);if(t!==null){let n=Number(t[1]),s=t[2],i=s==="s"?n:s==="m"?n*60:s==="h"?n*3600:n*86400;return{iso:new Date(Date.now()-i*1e3).toISOString()}}let r=Date.parse(e);return Number.isNaN(r)?{error:`invalid --since value: ${e} (expected ISO8601 or duration like 24h)`}:{iso:new Date(r).toISOString()}}async function Gx(e,t){let r=F_(e);if(typeof r=="string")return t.stderr.write(`error: ${r}
|
|
1610
1610
|
`),2;let n=Or(t),s=dr("application/json",n.token),i=new URLSearchParams;r.project!==void 0&&i.set("project",r.project),r.all&&i.set("all","true"),r.since!==void 0&&i.set("since",r.since);let o=i.toString().length>0?`?${i.toString()}`:"",a;try{a=await fetch(new URL(`/api/escalations${o}`,n.baseUrl),{method:"GET",headers:s})}catch(c){return t.stderr.write(`error: network failure: ${c instanceof Error?c.message:String(c)}
|
|
1611
1611
|
`),1}if(!a.ok)return t.stderr.write(`error: HTTP ${a.status}: ${await a.text()}
|
|
1612
1612
|
`),a.status===400?2:1;let l=await a.json();return U_(l,r.json,t)}function U_(e,t,r){if(t)return r.stdout.write(`${JSON.stringify(e,null,2)}
|
|
@@ -1632,7 +1632,7 @@ ${r}`:r}function gp(e,t){let r=DN[t.tool];return r?new Promise((n,s)=>{let i=t.b
|
|
|
1632
1632
|
`),1;if(!d.ok){let f=await d.text();return t.stderr.write(`error: HTTP ${d.status}: ${f}
|
|
1633
1633
|
`),d.status===400?2:1}let u=await d.json();return r?t.stdout.write(`${JSON.stringify(u,null,2)}
|
|
1634
1634
|
`):t.stdout.write(`ok: attention ${i} acknowledged; step ${u.step_id} resumed (session_status=${String(u.session_status)})
|
|
1635
|
-
`),0}function C_(e,t,r){return e!=="api.token"||r?t:t.length<=8?"***":`${t.slice(0,8)}\u2026(masked; use --show-secrets to reveal)`}function zx(e,t){if(t.length===0)return`${e} value must be non-empty`;if(e==="api.port"){let r=Number(t);if(!Number.isInteger(r)||r<=0||r>65535)return`invalid api.port: ${t}`}if(e==="api.url")try{new URL(t)}catch{return`invalid api.url: ${t}`}if(e===Mi||e===ji){let r=Number(t);if(!Number.isInteger(r)||r<=0)return`invalid ${e}: ${t}`}return null}function Zx(e,t){let r=Ox(e),n=r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength),s=new FormData;return s.append("image",new Blob([n],{type:Qx(e)}),$x(e)),t!==void 0&&s.append("project",t),s}function Qx(e){switch(Cx(e).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 eA(e){if(e!==null&&typeof e=="object"&&!Array.isArray(e)){let t=e.id;return typeof t=="number"&&Number.isInteger(t)?t:null}return null}function tA(e,t){let[r,...n]=e;if(r===void 0)return"usage: lmctl api pr <id|list|get>";if(r==="list")return os(n,"--status","/api/submitted-prs","status",t);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:t}:{method:"GET",path:`/api/submitted-prs?pr_url=${encodeURIComponent(s)}`,accept:"application/json",json:t}}return/^\d+$/.test(r)?{method:"GET",path:`/api/submitted-prs/${r}`,accept:"application/json",json:t}:`usage: lmctl api pr <id|list|get>; got: ${r}`}function W_(e){let t=[],r="json";for(let n of e)n==="--json"?r="json":n==="--text"?r="text":t.push(n);return{args:t,format:r}}function Vi(e,t,r){return e.length>0?re(e[0]):{method:"GET",path:t,accept:r?"application/json":"text/html",json:r}}function os(e,t,r,n,s,i=!1){let o;for(let l=0;l<e.length;l+=1){let c=e[l];if(c!==t)return re(c);let d=e[++l];if(d===void 0||d.startsWith("--"))return`missing value for ${t}`;if(i&&(!/^\d+$/.test(d)||Number(d)<=0))return`invalid ${t}: ${d}`;o=d}let a=o===void 0?"":`?${n}=${encodeURIComponent(o)}`;return{method:"GET",path:`${r}${a}`,accept:s?"application/json":"text/html",json:s}}function M_(e,t,r,n,s){let i=!1;for(let o of e){if(o!==t)return re(o);i=!0}return{method:"GET",path:`${r}${i?`?${n}=true`:""}`,accept:s?"application/json":"text/html",json:s}}function rA(e,t,r){if(e.length!==1)return`usage: lmctl api ${r} <id>`;let n=ne(e[0],"id");return typeof n=="string"?n:{method:"GET",path:`${t}/${n}`,accept:"application/json",json:!0}}function nA(e,t){let[r,...n]=e;if(r!==void 0&&n.length===0&&r!=="enqueue"&&r!=="run")return rA([r],"/api/jobs","job");if(r==="enqueue"){let s,i,o="manual",a,l,c;for(let u=0;u<n.length;u+=1){let f=n[u],m=n[++u];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}`;i=p}else if(f==="--source")o=m;else if(f==="--payload")a=m;else if(f==="--dedupe-key")l=m;else if(f==="--priority"){let p=Number(m);if(!Number.isInteger(p))return`invalid --priority: ${m}`;c=p}else return re(f)}if(s===void 0&&i===void 0)return"usage: lmctl api job enqueue (--project NAME | --project-id ID) [--source S] [--payload JSON] [--dedupe-key K] [--priority N]";let d={source:o};return s!==void 0&&(d.project=s),i!==void 0&&(d.project_id=i),a!==void 0&&(d.payload=Nc(a)),l!==void 0&&(d.dedupe_key=l),c!==void 0&&(d.priority=c),{method:"POST",path:"/api/jobs",accept:"application/json",json:t,body:JSON.stringify(d)}}if(r==="run"){if(n.length!==1)return"usage: lmctl api job run <id>";let s=ne(n[0],"id");return typeof s=="string"?s:{method:"POST",path:`/api/jobs/${s}/run`,accept:"application/json",json:t}}return"usage: lmctl api job <id|enqueue|run>"}function sA(e,t){let[r,...n]=e;if(r==="list"){let[s,...i]=n;if(s===void 0||s.startsWith("--"))return"usage: lmctl api issues list <project> [--status STATUS] [--severity SEVERITY] [--ai-test-path P]";let o=new URLSearchParams;for(let l=0;l<i.length;l+=1){let c=i[l],d=i[++l];if(d===void 0||d.startsWith("--"))return`missing value for ${c}`;if(c==="--status")o.set("status",d);else if(c==="--severity")o.set("severity",d);else if(c==="--ai-test-path")o.set("ai_test_path",d);else return re(c)}let a=o.toString();return{method:"GET",path:`/api/projects/${encodeURIComponent(s)}/issues${a.length>0?`?${a}`:""}`,accept:t?"application/json":"text/html",json:t}}if(r==="show"){if(n.length!==1)return"usage: lmctl api issues show <id>";let s=ne(n[0],"id");return typeof s=="string"?s:{method:"GET",path:`/api/issues/${s}`,accept:"application/json",json:t}}return r==="create"?B_(n,t):r==="claim"?q_(n,t):r==="claim-next"?H_(n,t):r==="close"?J_(n,t):r==="reopen"?X_(n,t):"usage: lmctl api issues <list|show|create|claim|claim-next|close|reopen>"}function B_(e,t){let[r,...n]=e;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"]),i={};for(let o=0;o<n.length;o+=1){let a=n[o],l=n[++o];if(l===void 0)return`missing value for ${a}`;if(!s.has(a)&&l.startsWith("--"))return`missing value for ${a}`;if(a==="--title")i.title=l;else if(a==="--body")i.body=l;else if(a==="--severity")i.severity=l;else if(a==="--labels")i.labels=Nc(l);else if(a==="--ai-test-path")i.ai_test_path=l;else if(a==="--source-run-id"){let c=ne(l,"--source-run-id");if(typeof c=="string")return c;i.source_run_id=c}else return re(a)}return typeof i.title!="string"?"missing value for --title":typeof i.body!="string"?"missing value for --body":{method:"POST",path:`/api/projects/${encodeURIComponent(r)}/issues`,accept:"application/json",json:t,body:JSON.stringify(i)}}function q_(e,t){let[r,...n]=e;if(r===void 0)return"usage: lmctl api issues claim <id> --assigned-run-id RUN";let s=ne(r,"id");if(typeof s=="string")return s;let i={};for(let o=0;o<n.length;o+=1){let a=n[o],l=n[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--assigned-run-id"){let c=ne(l,"--assigned-run-id");if(typeof c=="string")return c;i.assigned_run_id=c}else return re(a)}return typeof i.assigned_run_id!="number"?"missing value for --assigned-run-id":{method:"POST",path:`/api/issues/${s}/claim`,accept:"application/json",json:t,body:JSON.stringify(i)}}function H_(e,t){let[r,...n]=e;if(r===void 0||r.startsWith("--"))return"usage: lmctl api issues claim-next <project> --assigned-run-id RUN";let s={};for(let i=0;i<n.length;i+=1){let o=n[i],a=n[++i];if(a===void 0||a.startsWith("--"))return`missing value for ${o}`;if(o==="--assigned-run-id"){let l=ne(a,"--assigned-run-id");if(typeof l=="string")return l;s.assigned_run_id=l}else return re(o)}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:t,body:JSON.stringify(s)}}function J_(e,t){let[r,...n]=e;if(r===void 0)return"usage: lmctl api issues close <id> [--commit-hash SHA] [--closed-run-id RUN]";let s=ne(r,"id");if(typeof s=="string")return s;let i={};for(let o=0;o<n.length;o+=1){let a=n[o],l=n[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--commit-hash")i.commit_hash=l;else if(a==="--closed-run-id"){let c=ne(l,"--closed-run-id");if(typeof c=="string")return c;i.closed_run_id=c}else return re(a)}return{method:"POST",path:`/api/issues/${s}/close`,accept:"application/json",json:t,body:JSON.stringify(i)}}function X_(e,t){let[r,...n]=e;if(r===void 0)return"usage: lmctl api issues reopen <id> [--source-run-id RUN]";let s=ne(r,"id");if(typeof s=="string")return s;let i={};for(let o=0;o<n.length;o+=1){let a=n[o],l=n[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--source-run-id"){let c=ne(l,"--source-run-id");if(typeof c=="string")return c;i.source_run_id=c}else return re(a)}return{method:"POST",path:`/api/issues/${s}/reopen`,accept:"application/json",json:t,body:JSON.stringify(i)}}function iA(e,t){let[r,...n]=e;if(r===void 0||r.startsWith("--"))return"usage: lmctl api upload <file> [--project NAME] [--json]";let s;for(let i=0;i<n.length;i+=1){let o=n[i];if(o!=="--project")return re(o);let a=n[++i];if(a===void 0||a.startsWith("--"))return"missing value for --project";s=a}return{method:"POST",path:"/api/uploads",accept:"application/json",json:t,upload:{filePath:r,project:s}}}function oA(e,t){let r,n,s,i;for(let a=0;a<e.length;a+=1){let l=e[a],c=e[++a];if(c===void 0||c.startsWith("--"))return`missing value for ${l}`;if(l==="--workflow")r=c;else if(l==="--workflow-id-override"){let d=Number(c);if(!Number.isInteger(d)||d<=0)return`invalid --workflow-id-override: ${c}`;n=d}else if(l==="--project")s=c;else if(l==="--inputs")try{let d=JSON.parse(c);if(d===null||typeof d!="object"||Array.isArray(d))return"--inputs must be a JSON object";i=d}catch{return"invalid --inputs JSON"}else return re(l)}if(r===void 0&&n===void 0)return"missing value for --workflow";if(i===void 0)return"missing value for --inputs";let o={source:"api-submit-job",payload:i};return r!==void 0&&(o.workflow=r),n!==void 0&&(o.workflow_id_override=n),s!==void 0&&(o.project=s),{method:"POST",path:"/api/jobs",accept:"application/json",json:t,body:JSON.stringify(o),runAfterSubmit:!0}}function Nc(e){try{return JSON.parse(e)}catch{return e}}function aA(e,t){let[r,n]=e;return r!=="show"||n===void 0||e.length!==2?"usage: lmctl api workflow show <name>":{method:"GET",path:`/api/workflows/${encodeURIComponent(n)}`,accept:"application/json",json:t}}function lA(e,t){for(let r of e)if(!(r==="--json"||r==="--text"))return re(r);return{method:"GET",path:"/api/workflows/verify",accept:t==="text"?"text/plain":"application/json",json:t!=="text"}}function cA(e,t){let[r,n,...s]=e;return r==="workflow"?dA([n,...s].filter(i=>i!==void 0),t):r!=="show"||n===void 0||e.length!==2?"usage: lmctl api project <show|workflow>":{method:"GET",path:`/api/projects/${encodeURIComponent(n)}`,accept:"application/json",json:t}}function dA(e,t){let[r,...n]=e;if(r==="list")return n.length!==1?"usage: lmctl api project workflow list <project>":{method:"GET",path:`/api/projects/${encodeURIComponent(n[0])}/workflows`,accept:t?"application/json":"text/html",json:t};if(r==="show"){if(n.length!==1)return"usage: lmctl api project workflow show <id>";let s=ne(n[0],"id");return typeof s=="string"?s:{method:"GET",path:`/api/projects/workflows/${s}`,accept:t?"application/json":"text/html",json:t}}if(r==="remove"||r==="enable"||r==="disable"){if(n.length!==1)return`usage: lmctl api project workflow ${r} <id>`;let s=ne(n[0],"id");if(typeof s=="string")return s;let i=r==="remove"?"DELETE":"POST",o=r==="remove"?"":`/${r}`;return{method:i,path:`/api/projects/workflows/${s}${o}`,accept:"application/json",json:t}}if(r==="add"){let s=uA(n);return typeof s=="string"?s:{method:"POST",path:`/api/projects/${encodeURIComponent(s.project)}/workflows`,accept:"application/json",json:t,body:JSON.stringify(s.body)}}return"usage: lmctl api project workflow <add|list|show|remove|enable|disable>"}function uA(e){let[t,r,...n]=e;if(t===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 i=0;i<n.length;i+=1){let o=n[i],a=n[++i];if(a===void 0||a.startsWith("--"))return`missing value for ${o}`;if(o==="--condition")s.condition=a;else if(o==="--params")s.params=Nc(a);else if(o==="--priority"){let l=Number(a);if(!Number.isInteger(l))return`invalid --priority: ${a}`;s.priority=l}else return re(o)}return{project:t,body:s}}function fA(e,t){if(e[0]!=="get")return"usage: lmctl api artifact get --run R --kind K [--raw]";let r,n,s=!1;for(let o=1;o<e.length;o+=1){let a=e[o];if(a==="--raw"){s=!0;continue}let l=e[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--run"){let c=ne(l,"run");if(typeof c=="string")return c;r=c}else if(a==="--kind")n=l;else return re(a)}return r===void 0||n===void 0?"usage: lmctl api artifact get --run R --kind K [--raw]":{method:"GET",path:`/api/runs/${r}/artifacts/${encodeURIComponent(n)}${s?"?raw=true":""}`,accept:s?"text/plain":"application/json",json:!s&&t}}function mA(e,t){if(e[0]!=="ack"||e.length!==2)return"usage: lmctl api attention ack <id>";let r=ne(e[1],"id");return typeof r=="string"?r:{method:"POST",path:`/api/attentions/${r}/ack`,accept:t?"application/json":"text/html",json:t}}function pA(e,t){return e.length!==1||e[0]!=="run-throughput"?"usage: lmctl api stats run-throughput":{method:"GET",path:"/api/stats/run-throughput",accept:t?"application/json":"text/html",json:t}}function _A(e,t){return e.length!==1||e[0]!=="state"&&e[0]!=="cycle"?"usage: lmctl api daemon <state|cycle>":{method:e[0]==="cycle"?"POST":"GET",path:e[0]==="cycle"?"/api/daemon/cycle":"/api/daemon/state",accept:t?"application/json":"text/html",json:t}}function hA(e,t){return e.length!==1||e[0]!=="state"&&e[0]!=="scan"?"usage: lmctl api intake <state|scan>":{method:e[0]==="scan"?"POST":"GET",path:e[0]==="scan"?"/api/intake/scan":"/api/intake/state",accept:t?"application/json":"text/html",json:t}}function gA(e,t){let r=e[0];if(r==="list")return e.length!==1?"usage: lmctl api session list":{method:"GET",path:"/api/sessions",accept:t?"application/json":"text/html",json:t};if(r==="history"||r==="compact"||r==="refresh"){if(e.length!==3)return`usage: lmctl api session ${r} <team_name> <alias>`;let n=$i(e[1]),s=encodeURIComponent(e[2]);return{method:r==="history"?"GET":"POST",path:`/api/sessions/${n}/${s}/${r}`,accept:t?"application/json":"text/html",json:t}}return"usage: lmctl api session <list|history|compact|refresh>"}function yA(e,t){let[r,n,s,i]=e;if(r!==void 0&&/^\d+$/.test(r)&&n===void 0){let o=ne(r,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}`,accept:"application/json",json:t!=="text"}}if(r==="resume"){if(n===void 0)return"usage: lmctl api run resume <run_id> --outcome <value>";let o=ne(n,"run_id");if(typeof o=="string")return o;let a;for(let l=2;l<e.length;l+=1){let c=e[l];if(c!=="--outcome")return re(c);let d=e[++l];if(d===void 0||d.startsWith("--"))return"missing value for --outcome";a=d}return a===void 0?"missing value for --outcome":{method:"POST",path:`/api/runs/${o}/resume?outcome=${encodeURIComponent(a)}`,accept:t==="text"?"text/html":"application/json",json:t!=="text"}}if(r==="get"){if(n===void 0||s!==void 0)return"usage: lmctl api run get <run_id>";let o=ne(n,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}`,accept:"application/json",json:t!=="text"}}if(r==="step"||r==="transcript"||r==="messages"){if(n===void 0||s===void 0||i!==void 0)return`usage: lmctl api run ${r} <run_id> <step_id>`;let o=ne(n,"run_id");if(typeof o=="string")return o;let a=ne(s,"step_id");if(typeof a=="string")return a;let l=r==="step"?"":`/${r}`,c=r==="transcript"&&t==="text";return{method:"GET",path:`/api/runs/${o}/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 o=ne(n,"run_id");if(typeof o=="string")return o;let a;for(let c=2;c<e.length;c+=1){let d=e[c];if(d!=="--kind")return re(d);let u=e[++c];if(u===void 0)return"missing value for --kind";a=u}let l=a===void 0?"":`?kind=${encodeURIComponent(a)}`;return{method:"GET",path:`/api/runs/${o}/artifacts${l}`,accept:"application/json",json:t!=="text"}}if(r==="where"){if(n===void 0||s!==void 0)return"usage: lmctl api run where <run_id>";let o=ne(n,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}/where`,accept:t==="text"?"text/plain":"application/json",json:t!=="text"}}if(r==="timeline"){if(n===void 0||s!==void 0)return"usage: lmctl api run timeline <run_id>";let o=ne(n,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}/timeline`,accept:t==="text"?"text/plain":"application/json",json:t!=="text"}}return"usage: lmctl api run <id|get|step|transcript|messages|resume|artifacts|where|timeline>"}function ne(e,t){return e===void 0||e.startsWith("--")?`missing value for ${t}`:!/^\d+$/.test(e)||Number(e)<=0?`invalid ${t}: ${e}`:Number(e)}function re(e){return e.startsWith("--")?`unknown flag: ${e}`:`unknown argument: ${e}`}function G_(e,t){let r=[],n=!1;for(let s of e){if(s===t){n=!0;continue}r.push(s)}return{rest:r,present:n}}async function wA(e,t){let r=W_(e);if(typeof r=="string")return t.stderr.write(`error: ${r}
|
|
1635
|
+
`),0}function C_(e,t,r){return e!=="api.token"||r?t:t.length<=8?"***":`${t.slice(0,8)}\u2026(masked; use --show-secrets to reveal)`}function zx(e,t){if(t.length===0)return`${e} value must be non-empty`;if(e==="api.port"){let r=Number(t);if(!Number.isInteger(r)||r<=0||r>65535)return`invalid api.port: ${t}`}if(e==="api.url")try{new URL(t)}catch{return`invalid api.url: ${t}`}if(e===ji||e===Di){let r=Number(t);if(!Number.isInteger(r)||r<=0)return`invalid ${e}: ${t}`}return null}function Zx(e,t){let r=Ox(e),n=r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength),s=new FormData;return s.append("image",new Blob([n],{type:Qx(e)}),$x(e)),t!==void 0&&s.append("project",t),s}function Qx(e){switch(Cx(e).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 eA(e){if(e!==null&&typeof e=="object"&&!Array.isArray(e)){let t=e.id;return typeof t=="number"&&Number.isInteger(t)?t:null}return null}function tA(e,t){let[r,...n]=e;if(r===void 0)return"usage: lmctl api pr <id|list|get>";if(r==="list")return os(n,"--status","/api/submitted-prs","status",t);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:t}:{method:"GET",path:`/api/submitted-prs?pr_url=${encodeURIComponent(s)}`,accept:"application/json",json:t}}return/^\d+$/.test(r)?{method:"GET",path:`/api/submitted-prs/${r}`,accept:"application/json",json:t}:`usage: lmctl api pr <id|list|get>; got: ${r}`}function W_(e){let t=[],r="json";for(let n of e)n==="--json"?r="json":n==="--text"?r="text":t.push(n);return{args:t,format:r}}function Ki(e,t,r){return e.length>0?re(e[0]):{method:"GET",path:t,accept:r?"application/json":"text/html",json:r}}function os(e,t,r,n,s,i=!1){let o;for(let l=0;l<e.length;l+=1){let c=e[l];if(c!==t)return re(c);let d=e[++l];if(d===void 0||d.startsWith("--"))return`missing value for ${t}`;if(i&&(!/^\d+$/.test(d)||Number(d)<=0))return`invalid ${t}: ${d}`;o=d}let a=o===void 0?"":`?${n}=${encodeURIComponent(o)}`;return{method:"GET",path:`${r}${a}`,accept:s?"application/json":"text/html",json:s}}function M_(e,t,r,n,s){let i=!1;for(let o of e){if(o!==t)return re(o);i=!0}return{method:"GET",path:`${r}${i?`?${n}=true`:""}`,accept:s?"application/json":"text/html",json:s}}function rA(e,t,r){if(e.length!==1)return`usage: lmctl api ${r} <id>`;let n=ne(e[0],"id");return typeof n=="string"?n:{method:"GET",path:`${t}/${n}`,accept:"application/json",json:!0}}function nA(e,t){let[r,...n]=e;if(r!==void 0&&n.length===0&&r!=="enqueue"&&r!=="run")return rA([r],"/api/jobs","job");if(r==="enqueue"){let s,i,o="manual",a,l,c;for(let u=0;u<n.length;u+=1){let f=n[u],m=n[++u];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}`;i=p}else if(f==="--source")o=m;else if(f==="--payload")a=m;else if(f==="--dedupe-key")l=m;else if(f==="--priority"){let p=Number(m);if(!Number.isInteger(p))return`invalid --priority: ${m}`;c=p}else return re(f)}if(s===void 0&&i===void 0)return"usage: lmctl api job enqueue (--project NAME | --project-id ID) [--source S] [--payload JSON] [--dedupe-key K] [--priority N]";let d={source:o};return s!==void 0&&(d.project=s),i!==void 0&&(d.project_id=i),a!==void 0&&(d.payload=Nc(a)),l!==void 0&&(d.dedupe_key=l),c!==void 0&&(d.priority=c),{method:"POST",path:"/api/jobs",accept:"application/json",json:t,body:JSON.stringify(d)}}if(r==="run"){if(n.length!==1)return"usage: lmctl api job run <id>";let s=ne(n[0],"id");return typeof s=="string"?s:{method:"POST",path:`/api/jobs/${s}/run`,accept:"application/json",json:t}}return"usage: lmctl api job <id|enqueue|run>"}function sA(e,t){let[r,...n]=e;if(r==="list"){let[s,...i]=n;if(s===void 0||s.startsWith("--"))return"usage: lmctl api issues list <project> [--status STATUS] [--severity SEVERITY] [--ai-test-path P]";let o=new URLSearchParams;for(let l=0;l<i.length;l+=1){let c=i[l],d=i[++l];if(d===void 0||d.startsWith("--"))return`missing value for ${c}`;if(c==="--status")o.set("status",d);else if(c==="--severity")o.set("severity",d);else if(c==="--ai-test-path")o.set("ai_test_path",d);else return re(c)}let a=o.toString();return{method:"GET",path:`/api/projects/${encodeURIComponent(s)}/issues${a.length>0?`?${a}`:""}`,accept:t?"application/json":"text/html",json:t}}if(r==="show"){if(n.length!==1)return"usage: lmctl api issues show <id>";let s=ne(n[0],"id");return typeof s=="string"?s:{method:"GET",path:`/api/issues/${s}`,accept:"application/json",json:t}}return r==="create"?B_(n,t):r==="claim"?q_(n,t):r==="claim-next"?H_(n,t):r==="close"?J_(n,t):r==="reopen"?X_(n,t):"usage: lmctl api issues <list|show|create|claim|claim-next|close|reopen>"}function B_(e,t){let[r,...n]=e;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"]),i={};for(let o=0;o<n.length;o+=1){let a=n[o],l=n[++o];if(l===void 0)return`missing value for ${a}`;if(!s.has(a)&&l.startsWith("--"))return`missing value for ${a}`;if(a==="--title")i.title=l;else if(a==="--body")i.body=l;else if(a==="--severity")i.severity=l;else if(a==="--labels")i.labels=Nc(l);else if(a==="--ai-test-path")i.ai_test_path=l;else if(a==="--source-run-id"){let c=ne(l,"--source-run-id");if(typeof c=="string")return c;i.source_run_id=c}else return re(a)}return typeof i.title!="string"?"missing value for --title":typeof i.body!="string"?"missing value for --body":{method:"POST",path:`/api/projects/${encodeURIComponent(r)}/issues`,accept:"application/json",json:t,body:JSON.stringify(i)}}function q_(e,t){let[r,...n]=e;if(r===void 0)return"usage: lmctl api issues claim <id> --assigned-run-id RUN";let s=ne(r,"id");if(typeof s=="string")return s;let i={};for(let o=0;o<n.length;o+=1){let a=n[o],l=n[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--assigned-run-id"){let c=ne(l,"--assigned-run-id");if(typeof c=="string")return c;i.assigned_run_id=c}else return re(a)}return typeof i.assigned_run_id!="number"?"missing value for --assigned-run-id":{method:"POST",path:`/api/issues/${s}/claim`,accept:"application/json",json:t,body:JSON.stringify(i)}}function H_(e,t){let[r,...n]=e;if(r===void 0||r.startsWith("--"))return"usage: lmctl api issues claim-next <project> --assigned-run-id RUN";let s={};for(let i=0;i<n.length;i+=1){let o=n[i],a=n[++i];if(a===void 0||a.startsWith("--"))return`missing value for ${o}`;if(o==="--assigned-run-id"){let l=ne(a,"--assigned-run-id");if(typeof l=="string")return l;s.assigned_run_id=l}else return re(o)}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:t,body:JSON.stringify(s)}}function J_(e,t){let[r,...n]=e;if(r===void 0)return"usage: lmctl api issues close <id> [--commit-hash SHA] [--closed-run-id RUN]";let s=ne(r,"id");if(typeof s=="string")return s;let i={};for(let o=0;o<n.length;o+=1){let a=n[o],l=n[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--commit-hash")i.commit_hash=l;else if(a==="--closed-run-id"){let c=ne(l,"--closed-run-id");if(typeof c=="string")return c;i.closed_run_id=c}else return re(a)}return{method:"POST",path:`/api/issues/${s}/close`,accept:"application/json",json:t,body:JSON.stringify(i)}}function X_(e,t){let[r,...n]=e;if(r===void 0)return"usage: lmctl api issues reopen <id> [--source-run-id RUN]";let s=ne(r,"id");if(typeof s=="string")return s;let i={};for(let o=0;o<n.length;o+=1){let a=n[o],l=n[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--source-run-id"){let c=ne(l,"--source-run-id");if(typeof c=="string")return c;i.source_run_id=c}else return re(a)}return{method:"POST",path:`/api/issues/${s}/reopen`,accept:"application/json",json:t,body:JSON.stringify(i)}}function iA(e,t){let[r,...n]=e;if(r===void 0||r.startsWith("--"))return"usage: lmctl api upload <file> [--project NAME] [--json]";let s;for(let i=0;i<n.length;i+=1){let o=n[i];if(o!=="--project")return re(o);let a=n[++i];if(a===void 0||a.startsWith("--"))return"missing value for --project";s=a}return{method:"POST",path:"/api/uploads",accept:"application/json",json:t,upload:{filePath:r,project:s}}}function oA(e,t){let r,n,s,i;for(let a=0;a<e.length;a+=1){let l=e[a],c=e[++a];if(c===void 0||c.startsWith("--"))return`missing value for ${l}`;if(l==="--workflow")r=c;else if(l==="--workflow-id-override"){let d=Number(c);if(!Number.isInteger(d)||d<=0)return`invalid --workflow-id-override: ${c}`;n=d}else if(l==="--project")s=c;else if(l==="--inputs")try{let d=JSON.parse(c);if(d===null||typeof d!="object"||Array.isArray(d))return"--inputs must be a JSON object";i=d}catch{return"invalid --inputs JSON"}else return re(l)}if(r===void 0&&n===void 0)return"missing value for --workflow";if(i===void 0)return"missing value for --inputs";let o={source:"api-submit-job",payload:i};return r!==void 0&&(o.workflow=r),n!==void 0&&(o.workflow_id_override=n),s!==void 0&&(o.project=s),{method:"POST",path:"/api/jobs",accept:"application/json",json:t,body:JSON.stringify(o),runAfterSubmit:!0}}function Nc(e){try{return JSON.parse(e)}catch{return e}}function aA(e,t){let[r,n]=e;return r!=="show"||n===void 0||e.length!==2?"usage: lmctl api workflow show <name>":{method:"GET",path:`/api/workflows/${encodeURIComponent(n)}`,accept:"application/json",json:t}}function lA(e,t){for(let r of e)if(!(r==="--json"||r==="--text"))return re(r);return{method:"GET",path:"/api/workflows/verify",accept:t==="text"?"text/plain":"application/json",json:t!=="text"}}function cA(e,t){let[r,n,...s]=e;return r==="workflow"?dA([n,...s].filter(i=>i!==void 0),t):r!=="show"||n===void 0||e.length!==2?"usage: lmctl api project <show|workflow>":{method:"GET",path:`/api/projects/${encodeURIComponent(n)}`,accept:"application/json",json:t}}function dA(e,t){let[r,...n]=e;if(r==="list")return n.length!==1?"usage: lmctl api project workflow list <project>":{method:"GET",path:`/api/projects/${encodeURIComponent(n[0])}/workflows`,accept:t?"application/json":"text/html",json:t};if(r==="show"){if(n.length!==1)return"usage: lmctl api project workflow show <id>";let s=ne(n[0],"id");return typeof s=="string"?s:{method:"GET",path:`/api/projects/workflows/${s}`,accept:t?"application/json":"text/html",json:t}}if(r==="remove"||r==="enable"||r==="disable"){if(n.length!==1)return`usage: lmctl api project workflow ${r} <id>`;let s=ne(n[0],"id");if(typeof s=="string")return s;let i=r==="remove"?"DELETE":"POST",o=r==="remove"?"":`/${r}`;return{method:i,path:`/api/projects/workflows/${s}${o}`,accept:"application/json",json:t}}if(r==="add"){let s=uA(n);return typeof s=="string"?s:{method:"POST",path:`/api/projects/${encodeURIComponent(s.project)}/workflows`,accept:"application/json",json:t,body:JSON.stringify(s.body)}}return"usage: lmctl api project workflow <add|list|show|remove|enable|disable>"}function uA(e){let[t,r,...n]=e;if(t===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 i=0;i<n.length;i+=1){let o=n[i],a=n[++i];if(a===void 0||a.startsWith("--"))return`missing value for ${o}`;if(o==="--condition")s.condition=a;else if(o==="--params")s.params=Nc(a);else if(o==="--priority"){let l=Number(a);if(!Number.isInteger(l))return`invalid --priority: ${a}`;s.priority=l}else return re(o)}return{project:t,body:s}}function fA(e,t){if(e[0]!=="get")return"usage: lmctl api artifact get --run R --kind K [--raw]";let r,n,s=!1;for(let o=1;o<e.length;o+=1){let a=e[o];if(a==="--raw"){s=!0;continue}let l=e[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--run"){let c=ne(l,"run");if(typeof c=="string")return c;r=c}else if(a==="--kind")n=l;else return re(a)}return r===void 0||n===void 0?"usage: lmctl api artifact get --run R --kind K [--raw]":{method:"GET",path:`/api/runs/${r}/artifacts/${encodeURIComponent(n)}${s?"?raw=true":""}`,accept:s?"text/plain":"application/json",json:!s&&t}}function mA(e,t){if(e[0]!=="ack"||e.length!==2)return"usage: lmctl api attention ack <id>";let r=ne(e[1],"id");return typeof r=="string"?r:{method:"POST",path:`/api/attentions/${r}/ack`,accept:t?"application/json":"text/html",json:t}}function pA(e,t){return e.length!==1||e[0]!=="run-throughput"?"usage: lmctl api stats run-throughput":{method:"GET",path:"/api/stats/run-throughput",accept:t?"application/json":"text/html",json:t}}function _A(e,t){return e.length!==1||e[0]!=="state"&&e[0]!=="cycle"?"usage: lmctl api daemon <state|cycle>":{method:e[0]==="cycle"?"POST":"GET",path:e[0]==="cycle"?"/api/daemon/cycle":"/api/daemon/state",accept:t?"application/json":"text/html",json:t}}function hA(e,t){return e.length!==1||e[0]!=="state"&&e[0]!=="scan"?"usage: lmctl api intake <state|scan>":{method:e[0]==="scan"?"POST":"GET",path:e[0]==="scan"?"/api/intake/scan":"/api/intake/state",accept:t?"application/json":"text/html",json:t}}function gA(e,t){let r=e[0];if(r==="list")return e.length!==1?"usage: lmctl api session list":{method:"GET",path:"/api/sessions",accept:t?"application/json":"text/html",json:t};if(r==="history"||r==="compact"||r==="refresh"){if(e.length!==3)return`usage: lmctl api session ${r} <team_name> <alias>`;let n=Ci(e[1]),s=encodeURIComponent(e[2]);return{method:r==="history"?"GET":"POST",path:`/api/sessions/${n}/${s}/${r}`,accept:t?"application/json":"text/html",json:t}}return"usage: lmctl api session <list|history|compact|refresh>"}function yA(e,t){let[r,n,s,i]=e;if(r!==void 0&&/^\d+$/.test(r)&&n===void 0){let o=ne(r,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}`,accept:"application/json",json:t!=="text"}}if(r==="resume"){if(n===void 0)return"usage: lmctl api run resume <run_id> --outcome <value>";let o=ne(n,"run_id");if(typeof o=="string")return o;let a;for(let l=2;l<e.length;l+=1){let c=e[l];if(c!=="--outcome")return re(c);let d=e[++l];if(d===void 0||d.startsWith("--"))return"missing value for --outcome";a=d}return a===void 0?"missing value for --outcome":{method:"POST",path:`/api/runs/${o}/resume?outcome=${encodeURIComponent(a)}`,accept:t==="text"?"text/html":"application/json",json:t!=="text"}}if(r==="get"){if(n===void 0||s!==void 0)return"usage: lmctl api run get <run_id>";let o=ne(n,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}`,accept:"application/json",json:t!=="text"}}if(r==="step"||r==="transcript"||r==="messages"){if(n===void 0||s===void 0||i!==void 0)return`usage: lmctl api run ${r} <run_id> <step_id>`;let o=ne(n,"run_id");if(typeof o=="string")return o;let a=ne(s,"step_id");if(typeof a=="string")return a;let l=r==="step"?"":`/${r}`,c=r==="transcript"&&t==="text";return{method:"GET",path:`/api/runs/${o}/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 o=ne(n,"run_id");if(typeof o=="string")return o;let a;for(let c=2;c<e.length;c+=1){let d=e[c];if(d!=="--kind")return re(d);let u=e[++c];if(u===void 0)return"missing value for --kind";a=u}let l=a===void 0?"":`?kind=${encodeURIComponent(a)}`;return{method:"GET",path:`/api/runs/${o}/artifacts${l}`,accept:"application/json",json:t!=="text"}}if(r==="where"){if(n===void 0||s!==void 0)return"usage: lmctl api run where <run_id>";let o=ne(n,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}/where`,accept:t==="text"?"text/plain":"application/json",json:t!=="text"}}if(r==="timeline"){if(n===void 0||s!==void 0)return"usage: lmctl api run timeline <run_id>";let o=ne(n,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}/timeline`,accept:t==="text"?"text/plain":"application/json",json:t!=="text"}}return"usage: lmctl api run <id|get|step|transcript|messages|resume|artifacts|where|timeline>"}function ne(e,t){return e===void 0||e.startsWith("--")?`missing value for ${t}`:!/^\d+$/.test(e)||Number(e)<=0?`invalid ${t}: ${e}`:Number(e)}function re(e){return e.startsWith("--")?`unknown flag: ${e}`:`unknown argument: ${e}`}function G_(e,t){let r=[],n=!1;for(let s of e){if(s===t){n=!0;continue}r.push(s)}return{rest:r,present:n}}async function wA(e,t){let r=W_(e);if(typeof r=="string")return t.stderr.write(`error: ${r}
|
|
1636
1636
|
`),2;let n=r.args,s=r.format!=="text",[i,...o]=n;if(i===void 0)return t.stderr.write(`error: --direct requires a subcommand (issues|status|projects|workflows|runs|attentions)
|
|
1637
1637
|
`),2;let a=t.dal===void 0,l=t.dal??Ie({path:le()});try{if(i==="issues"){let[c,...d]=o;return c===void 0?(t.stderr.write(`error: --direct issues requires a subcommand (list|show|create|claim|claim-next|close|reopen)
|
|
1638
1638
|
`),2):c==="create"?EA(l,d,t,s):c==="claim"?TA(l,d,t,s):c==="claim-next"?bA(l,d,t,s):c==="close"?SA(l,d,t,s):c==="reopen"?vA(l,d,t,s):c==="list"?xA(l,d,t,s):c==="show"?AA(l,d,t,s):(t.stderr.write(`error: --direct does not support: issues ${c} (supported: list, show, create, claim, claim-next, close, reopen)
|
|
@@ -1664,9 +1664,9 @@ ${r}`:r}function gp(e,t){let r=DN[t.tool];return r?new Promise((n,s)=>{let i=t.b
|
|
|
1664
1664
|
`),2;let s=ne(t[0],"id");if(typeof s=="string")return r.stderr.write(`error: ${s}
|
|
1665
1665
|
`),2;let i=e.getIssue(s);return i===null?(r.stderr.write(`error: issue not found: ${s}
|
|
1666
1666
|
`),1):(Ve(r,i,n),0)}function RA(e,t,r,n){return t.length>0?(r.stderr.write(`error: ${re(t[0])}
|
|
1667
|
-
`),2):(Ve(r,
|
|
1668
|
-
`),2):(Ve(r,
|
|
1669
|
-
`),2):(Ve(r,
|
|
1667
|
+
`),2):(Ve(r,Fi(e),n),0)}function LA(e,t,r,n){return t.length>0?(r.stderr.write(`error: ${re(t[0])}
|
|
1668
|
+
`),2):(Ve(r,Ui(e),n),0)}function OA(e,t,r,n){return t.length>0?(r.stderr.write(`error: ${re(t[0])}
|
|
1669
|
+
`),2):(Ve(r,Wi(e),n),0)}function $A(e,t,r,n){let s;for(let i=0;i<t.length;i+=1){let o=t[i],a=t[++i];if(a===void 0||a.startsWith("--"))return r.stderr.write(`error: missing value for ${o}
|
|
1670
1670
|
`),2;if(o==="--limit"){if(!/^\d+$/.test(a)||Number(a)<=0)return r.stderr.write(`error: invalid --limit: ${a}
|
|
1671
1671
|
`),2;s=Number(a)}else return r.stderr.write(`error: ${re(o)}
|
|
1672
1672
|
`),2}return Ve(r,sn(e,s!==void 0?{limit:s}:{}),n),0}function CA(e,t){let[r,...n]=e;if(r===void 0)return t.stderr.write(`error: usage: lmctl api --direct run where <run_id> [--json]
|
|
@@ -1674,7 +1674,7 @@ ${r}`:r}function gp(e,t){let r=DN[t.tool];return r?new Promise((n,s)=>{let i=t.b
|
|
|
1674
1674
|
`),2;let s=!1;for(let a of n){if(a==="--json"){s=!0;continue}return t.stderr.write(`error: ${re(a)}
|
|
1675
1675
|
`),2}let i=t.dal===void 0,o=t.dal??Ie({path:le()});try{let a=on(o,Number(r));return a===null?(t.stderr.write(`error: run not found: ${r}
|
|
1676
1676
|
`),1):(s?t.stdout.write(`${JSON.stringify(a,null,2)}
|
|
1677
|
-
`):t.stdout.write(
|
|
1677
|
+
`):t.stdout.write(Hi(a)),0)}finally{i&&o.close()}}async function MA(e,t){let[r,...n]=e;if(r===void 0)return t.stderr.write(`error: usage: lmctl api run where <run_id> [--json]
|
|
1678
1678
|
`),2;if(!/^\d+$/.test(r)||Number(r)<=0)return t.stderr.write(`error: invalid run_id: ${r}
|
|
1679
1679
|
`),2;let s=!1;for(let c of n){if(c==="--json"){s=!0;continue}if(c!=="--text")return t.stderr.write(`error: ${re(c)}
|
|
1680
1680
|
`),2}let i=Or(t),a=dr(s?"application/json":"text/plain",i.token),l;try{l=await fetch(new URL(`/api/runs/${r}/where`,i.baseUrl),{method:"GET",headers:a})}catch(c){return t.stderr.write(`error: network failure: ${c instanceof Error?c.message:String(c)}
|
|
@@ -1684,9 +1684,9 @@ ${r}`:r}function gp(e,t){let r=DN[t.tool];return r?new Promise((n,s)=>{let i=t.b
|
|
|
1684
1684
|
`),l.status===404?1:l.status===400?2:1)}function jA(e,t){let[r,...n]=e;if(r===void 0)return t.stderr.write(`error: usage: lmctl api --direct run timeline <run_id> [--json]
|
|
1685
1685
|
`),2;if(!/^\d+$/.test(r)||Number(r)<=0)return t.stderr.write(`error: invalid run_id: ${r}
|
|
1686
1686
|
`),2;let s=!1;for(let a of n){if(a==="--json"){s=!0;continue}if(a!=="--text")return t.stderr.write(`error: ${re(a)}
|
|
1687
|
-
`),2}let i=t.dal===void 0,o=t.dal??Ie({path:le()});try{let a=
|
|
1687
|
+
`),2}let i=t.dal===void 0,o=t.dal??Ie({path:le()});try{let a=Ji(o,Number(r));return a===null?(t.stderr.write(`error: run not found: ${r}
|
|
1688
1688
|
`),1):(s?t.stdout.write(`${JSON.stringify(a,null,2)}
|
|
1689
|
-
`):t.stdout.write(
|
|
1689
|
+
`):t.stdout.write(Xi(a)),0)}finally{i&&o.close()}}async function DA(e,t){let[r,...n]=e;if(r===void 0)return t.stderr.write(`error: usage: lmctl api run timeline <run_id> [--json]
|
|
1690
1690
|
`),2;if(!/^\d+$/.test(r)||Number(r)<=0)return t.stderr.write(`error: invalid run_id: ${r}
|
|
1691
1691
|
`),2;let s=!1;for(let c of n){if(c==="--json"){s=!0;continue}if(c!=="--text")return t.stderr.write(`error: ${re(c)}
|
|
1692
1692
|
`),2}let i=Or(t),a=dr(s?"application/json":"text/plain",i.token),l;try{l=await fetch(new URL(`/api/runs/${r}/timeline`,i.baseUrl),{method:"GET",headers:a})}catch(c){return t.stderr.write(`error: network failure: ${c instanceof Error?c.message:String(c)}
|
|
@@ -1701,7 +1701,7 @@ ${r}`:r}function gp(e,t){let r=DN[t.tool];return r?new Promise((n,s)=>{let i=t.b
|
|
|
1701
1701
|
`),o.status===400?2:1)}function FA(e,t,r,n){let s=!1;for(let i of t){if(i==="--unacked"){s=!0;continue}return r.stderr.write(`error: ${re(i)}
|
|
1702
1702
|
`),2}return Ve(r,cr(e,{unacked:s}),n),0}function V_(e,t,r){let[n,...s]=t;if(n===void 0)return r.stderr.write(`error: --direct escalations requires a subcommand (list|show|respond)
|
|
1703
1703
|
`),2;if(n==="list"){let i=F_(s);if(typeof i=="string")return r.stderr.write(`error: ${i}
|
|
1704
|
-
`),2;let o={all:i.all};i.project!==void 0&&(o.project=i.project),i.since!==void 0&&(o.since=i.since);let a=
|
|
1704
|
+
`),2;let o={all:i.all};i.project!==void 0&&(o.project=i.project),i.since!==void 0&&(o.since=i.since);let a=qi(e,o);return U_(a,i.json,r)}if(n==="show"){let i=s.filter(l=>l!=="--json"&&l!=="--text");if(i.length!==1)return r.stderr.write(`usage: lmctl api --direct escalations show <attention_id> [--json|--text]
|
|
1705
1705
|
`),2;let o=ne(i[0],"attention_id");if(typeof o=="string")return r.stderr.write(`error: ${o}
|
|
1706
1706
|
`),2;let a=kt(e,o);return a===null?(r.stderr.write(`error: escalation not found: ${o}
|
|
1707
1707
|
`),1):(r.stdout.write(`${JSON.stringify(a,null,2)}
|
|
@@ -1719,12 +1719,12 @@ ${r}`:r}function gp(e,t){let r=DN[t.tool];return r?new Promise((n,s)=>{let i=t.b
|
|
|
1719
1719
|
`),2;let d=e.resumeInteractive(l.step_id,a,s);if(!d.resumed)return r.stderr.write(`error: interactive respond failed: ${d.reason} (step_id=${l.step_id})
|
|
1720
1720
|
`),2;let u=e.acknowledgeAttention(o),f={ok:!0,attention_id:o,step_id:l.step_id,session_status:d.session.status,acknowledged_at:u?.acknowledged_at??null};return n?r.stdout.write(`${JSON.stringify(f,null,2)}
|
|
1721
1721
|
`):r.stdout.write(`ok: attention ${o} acknowledged; step ${l.step_id} resumed (session_status=${f.session_status})
|
|
1722
|
-
`),0}function j_(e,t){let r=e.split(",").map(n=>n.trim()).filter(n=>n.length>0);if(r.length===0)return`invalid value: ${e}`;for(let n of r)if(!t.includes(n))return`invalid value: ${n}`;return r}var Mx,jx,D_,
|
|
1722
|
+
`),0}function j_(e,t){let r=e.split(",").map(n=>n.trim()).filter(n=>n.length>0);if(r.length===0)return`invalid value: ${e}`;for(let n of r)if(!t.includes(n))return`invalid value: ${n}`;return r}var Mx,jx,D_,Vi,Wx,Bx,qx,Hx,NA,Y_=T(()=>{"use strict";Ze();Xe();Mi();Ec();Ht();Mx="http://127.0.0.1:8787",jx=`usage: lmctl api [--direct] <subcommand> ...
|
|
1723
1723
|
|
|
1724
1724
|
Call the lmctl HTTP API using the configured daemon URL/token. Some
|
|
1725
1725
|
workflow shellstep-safe commands also support --direct to use the local DAL
|
|
1726
1726
|
without an HTTP round trip.
|
|
1727
|
-
`,D_=["low","medium","high","critical"];
|
|
1727
|
+
`,D_=["low","medium","high","critical"];Vi=new Set(["api.url","api.port","api.token","project.docroot",ji,Di]);Wx=`usage: lmctl api escalations <list|show|respond>
|
|
1728
1728
|
|
|
1729
1729
|
list [--project P] [--all] [--since DURATION] [--json]
|
|
1730
1730
|
Print pending operator escalations (interactive_waiting_operator
|
|
@@ -1749,27 +1749,27 @@ without an HTTP round trip.
|
|
|
1749
1749
|
|
|
1750
1750
|
Verify every workflows/*.compound.json file: load/validate the workflow graph
|
|
1751
1751
|
and report the first step that would be started. Default output is the TTY
|
|
1752
|
-
table; --json emits the structured WorkflowVerifyReport payload.`;NA=["open","assigned","closed","reopened"]});import z_ from"jexl";function an(e){z_.compile(Z_(e))}async function $r(e,t){return z_.eval(Z_(e),t)}function Z_(e){return e.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var as=T(()=>{"use strict"});import{z as E}from"zod";function Cc(e){let t=e.trim();return t.startsWith("={{")&&t.endsWith("}}")?t.slice(3,-2).trim():e}var WA,Q_,xc,Ac,Rc,Lc,Oc,$c,eh,BA,qA,HA,ls,JA,Yi,zi,Zi,Qi,eo,th,XA,GA,VA,KA,to,ln=T(()=>{"use strict";as();WA=E.object({kind:E.enum(["success","neutral","failure"])}),Q_=E.enum(["string","number","boolean","object","array"]),xc=E.object({name:E.string().min(1),type:Q_,required:E.boolean().optional(),default:E.unknown().optional(),description:E.string().optional()}),Ac=E.object({name:E.string().min(1),type:Q_,source_step_id:E.string().min(1),source_field:E.string().min(1),description:E.string().optional()}),Rc=E.object({id:E.string().min(1),type:E.string().min(1),parameters:E.record(E.string(),E.unknown()).default({})}),Lc="__failure__",Oc=E.object({tools:E.array(E.string().min(1)).optional(),auth:E.array(E.string().min(1)).optional()}).strict().optional(),$c=E.object({on_unhandled_failure:E.object({attention_kind:E.string().min(1).default("workflow_failed"),severity:E.enum(["warn","error","critical"]).default("warn"),capture_evidence:E.boolean().default(!0),recommend_recovery:E.string().min(1).optional()}).optional(),on_unhandled_failure_state:E.string().min(1).optional()}).optional(),eh=E.object({type:E.literal("AssertRepoClean"),fail_message:E.string().min(1).optional(),next:E.string().min(1)}),BA=E.object({name:E.string().min(1),command:E.string().min(1).optional(),args:E.array(E.string()).optional(),env:E.record(E.string(),E.string()).optional(),type:E.enum(["stdio","http","sse"]).optional(),url:E.string().min(1).optional(),headers:E.record(E.string(),E.string()).optional()}).strict(),qA=E.union([E.string().min(1),BA]),HA=E.union([E.string().min(1),E.object({name:E.string().min(1),content:E.string().min(1)}).strict()]),ls=E.object({team:E.string().min(1),alias:E.string().min(1),prompt_template:E.string().optional(),mcp:E.array(qA).optional(),skills:E.array(HA).optional()}),JA=E.object({kind:E.literal("shell"),command:E.string().min(1),description:E.string().optional()}),Yi=E.object({type:E.literal("Review"),state_name:E.string().min(1),coder:ls,pre_checks:E.array(JA).optional(),reviewers:E.array(ls.extend({rubric_artifact:E.string().optional()})).optional(),outcomes:E.object({approve:E.string().min(1),request_changes:E.string().optional(),fail_pre_check:E.string().optional(),max_loops_exceeded:E.string().optional()}),writes_to_project_path:E.boolean().optional(),durable_memory_tags:E.array(E.string().min(1)).optional(),write_back_durable_memory:E.union([E.boolean(),E.string().min(1)]).optional(),max_loops:E.number().int().positive().default(5),loop_feedback_artifact:E.string().optional(),outcomes_from_stance:E.record(E.string(),E.string().min(1)).optional()}).superRefine((e,t)=>{(e.reviewers??[]).length>0&&e.outcomes_from_stance!==void 0&&t.addIssue({code:"custom",path:["outcomes_from_stance"],message:"outcomes_from_stance cannot be used when reviewers is non-empty"})}),zi=E.object({type:E.literal("Consolidate"),state_name:E.string().min(1),researchers:E.array(ls.extend({topic:E.string().min(1)})).optional(),consolidator:ls,outcomes:E.object({ok:E.string().min(1),error:E.string().optional()}),research_artifact_prefix:E.string().optional(),durable_memory_tags:E.array(E.string().min(1)).optional(),write_back_durable_memory:E.union([E.boolean(),E.string().min(1)]).optional()}),Zi=E.object({type:E.literal("Interactive"),state_name:E.string().min(1),agent:ls.extend({initial_prompt_template:E.string().min(1)}),termination:E.object({operator_signal:E.boolean().default(!0),agent_signal:E.string().optional(),max_turns:E.number().int().positive().default(20),timeout_seconds:E.number().int().positive().optional()}),outcomes:E.object({done:E.string().min(1),timeout:E.string().optional()}),artifact_name:E.string().optional(),durable_memory_tags:E.array(E.string().min(1)).optional(),write_back_durable_memory:E.union([E.boolean(),E.string().min(1)]).optional()}),Qi=E.object({type:E.literal("Loop"),state_name:E.string().min(1),over:E.string().min(1),item_var:E.string().min(1),body:E.string().min(1),outcomes:E.object({ok:E.string().min(1),error:E.string().optional()}),stop_on_error:E.boolean().default(!0),max_items:E.number().int().positive().default(1e3)}),eo=E.object({type:E.literal("ShellStep"),state_name:E.string().min(1),command:E.string().min(1),outcomes_from_exit:E.record(E.string(),E.string().min(1)),timeout_ms:E.number().int().nonnegative().optional(),capture_output_to:E.string().optional(),writes_to_project_path:E.boolean().optional()}),th=E.object({type:E.literal("Choice"),state_name:E.string().min(1),branches:E.array(E.object({when:E.string().min(1),next:E.string().min(1)})).default([]),default_next:E.string().min(1).optional()}).superRefine((e,t)=>{for(let[r,n]of e.branches.entries())try{an(Cc(n.when))}catch(s){let i=s instanceof Error?s.message:"invalid expression";t.addIssue({code:"custom",path:["branches",r,"when"],message:`invalid jexl expression: ${i}`})}}),XA=E.discriminatedUnion("type",[eh,Yi,zi,Zi,Qi,eo,th]),GA=E.object({type:E.literal("ForEach"),state_name:E.string().min(1),items_from:E.string().min(1),mode:E.enum(["sequential","parallel"]).default("sequential"),max_concurrency:E.number().int().positive().default(1),on_item_failure:E.enum(["continue","stop"]).default("stop"),body:XA,outcomes:E.object({all_ok:E.string().min(1),any_failed:E.string().optional()})}).superRefine((e,t)=>{try{an(Cc(e.items_from))}catch(r){let n=r instanceof Error?r.message:"invalid expression";t.addIssue({code:"custom",path:["items_from"],message:`invalid jexl expression: ${n}`})}}),VA=E.object({type:E.literal("Subflow"),state_name:E.string().min(1),workflow_name:E.string().min(1),inputs:E.record(E.string(),E.string().min(1)).optional(),outcomes:E.record(E.string(),E.string().min(1))}).superRefine((e,t)=>{for(let[r,n]of Object.entries(e.inputs??{}))try{an(Cc(n))}catch(s){let i=s instanceof Error?s.message:"invalid expression";t.addIssue({code:"custom",path:["inputs",r],message:`invalid jexl expression: ${i}`})}}),KA=E.discriminatedUnion("type",[eh,Yi,zi,Zi,Qi,eo,th,GA,VA]),to=E.object({name:E.string().min(1),version:E.number().int().positive(),definition_schema_version:E.union([E.literal(1),E.literal(2)]),description:E.string().optional(),estimated_duration_ms:E.number().int().nonnegative().optional(),primitive_version:E.union([E.literal(1),E.literal(2)]).default(1),start_at:E.string().min(1),states:E.record(E.string().min(1),KA),terminals:E.record(E.string().min(1),WA),errors:$c,concurrency_key:E.string().min(1).optional(),concurrent_limit:E.number().int().positive().optional(),default_task_timeout_ms:E.number().int().positive().max(216e5).optional(),inputs:E.array(xc).optional(),outputs:E.array(Ac).optional(),triggers:E.array(Rc).optional(),read_only:E.boolean().optional(),requires:Oc}).superRefine((e,t)=>{e.definition_schema_version===1&&e.errors!==void 0&&t.addIssue({code:"custom",path:["errors"],message:"errors block requires definition_schema_version: 2"}),e.definition_schema_version===1&&e.concurrency_key!==void 0&&t.addIssue({code:"custom",path:["concurrency_key"],message:"concurrency_key requires definition_schema_version: 2"}),e.definition_schema_version===1&&e.default_task_timeout_ms!==void 0&&t.addIssue({code:"custom",path:["default_task_timeout_ms"],message:"default_task_timeout_ms requires definition_schema_version: 2"})})});import{z as K}from"zod";var YA,ro,zA,ZA,QA,It,cn=T(()=>{"use strict";ln();YA=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,ro=K.string().regex(YA),zA=K.object({step_id:ro,type:K.literal("main"),index:K.number().int().min(0)}),ZA=K.record(ro,K.record(K.string().min(1),K.array(K.array(zA)))),QA=K.object({id:ro,name:K.string().min(1),type:K.string().min(1),typeVersion:K.number().int().positive().default(1),parameters:K.record(K.string(),K.unknown()).default({}),members:K.record(K.string(),K.unknown()).optional(),estimated_duration_ms:K.number().int().nonnegative().optional()}),It=K.object({schema_version:K.literal("lmctl/v3"),definition_schema_version:K.literal(3),name:K.string().min(1),version:K.number().int().positive(),description:K.string().optional(),estimated_duration_ms:K.number().int().nonnegative().optional(),default_task_timeout_ms:K.number().int().positive().max(216e5).optional(),concurrency_key:K.string().min(1).optional(),concurrent_limit:K.number().int().positive().optional(),errors:$c,inputs:K.array(xc).optional(),outputs:K.array(Ac).optional(),steps:K.array(QA).min(1),connections:ZA.default({}),entry_step_id:ro,triggers:K.array(Rc).optional(),read_only:K.boolean().optional(),requires:Oc}).superRefine((e,t)=>{let r=new Set;for(let[n,s]of e.steps.entries())r.has(s.id)&&t.addIssue({code:"custom",path:["steps",n,"id"],message:`duplicate step id: ${s.id}`}),r.add(s.id);r.has(e.entry_step_id)||t.addIssue({code:"custom",path:["entry_step_id"],message:`entry_step_id does not reference an existing step: ${e.entry_step_id}`});for(let[n,s]of Object.entries(e.connections)){r.has(n)||t.addIssue({code:"custom",path:["connections",n],message:`connection source does not reference an existing step: ${n}`});for(let[i,o]of Object.entries(s))for(let[a,l]of o.entries())for(let[c,d]of l.entries())r.has(d.step_id)||t.addIssue({code:"custom",path:["connections",n,i,a,c,"step_id"],message:`connection target does not reference an existing step: ${d.step_id}`})}})});function no(e){return jc(e)}function jc(e){if(Array.isArray(e))return e.map(jc);if(e===null||typeof e!="object")return e;let t=e,r={};for(let n of Object.keys(t))r[n]=jc(t[n]);if(typeof r.type=="string"){let n=tR[r.type];n!==void 0&&(r.type=n)}return r}var Mc,eR,tR,Dc=T(()=>{"use strict";Mc="lmctl.builtin.",eR={Review:`${Mc}Review`,Research:`${Mc}Research`,Consolidate:`${Mc}Consolidate`},tR=Object.fromEntries(Object.entries(eR).map(([e,t])=>[t,e]))});import{readFileSync as rR}from"node:fs";function sh(e){return nR(e)}function nR(e){let t=no(oR(e));if(iR(t),ih(t)===3)return sR(t);let r=to.safeParse(t);if(!r.success)throw new Jt({errors:r.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message}))});let n=aR(r.data);if(n.errors.length>0||n.unresolvedRefs.length>0)throw new Jt(n);return r.data}function sR(e){let t=It.safeParse(e);if(!t.success)throw new Jt({errors:t.error.issues.map(r=>({path:r.path.length===0?"$":r.path.map(String).join("."),message:r.message}))});return t.data}function iR(e){if(typeof e!="object"||e===null||!("definition_schema_version"in e))return;let t=ih(e);if(!(t===null||rh.includes(t)))throw new Jt({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${t}; supported versions: ${rh.join(", ")}`}]})}function ih(e){if(typeof e!="object"||e===null||!("definition_schema_version"in e))return null;let t=e.definition_schema_version;return typeof t=="number"?t:null}function oR(e){if(typeof e!="string")return e;let t=e.trim();return e.includes(`
|
|
1752
|
+
table; --json emits the structured WorkflowVerifyReport payload.`;NA=["open","assigned","closed","reopened"]});import z_ from"jexl";function an(e){z_.compile(Z_(e))}async function $r(e,t){return z_.eval(Z_(e),t)}function Z_(e){return e.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var as=T(()=>{"use strict"});import{z as E}from"zod";function Cc(e){let t=e.trim();return t.startsWith("={{")&&t.endsWith("}}")?t.slice(3,-2).trim():e}var WA,Q_,xc,Ac,Rc,Lc,Oc,$c,eh,BA,qA,HA,ls,JA,zi,Zi,Qi,eo,to,th,XA,GA,VA,KA,ro,ln=T(()=>{"use strict";as();WA=E.object({kind:E.enum(["success","neutral","failure"])}),Q_=E.enum(["string","number","boolean","object","array"]),xc=E.object({name:E.string().min(1),type:Q_,required:E.boolean().optional(),default:E.unknown().optional(),description:E.string().optional()}),Ac=E.object({name:E.string().min(1),type:Q_,source_step_id:E.string().min(1),source_field:E.string().min(1),description:E.string().optional()}),Rc=E.object({id:E.string().min(1),type:E.string().min(1),parameters:E.record(E.string(),E.unknown()).default({})}),Lc="__failure__",Oc=E.object({tools:E.array(E.string().min(1)).optional(),auth:E.array(E.string().min(1)).optional()}).strict().optional(),$c=E.object({on_unhandled_failure:E.object({attention_kind:E.string().min(1).default("workflow_failed"),severity:E.enum(["warn","error","critical"]).default("warn"),capture_evidence:E.boolean().default(!0),recommend_recovery:E.string().min(1).optional()}).optional(),on_unhandled_failure_state:E.string().min(1).optional()}).optional(),eh=E.object({type:E.literal("AssertRepoClean"),fail_message:E.string().min(1).optional(),next:E.string().min(1)}),BA=E.object({name:E.string().min(1),command:E.string().min(1).optional(),args:E.array(E.string()).optional(),env:E.record(E.string(),E.string()).optional(),type:E.enum(["stdio","http","sse"]).optional(),url:E.string().min(1).optional(),headers:E.record(E.string(),E.string()).optional()}).strict(),qA=E.union([E.string().min(1),BA]),HA=E.union([E.string().min(1),E.object({name:E.string().min(1),content:E.string().min(1)}).strict()]),ls=E.object({team:E.string().min(1),alias:E.string().min(1),prompt_template:E.string().optional(),mcp:E.array(qA).optional(),skills:E.array(HA).optional()}),JA=E.object({kind:E.literal("shell"),command:E.string().min(1),description:E.string().optional()}),zi=E.object({type:E.literal("Review"),state_name:E.string().min(1),coder:ls,pre_checks:E.array(JA).optional(),reviewers:E.array(ls.extend({rubric_artifact:E.string().optional()})).optional(),outcomes:E.object({approve:E.string().min(1),request_changes:E.string().optional(),fail_pre_check:E.string().optional(),max_loops_exceeded:E.string().optional()}),writes_to_project_path:E.boolean().optional(),durable_memory_tags:E.array(E.string().min(1)).optional(),write_back_durable_memory:E.union([E.boolean(),E.string().min(1)]).optional(),max_loops:E.number().int().positive().default(5),loop_feedback_artifact:E.string().optional(),outcomes_from_stance:E.record(E.string(),E.string().min(1)).optional()}).superRefine((e,t)=>{(e.reviewers??[]).length>0&&e.outcomes_from_stance!==void 0&&t.addIssue({code:"custom",path:["outcomes_from_stance"],message:"outcomes_from_stance cannot be used when reviewers is non-empty"})}),Zi=E.object({type:E.literal("Consolidate"),state_name:E.string().min(1),researchers:E.array(ls.extend({topic:E.string().min(1)})).optional(),consolidator:ls,outcomes:E.object({ok:E.string().min(1),error:E.string().optional()}),research_artifact_prefix:E.string().optional(),durable_memory_tags:E.array(E.string().min(1)).optional(),write_back_durable_memory:E.union([E.boolean(),E.string().min(1)]).optional()}),Qi=E.object({type:E.literal("Interactive"),state_name:E.string().min(1),agent:ls.extend({initial_prompt_template:E.string().min(1)}),termination:E.object({operator_signal:E.boolean().default(!0),agent_signal:E.string().optional(),max_turns:E.number().int().positive().default(20),timeout_seconds:E.number().int().positive().optional()}),outcomes:E.object({done:E.string().min(1),timeout:E.string().optional()}),artifact_name:E.string().optional(),durable_memory_tags:E.array(E.string().min(1)).optional(),write_back_durable_memory:E.union([E.boolean(),E.string().min(1)]).optional()}),eo=E.object({type:E.literal("Loop"),state_name:E.string().min(1),over:E.string().min(1),item_var:E.string().min(1),body:E.string().min(1),outcomes:E.object({ok:E.string().min(1),error:E.string().optional()}),stop_on_error:E.boolean().default(!0),max_items:E.number().int().positive().default(1e3)}),to=E.object({type:E.literal("ShellStep"),state_name:E.string().min(1),command:E.string().min(1),outcomes_from_exit:E.record(E.string(),E.string().min(1)),timeout_ms:E.number().int().nonnegative().optional(),capture_output_to:E.string().optional(),writes_to_project_path:E.boolean().optional()}),th=E.object({type:E.literal("Choice"),state_name:E.string().min(1),branches:E.array(E.object({when:E.string().min(1),next:E.string().min(1)})).default([]),default_next:E.string().min(1).optional()}).superRefine((e,t)=>{for(let[r,n]of e.branches.entries())try{an(Cc(n.when))}catch(s){let i=s instanceof Error?s.message:"invalid expression";t.addIssue({code:"custom",path:["branches",r,"when"],message:`invalid jexl expression: ${i}`})}}),XA=E.discriminatedUnion("type",[eh,zi,Zi,Qi,eo,to,th]),GA=E.object({type:E.literal("ForEach"),state_name:E.string().min(1),items_from:E.string().min(1),mode:E.enum(["sequential","parallel"]).default("sequential"),max_concurrency:E.number().int().positive().default(1),on_item_failure:E.enum(["continue","stop"]).default("stop"),body:XA,outcomes:E.object({all_ok:E.string().min(1),any_failed:E.string().optional()})}).superRefine((e,t)=>{try{an(Cc(e.items_from))}catch(r){let n=r instanceof Error?r.message:"invalid expression";t.addIssue({code:"custom",path:["items_from"],message:`invalid jexl expression: ${n}`})}}),VA=E.object({type:E.literal("Subflow"),state_name:E.string().min(1),workflow_name:E.string().min(1),inputs:E.record(E.string(),E.string().min(1)).optional(),outcomes:E.record(E.string(),E.string().min(1))}).superRefine((e,t)=>{for(let[r,n]of Object.entries(e.inputs??{}))try{an(Cc(n))}catch(s){let i=s instanceof Error?s.message:"invalid expression";t.addIssue({code:"custom",path:["inputs",r],message:`invalid jexl expression: ${i}`})}}),KA=E.discriminatedUnion("type",[eh,zi,Zi,Qi,eo,to,th,GA,VA]),ro=E.object({name:E.string().min(1),version:E.number().int().positive(),definition_schema_version:E.union([E.literal(1),E.literal(2)]),description:E.string().optional(),estimated_duration_ms:E.number().int().nonnegative().optional(),primitive_version:E.union([E.literal(1),E.literal(2)]).default(1),start_at:E.string().min(1),states:E.record(E.string().min(1),KA),terminals:E.record(E.string().min(1),WA),errors:$c,concurrency_key:E.string().min(1).optional(),concurrent_limit:E.number().int().positive().optional(),default_task_timeout_ms:E.number().int().positive().max(216e5).optional(),inputs:E.array(xc).optional(),outputs:E.array(Ac).optional(),triggers:E.array(Rc).optional(),read_only:E.boolean().optional(),requires:Oc}).superRefine((e,t)=>{e.definition_schema_version===1&&e.errors!==void 0&&t.addIssue({code:"custom",path:["errors"],message:"errors block requires definition_schema_version: 2"}),e.definition_schema_version===1&&e.concurrency_key!==void 0&&t.addIssue({code:"custom",path:["concurrency_key"],message:"concurrency_key requires definition_schema_version: 2"}),e.definition_schema_version===1&&e.default_task_timeout_ms!==void 0&&t.addIssue({code:"custom",path:["default_task_timeout_ms"],message:"default_task_timeout_ms requires definition_schema_version: 2"})})});import{z as K}from"zod";var YA,no,zA,ZA,QA,It,cn=T(()=>{"use strict";ln();YA=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,no=K.string().regex(YA),zA=K.object({step_id:no,type:K.literal("main"),index:K.number().int().min(0)}),ZA=K.record(no,K.record(K.string().min(1),K.array(K.array(zA)))),QA=K.object({id:no,name:K.string().min(1),type:K.string().min(1),typeVersion:K.number().int().positive().default(1),parameters:K.record(K.string(),K.unknown()).default({}),members:K.record(K.string(),K.unknown()).optional(),estimated_duration_ms:K.number().int().nonnegative().optional()}),It=K.object({schema_version:K.literal("lmctl/v3"),definition_schema_version:K.literal(3),name:K.string().min(1),version:K.number().int().positive(),description:K.string().optional(),estimated_duration_ms:K.number().int().nonnegative().optional(),default_task_timeout_ms:K.number().int().positive().max(216e5).optional(),concurrency_key:K.string().min(1).optional(),concurrent_limit:K.number().int().positive().optional(),errors:$c,inputs:K.array(xc).optional(),outputs:K.array(Ac).optional(),steps:K.array(QA).min(1),connections:ZA.default({}),entry_step_id:no,triggers:K.array(Rc).optional(),read_only:K.boolean().optional(),requires:Oc}).superRefine((e,t)=>{let r=new Set;for(let[n,s]of e.steps.entries())r.has(s.id)&&t.addIssue({code:"custom",path:["steps",n,"id"],message:`duplicate step id: ${s.id}`}),r.add(s.id);r.has(e.entry_step_id)||t.addIssue({code:"custom",path:["entry_step_id"],message:`entry_step_id does not reference an existing step: ${e.entry_step_id}`});for(let[n,s]of Object.entries(e.connections)){r.has(n)||t.addIssue({code:"custom",path:["connections",n],message:`connection source does not reference an existing step: ${n}`});for(let[i,o]of Object.entries(s))for(let[a,l]of o.entries())for(let[c,d]of l.entries())r.has(d.step_id)||t.addIssue({code:"custom",path:["connections",n,i,a,c,"step_id"],message:`connection target does not reference an existing step: ${d.step_id}`})}})});function so(e){return jc(e)}function jc(e){if(Array.isArray(e))return e.map(jc);if(e===null||typeof e!="object")return e;let t=e,r={};for(let n of Object.keys(t))r[n]=jc(t[n]);if(typeof r.type=="string"){let n=tR[r.type];n!==void 0&&(r.type=n)}return r}var Mc,eR,tR,Dc=T(()=>{"use strict";Mc="lmctl.builtin.",eR={Review:`${Mc}Review`,Research:`${Mc}Research`,Consolidate:`${Mc}Consolidate`},tR=Object.fromEntries(Object.entries(eR).map(([e,t])=>[t,e]))});import{readFileSync as rR}from"node:fs";function sh(e){return nR(e)}function nR(e){let t=so(oR(e));if(iR(t),ih(t)===3)return sR(t);let r=ro.safeParse(t);if(!r.success)throw new Jt({errors:r.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message}))});let n=aR(r.data);if(n.errors.length>0||n.unresolvedRefs.length>0)throw new Jt(n);return r.data}function sR(e){let t=It.safeParse(e);if(!t.success)throw new Jt({errors:t.error.issues.map(r=>({path:r.path.length===0?"$":r.path.map(String).join("."),message:r.message}))});return t.data}function iR(e){if(typeof e!="object"||e===null||!("definition_schema_version"in e))return;let t=ih(e);if(!(t===null||rh.includes(t)))throw new Jt({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${t}; supported versions: ${rh.join(", ")}`}]})}function ih(e){if(typeof e!="object"||e===null||!("definition_schema_version"in e))return null;let t=e.definition_schema_version;return typeof t=="number"?t:null}function oR(e){if(typeof e!="string")return e;let t=e.trim();return e.includes(`
|
|
1753
1753
|
`)||t.startsWith("{")||t.startsWith("[")?nh(e,"$"):t.endsWith(".json")?nh(rR(t,"utf8"),t):e}function nh(e,t){try{return JSON.parse(e)}catch(r){let n=r instanceof Error?r.message:"invalid JSON";throw new Jt({errors:[{path:t,message:`invalid JSON: ${n}`}]})}}function aR(e){let t=[],r=[],n=new Set(Object.keys(e.states));n.has(e.start_at)||r.push({state:"$",ref:e.start_at,kind:"next"}),lR(e,n,r);for(let[s,i]of Object.entries(e.states))new Set(Object.keys(e.terminals));return{errors:t,unresolvedRefs:r}}function lR(e,t,r){let n=e.errors?.on_unhandled_failure_state;n!==void 0&&(t.has(n)||r.push({state:"$",ref:n,kind:"next"}))}var rh,Jt,oh=T(()=>{"use strict";ln();cn();Dc();rh=[1,2,3],Jt=class extends Error{errors;unresolvedRefs;constructor(t){super(t.message??"workflow validation failed"),this.name="WorkflowValidationError",this.errors=t.errors??[],this.unresolvedRefs=t.unresolvedRefs??[]}}});import{createHash as cR}from"node:crypto";function ah(e,t){let r=dR(t),n=cR("sha1").update(`${e}:${t}`).digest("hex").slice(0,4);return`s-${r}-${n}`}function dR(e){let t=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return t.length>0?t:"step"}var lh=T(()=>{"use strict";cn()});function mR(e,t){let r=fR[e]??[],n={},s={};for(let[i,o]of Object.entries(t))r.includes(i)?s[i]=o:n[i]=o;return{params:n,members:s}}function fh(e){let t=[],r=(k,N)=>{throw new dn([{line:k,message:N}])},n=e.split(`
|
|
1754
|
-
`),s=[];for(let k=0;k<n.length;k+=1){let L=hR(n[k]).trim();L.length>0&&s.push({n:k+1,text:L})}s.length===0&&r(1,"empty composition: expected a `workflow <name> v<version>` header");let i=/^workflow\s+(\S+)\s+v(\d+)$/.exec(s[0].text)??r(s[0].n,`expected header \`workflow <name> v<version>\`, got: ${s[0].text}`),o=i[1],a=Number.parseInt(i[2],10),l=new Map,c=[],d=[],u=[],f,m={},p=new Map,_=new Map,g=new Map,h=(k,N,L,F,j,C)=>{l.has(k)&&r(F,`duplicate step/terminal id: ${k}`),/^[A-Za-z][\w-]*$/.test(k)||r(F,`invalid id (must start with a letter): ${k}`),l.set(k,{declId:k,type:N,params:L,line:F,isTerminal:j,...C?{members:C}:{}}),d.push(k)},S=k=>{let N=[],L=k+1;for(;L<s.length;L+=1){let F=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[L].text);if(F===null)break;N.push({label:F[1],dst:F[2]})}return{branches:N,nextIdx:L-1}};for(let k=1;k<s.length;k+=1){let{n:N,text:L}=s[k],F=L.split(/\s+/,1)[0];if(/^meta\s*\(/.test(L)){k!==1&&r(N,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let j=/^meta\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${L}`),C=ur(j[1],N,r);for(let z of Object.keys(C))dh.has(z)||r(N,`unknown \`meta\` key \`${z}\` \u2014 only workflow-level runtime metadata is allowed: ${[...dh].join(", ")} (no grammar inflation; bounded)`);m=C;continue}if(F==="step"){let j=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${L}`),C=j[1],z=j[2],_e=j[3],ie=ch[z];ie===void 0&&r(N,`unknown step type: ${z} (supported \`step\` archetypes: ${Object.keys(ch).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:Te,members:Ct}=mR(ie,ur(_e,N,r));h(C,ie,Te,N,!1,Object.keys(Ct).length>0?Ct:void 0);continue}if(F==="trigger"){let j=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${L}`),C=j[1],z=j[2],_e=j[3],ie=uh[z];ie===void 0&&r(N,`unknown trigger type: ${z} (registered trigger archetypes: ${Object.keys(uh).join(", ")})`),p.has(C)&&r(N,`duplicate trigger id: ${C}`),p.set(C,{id:C,type:ie,parameters:ur(_e,N,r)});continue}if(F==="mcp"||F==="skill"){let j=new RegExp(`^${F}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(L)??r(N,`malformed \`${F}\` decl (expected \`${F} <name> = {json} | ${F} <name> = "<file|url>"\`): ${L}`),C=j[1],z=j[2].trim(),_e=F==="mcp"?_:g;_e.has(C)&&r(N,`duplicate ${F} declaration: ${C}`);let ie;if(z.startsWith("{")){let Te=ur(z,N,r);F==="mcp"?ie={...Te,name:C}:((typeof Te.content!="string"||Te.content.length===0)&&r(N,`\`skill ${C}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),ie={name:C,content:Te.content})}else{let Te=mh(z);(typeof Te!="string"||Te.length===0)&&r(N,`\`${F} ${C}\`: string form must be a non-empty file path or http(s) URL`),ie=Te}_e.set(C,ie);continue}if(F==="terminal"){let j=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(L)??r(N,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${L}`);h(j[1],"lmctl/terminal",{name:j[2],kind:j[3]??"neutral"},N,!0);continue}if(F==="seq"){let C=L.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(z=>z.trim()).filter(z=>z.length>0);(C.length<3||C.length%2===0)&&r(N,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${L}`);for(let z=0;z+2<C.length+1&&!(z+2>C.length-1);z+=2){let _e=C[z],ie=C[z+1],Te=C[z+2],Ct=ie==="->"?"main":ie.slice(1,-2);c.push({srcDeclId:_e,port:Ct,dstDeclId:Te,line:N})}continue}if(F==="choice"){let C=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(L)??r(N,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${L}`))[1],z=[],_e,ie=k+1;for(;ie<s.length;ie+=1){let Te=s[ie].text,Ct=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(Te);if(Ct!==null){_e!==void 0&&r(s[ie].n,`\`choice ${C}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let jn=Ct[2];z.push({when:Ct[1].trim(),next:`@terminal:${jn}`}),c.push({srcDeclId:C,port:jn,dstDeclId:Ct[3],line:s[ie].n});continue}let Ha=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(Te);if(Ha!==null){_e!==void 0&&r(s[ie].n,`\`choice ${C}\` has more than one \`default\``);let jn=Ha[1];_e=`@terminal:${jn}`,c.push({srcDeclId:C,port:jn,dstDeclId:Ha[2],line:s[ie].n});continue}break}z.length===0&&r(N,`\`choice ${C}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),h(C,"lmctl/choice",{branches:z,..._e!==void 0?{default_next:_e}:{}},N,!1),k=ie-1;continue}if(F==="loop"){let j=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${L}`);h(j[1],"lmctl/loop",ur(j[2],N,r),N,!1);continue}if(F==="foreach"){let j=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${L}`),C=ur(j[2],N,r);"mode"in C&&r(N,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),h(j[1],"lmctl/foreach",C,N,!1);continue}if(F==="call"){let j=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${L}`),C=j[1],z=ur(j[2],N,r),_e=z.workflow;(typeof _e!="string"||_e.length===0)&&r(N,`\`call ${C}\` requires a \`workflow=<name>\` argument`);let{workflow:ie,...Te}=z;h(C,"lmctl/subflow",{workflow_name:_e,...Te},N,!1),u.push({declId:C,target:_e,line:N});continue}if(F==="decide"){let j=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(L)??r(N,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${L}`),C=j[1],z=ur(j[2],N,r),{branches:_e,nextIdx:ie}=S(k);_e.length===0&&r(N,`\`decide ${C}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),h(C,"lmctl/interactive",{termination:{operator_signal:!0}},N,!1,{agent:z});for(let Te of _e)c.push({srcDeclId:C,port:Te.label,dstDeclId:Te.dst,line:N});k=ie;continue}if(F==="entry"){let j=/^entry\s+([A-Za-z][\w-]*)$/.exec(L)??r(N,`malformed \`entry\` (expected \`entry <id>\`): ${L}`);f!==void 0&&r(N,`duplicate \`entry\` (already set to ${f})`),f=j[1];continue}r(N,`unknown statement \`${F}\` (grammar: workflow / meta / trigger / mcp / skill / step / terminal / seq / choice / loop / foreach / call / decide / entry)`)}d.length===0&&r(s[0].n,"composition declares no steps"),f===void 0&&(f=d[0]),l.has(f)||r(s[0].n,`entry references undeclared step: ${f}`);let y=k=>{if(Array.isArray(k)){for(let L of k)y(L);return}if(typeof k!="object"||k===null)return;let N=k;if(typeof N.alias=="string")for(let[L,F]of[["mcp",_],["skills",g]]){let j=N[L];Array.isArray(j)&&(N[L]=j.map(C=>typeof C=="string"&&F.has(C)?structuredClone(F.get(C)):C))}for(let L of Object.values(N))y(L)};for(let k of d){let N=l.get(k);N.members!==void 0&&y(N.members)}let w=k=>ah(o,k),I=d.map(k=>{let N=l.get(k);return{id:w(k),name:k,type:N.type,typeVersion:1,parameters:N.params,...N.members?{members:N.members}:{}}}),x={};for(let k of c){l.has(k.srcDeclId)||r(k.line,`edge source references undeclared step: ${k.srcDeclId}`),l.has(k.dstDeclId)||r(k.line,`dangling edge target: ${k.dstDeclId} is not declared`),l.get(k.srcDeclId).isTerminal&&r(k.line,`terminal \`${k.srcDeclId}\` cannot have an outgoing edge`);let N=w(k.srcDeclId);x[N]??={},x[N][k.port]!==void 0&&r(k.line,`duplicate edge port \`${k.port}\` on step \`${k.srcDeclId}\``),x[N][k.port]=[[{step_id:w(k.dstDeclId),type:"main",index:0}]]}for(let k of d){let N=l.get(k);pR.has(N.type)||r(N.line,`unknown archetype \`${N.type}\` for step \`${k}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let k of u)k.target===o&&r(k.line,`subflow cycle: \`call ${k.declId}\` invokes this workflow (\`${o}\`) \u2014 direct recursion is not allowed (cross-workflow A\u2192B\u2192A cycle detection is deferred to the M3 compile.ts seam)`);let U=new Map;for(let k of c){let N=U.get(k.srcDeclId);N===void 0?U.set(k.srcDeclId,[k.dstDeclId]):N.push(k.dstDeclId)}for(let k of d){let N=l.get(k);if(N.type!=="lmctl/loop")continue;let L=N.params.body;if(typeof L=="string"&&l.has(L)){let F=U.get(k);F===void 0?U.set(k,[L]):F.push(L)}}let ue=new Set([f]),W=[f];for(;W.length>0;){let k=W.shift();for(let N of U.get(k)??[])ue.has(N)||(ue.add(N),W.push(N))}for(let k of d)ue.has(k)||r(l.get(k).line,`step \`${k}\` is unreachable from entry \`${f}\``);let M=new Map;for(let k of c){let N=M.get(k.srcDeclId);N===void 0&&(N=new Set,M.set(k.srcDeclId,N)),N.add(k.port)}let A=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let k of d){let N=l.get(k);if(N.isTerminal)continue;let L=M.get(k)??new Set;if(N.type==="lmctl/review"){let j=[...L].some(C=>!A.has(C));!L.has("approve")&&!j&&r(N.line,`uncovered outcome: review step \`${k}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${k} -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 F=_R[N.type];if(F!==void 0)for(let j of F)L.has(j)||r(N.line,`uncovered outcome: required outcome \`${j}\` of step \`${k}\` (\`${N.type}\`) has no connection \u2014 route it (\`seq ${k} -${j}-> <target|terminal>\`)`);else L.size===0&&r(N.line,`uncovered outcome: non-terminal step \`${k}\` (\`${N.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let k of d){let N=l.get(k),L=uR[N.type];if(L===void 0)continue;let F={...N.params,...N.members??{},type:L.v2type,state_name:k,...Object.keys(L.outcomes).length>0?{outcomes:L.outcomes}:{}},j=L.schema.safeParse(F);if(!j.success){let C=j.error.issues[0],z=C.path.length===0?"$":C.path.map(String).join(".");r(N.line,`step \`${k}\` (\`${N.type}\`) has invalid params for archetype \`${L.v2type}\` at \`${z}\`: ${C.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${k} = ${N.type.replace("lmctl/","")}({ ... })\``)}}let Q={schema_version:"lmctl/v3",definition_schema_version:3,name:o,version:a,...m,...p.size>0?{triggers:[...p.values()]}:{},steps:I,connections:x,entry_step_id:w(f)},B=It.safeParse(Q);if(!B.success)throw new dn(B.error.issues.map(k=>({line:s[0].n,message:`emitted V3 invalid at ${k.path.length===0?"$":k.path.map(String).join(".")}: ${k.message}`})));return B.data}function hR(e){let t=null;for(let r=0;r<e.length;r+=1){let n=e[r];if(t!==null){if(n==="\\"){r+=1;continue}n===t&&(t=null);continue}if(n==='"'||n==="'"){t=n;continue}if(n==="#")return e.slice(0,r)}return e}function ur(e,t,r){let n=e.trim();if(n.length===0)return{};if(n.startsWith("{")){let i;try{i=JSON.parse(n)}catch(o){r(t,`malformed structured args (expected a single-line JSON object): ${o.message}`)}return(i===null||typeof i!="object"||Array.isArray(i))&&r(t,"structured args must be a JSON object"),i}let s={};for(let i of gR(n)){let o=i.indexOf("=");o===-1&&r(t,`malformed arg (expected k=v): ${i}`);let a=i.slice(0,o).trim(),l=i.slice(o+1).trim();/^[A-Za-z_][\w-]*$/.test(a)||r(t,`invalid arg name: ${a}`),s[a]=mh(l)}return s}function gR(e){return e.split(",").map(t=>t.trim()).filter(t=>t.length>0)}function mh(e){return e.startsWith('"')&&e.endsWith('"')||e.startsWith("'")&&e.endsWith("'")?e.slice(1,-1):e==="true"?!0:e==="false"?!1:/^-?\d+$/.test(e)?Number.parseInt(e,10):/^-?\d*\.\d+$/.test(e)?Number.parseFloat(e):e}var uR,fR,ch,dn,pR,_R,dh,uh,ph=T(()=>{"use strict";cn();lh();ln();uR={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:Yi},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:zi},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:Zi},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:Qi},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:eo}},fR={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};ch={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"},dn=class extends Error{issues;constructor(t){super(`composition DSL compile failed:
|
|
1754
|
+
`),s=[];for(let k=0;k<n.length;k+=1){let L=hR(n[k]).trim();L.length>0&&s.push({n:k+1,text:L})}s.length===0&&r(1,"empty composition: expected a `workflow <name> v<version>` header");let i=/^workflow\s+(\S+)\s+v(\d+)$/.exec(s[0].text)??r(s[0].n,`expected header \`workflow <name> v<version>\`, got: ${s[0].text}`),o=i[1],a=Number.parseInt(i[2],10),l=new Map,c=[],d=[],u=[],f,m={},p=new Map,_=new Map,g=new Map,h=(k,N,L,F,j,C)=>{l.has(k)&&r(F,`duplicate step/terminal id: ${k}`),/^[A-Za-z][\w-]*$/.test(k)||r(F,`invalid id (must start with a letter): ${k}`),l.set(k,{declId:k,type:N,params:L,line:F,isTerminal:j,...C?{members:C}:{}}),d.push(k)},S=k=>{let N=[],L=k+1;for(;L<s.length;L+=1){let F=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[L].text);if(F===null)break;N.push({label:F[1],dst:F[2]})}return{branches:N,nextIdx:L-1}};for(let k=1;k<s.length;k+=1){let{n:N,text:L}=s[k],F=L.split(/\s+/,1)[0];if(/^meta\s*\(/.test(L)){k!==1&&r(N,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let j=/^meta\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${L}`),C=ur(j[1],N,r);for(let z of Object.keys(C))dh.has(z)||r(N,`unknown \`meta\` key \`${z}\` \u2014 only workflow-level runtime metadata is allowed: ${[...dh].join(", ")} (no grammar inflation; bounded)`);m=C;continue}if(F==="step"){let j=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${L}`),C=j[1],z=j[2],_e=j[3],ie=ch[z];ie===void 0&&r(N,`unknown step type: ${z} (supported \`step\` archetypes: ${Object.keys(ch).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:Te,members:Ct}=mR(ie,ur(_e,N,r));h(C,ie,Te,N,!1,Object.keys(Ct).length>0?Ct:void 0);continue}if(F==="trigger"){let j=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${L}`),C=j[1],z=j[2],_e=j[3],ie=uh[z];ie===void 0&&r(N,`unknown trigger type: ${z} (registered trigger archetypes: ${Object.keys(uh).join(", ")})`),p.has(C)&&r(N,`duplicate trigger id: ${C}`),p.set(C,{id:C,type:ie,parameters:ur(_e,N,r)});continue}if(F==="mcp"||F==="skill"){let j=new RegExp(`^${F}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(L)??r(N,`malformed \`${F}\` decl (expected \`${F} <name> = {json} | ${F} <name> = "<file|url>"\`): ${L}`),C=j[1],z=j[2].trim(),_e=F==="mcp"?_:g;_e.has(C)&&r(N,`duplicate ${F} declaration: ${C}`);let ie;if(z.startsWith("{")){let Te=ur(z,N,r);F==="mcp"?ie={...Te,name:C}:((typeof Te.content!="string"||Te.content.length===0)&&r(N,`\`skill ${C}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),ie={name:C,content:Te.content})}else{let Te=mh(z);(typeof Te!="string"||Te.length===0)&&r(N,`\`${F} ${C}\`: string form must be a non-empty file path or http(s) URL`),ie=Te}_e.set(C,ie);continue}if(F==="terminal"){let j=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(L)??r(N,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${L}`);h(j[1],"lmctl/terminal",{name:j[2],kind:j[3]??"neutral"},N,!0);continue}if(F==="seq"){let C=L.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(z=>z.trim()).filter(z=>z.length>0);(C.length<3||C.length%2===0)&&r(N,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${L}`);for(let z=0;z+2<C.length+1&&!(z+2>C.length-1);z+=2){let _e=C[z],ie=C[z+1],Te=C[z+2],Ct=ie==="->"?"main":ie.slice(1,-2);c.push({srcDeclId:_e,port:Ct,dstDeclId:Te,line:N})}continue}if(F==="choice"){let C=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(L)??r(N,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${L}`))[1],z=[],_e,ie=k+1;for(;ie<s.length;ie+=1){let Te=s[ie].text,Ct=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(Te);if(Ct!==null){_e!==void 0&&r(s[ie].n,`\`choice ${C}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let jn=Ct[2];z.push({when:Ct[1].trim(),next:`@terminal:${jn}`}),c.push({srcDeclId:C,port:jn,dstDeclId:Ct[3],line:s[ie].n});continue}let Ha=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(Te);if(Ha!==null){_e!==void 0&&r(s[ie].n,`\`choice ${C}\` has more than one \`default\``);let jn=Ha[1];_e=`@terminal:${jn}`,c.push({srcDeclId:C,port:jn,dstDeclId:Ha[2],line:s[ie].n});continue}break}z.length===0&&r(N,`\`choice ${C}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),h(C,"lmctl/choice",{branches:z,..._e!==void 0?{default_next:_e}:{}},N,!1),k=ie-1;continue}if(F==="loop"){let j=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${L}`);h(j[1],"lmctl/loop",ur(j[2],N,r),N,!1);continue}if(F==="foreach"){let j=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${L}`),C=ur(j[2],N,r);"mode"in C&&r(N,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),h(j[1],"lmctl/foreach",C,N,!1);continue}if(F==="call"){let j=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${L}`),C=j[1],z=ur(j[2],N,r),_e=z.workflow;(typeof _e!="string"||_e.length===0)&&r(N,`\`call ${C}\` requires a \`workflow=<name>\` argument`);let{workflow:ie,...Te}=z;h(C,"lmctl/subflow",{workflow_name:_e,...Te},N,!1),u.push({declId:C,target:_e,line:N});continue}if(F==="decide"){let j=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(L)??r(N,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${L}`),C=j[1],z=ur(j[2],N,r),{branches:_e,nextIdx:ie}=S(k);_e.length===0&&r(N,`\`decide ${C}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),h(C,"lmctl/interactive",{termination:{operator_signal:!0}},N,!1,{agent:z});for(let Te of _e)c.push({srcDeclId:C,port:Te.label,dstDeclId:Te.dst,line:N});k=ie;continue}if(F==="entry"){let j=/^entry\s+([A-Za-z][\w-]*)$/.exec(L)??r(N,`malformed \`entry\` (expected \`entry <id>\`): ${L}`);f!==void 0&&r(N,`duplicate \`entry\` (already set to ${f})`),f=j[1];continue}r(N,`unknown statement \`${F}\` (grammar: workflow / meta / trigger / mcp / skill / step / terminal / seq / choice / loop / foreach / call / decide / entry)`)}d.length===0&&r(s[0].n,"composition declares no steps"),f===void 0&&(f=d[0]),l.has(f)||r(s[0].n,`entry references undeclared step: ${f}`);let y=k=>{if(Array.isArray(k)){for(let L of k)y(L);return}if(typeof k!="object"||k===null)return;let N=k;if(typeof N.alias=="string")for(let[L,F]of[["mcp",_],["skills",g]]){let j=N[L];Array.isArray(j)&&(N[L]=j.map(C=>typeof C=="string"&&F.has(C)?structuredClone(F.get(C)):C))}for(let L of Object.values(N))y(L)};for(let k of d){let N=l.get(k);N.members!==void 0&&y(N.members)}let w=k=>ah(o,k),I=d.map(k=>{let N=l.get(k);return{id:w(k),name:k,type:N.type,typeVersion:1,parameters:N.params,...N.members?{members:N.members}:{}}}),x={};for(let k of c){l.has(k.srcDeclId)||r(k.line,`edge source references undeclared step: ${k.srcDeclId}`),l.has(k.dstDeclId)||r(k.line,`dangling edge target: ${k.dstDeclId} is not declared`),l.get(k.srcDeclId).isTerminal&&r(k.line,`terminal \`${k.srcDeclId}\` cannot have an outgoing edge`);let N=w(k.srcDeclId);x[N]??={},x[N][k.port]!==void 0&&r(k.line,`duplicate edge port \`${k.port}\` on step \`${k.srcDeclId}\``),x[N][k.port]=[[{step_id:w(k.dstDeclId),type:"main",index:0}]]}for(let k of d){let N=l.get(k);pR.has(N.type)||r(N.line,`unknown archetype \`${N.type}\` for step \`${k}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let k of u)k.target===o&&r(k.line,`subflow cycle: \`call ${k.declId}\` invokes this workflow (\`${o}\`) \u2014 direct recursion is not allowed (cross-workflow A\u2192B\u2192A cycle detection is deferred to the M3 compile.ts seam)`);let U=new Map;for(let k of c){let N=U.get(k.srcDeclId);N===void 0?U.set(k.srcDeclId,[k.dstDeclId]):N.push(k.dstDeclId)}for(let k of d){let N=l.get(k);if(N.type!=="lmctl/loop")continue;let L=N.params.body;if(typeof L=="string"&&l.has(L)){let F=U.get(k);F===void 0?U.set(k,[L]):F.push(L)}}let ue=new Set([f]),W=[f];for(;W.length>0;){let k=W.shift();for(let N of U.get(k)??[])ue.has(N)||(ue.add(N),W.push(N))}for(let k of d)ue.has(k)||r(l.get(k).line,`step \`${k}\` is unreachable from entry \`${f}\``);let M=new Map;for(let k of c){let N=M.get(k.srcDeclId);N===void 0&&(N=new Set,M.set(k.srcDeclId,N)),N.add(k.port)}let A=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let k of d){let N=l.get(k);if(N.isTerminal)continue;let L=M.get(k)??new Set;if(N.type==="lmctl/review"){let j=[...L].some(C=>!A.has(C));!L.has("approve")&&!j&&r(N.line,`uncovered outcome: review step \`${k}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${k} -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 F=_R[N.type];if(F!==void 0)for(let j of F)L.has(j)||r(N.line,`uncovered outcome: required outcome \`${j}\` of step \`${k}\` (\`${N.type}\`) has no connection \u2014 route it (\`seq ${k} -${j}-> <target|terminal>\`)`);else L.size===0&&r(N.line,`uncovered outcome: non-terminal step \`${k}\` (\`${N.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let k of d){let N=l.get(k),L=uR[N.type];if(L===void 0)continue;let F={...N.params,...N.members??{},type:L.v2type,state_name:k,...Object.keys(L.outcomes).length>0?{outcomes:L.outcomes}:{}},j=L.schema.safeParse(F);if(!j.success){let C=j.error.issues[0],z=C.path.length===0?"$":C.path.map(String).join(".");r(N.line,`step \`${k}\` (\`${N.type}\`) has invalid params for archetype \`${L.v2type}\` at \`${z}\`: ${C.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${k} = ${N.type.replace("lmctl/","")}({ ... })\``)}}let Q={schema_version:"lmctl/v3",definition_schema_version:3,name:o,version:a,...m,...p.size>0?{triggers:[...p.values()]}:{},steps:I,connections:x,entry_step_id:w(f)},B=It.safeParse(Q);if(!B.success)throw new dn(B.error.issues.map(k=>({line:s[0].n,message:`emitted V3 invalid at ${k.path.length===0?"$":k.path.map(String).join(".")}: ${k.message}`})));return B.data}function hR(e){let t=null;for(let r=0;r<e.length;r+=1){let n=e[r];if(t!==null){if(n==="\\"){r+=1;continue}n===t&&(t=null);continue}if(n==='"'||n==="'"){t=n;continue}if(n==="#")return e.slice(0,r)}return e}function ur(e,t,r){let n=e.trim();if(n.length===0)return{};if(n.startsWith("{")){let i;try{i=JSON.parse(n)}catch(o){r(t,`malformed structured args (expected a single-line JSON object): ${o.message}`)}return(i===null||typeof i!="object"||Array.isArray(i))&&r(t,"structured args must be a JSON object"),i}let s={};for(let i of gR(n)){let o=i.indexOf("=");o===-1&&r(t,`malformed arg (expected k=v): ${i}`);let a=i.slice(0,o).trim(),l=i.slice(o+1).trim();/^[A-Za-z_][\w-]*$/.test(a)||r(t,`invalid arg name: ${a}`),s[a]=mh(l)}return s}function gR(e){return e.split(",").map(t=>t.trim()).filter(t=>t.length>0)}function mh(e){return e.startsWith('"')&&e.endsWith('"')||e.startsWith("'")&&e.endsWith("'")?e.slice(1,-1):e==="true"?!0:e==="false"?!1:/^-?\d+$/.test(e)?Number.parseInt(e,10):/^-?\d*\.\d+$/.test(e)?Number.parseFloat(e):e}var uR,fR,ch,dn,pR,_R,dh,uh,ph=T(()=>{"use strict";cn();lh();ln();uR={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:zi},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:Zi},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:Qi},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:eo},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:to}},fR={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};ch={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"},dn=class extends Error{issues;constructor(t){super(`composition DSL compile failed:
|
|
1755
1755
|
${t.map(r=>` line ${r.line}: ${r.message}`).join(`
|
|
1756
1756
|
`)}`),this.issues=t,this.name="DslCompileError"}},pR=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"]),_R={"lmctl/consolidate":["ok"],"lmctl/interactive":["done"],"lmctl/loop":["ok"],"lmctl/foreach":["all_ok"]},dh=new Set(["requires","default_task_timeout_ms","errors","concurrency_key","concurrent_limit"]),uh={"trigger-schedule":"lmctl/trigger-schedule","trigger-gh-issue":"lmctl/trigger-gh-issue"}});import{readFileSync as yR}from"node:fs";function wR(){let e=process.env.LMCTL_DSL;return e===void 0?!0:!["0","false","off"].includes(e.trim().toLowerCase())}function ER(e){for(let t of e.split(`
|
|
1757
|
-
`)){let r=t.replace(/#.*/,"").trim();if(r.length!==0)return/^workflow\s+\S+\s+v\d+\s*$/.test(r)}return!1}function ct(e){if(typeof e=="string"&&wR()&&ER(e)){let r;try{r=fh(e)}catch(s){throw s instanceof dn?new Xt(s.issues.map(i=>({path:`dsl:${i.line}`,message:i.message}))):s}let n=It.safeParse(r);if(!n.success)throw new Xt(n.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));return n.data}let t=
|
|
1758
|
-
`)||t.startsWith("{")||t.startsWith("[")?_h(e):t.endsWith(".json")?_h(yR(t,"utf8")):e}function _h(e){return JSON.parse(e)}function SR(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var Pc,Xt,cs=T(()=>{"use strict";ln();oh();Dc();cn();ph();Pc=class extends Error{causeError;constructor(t){super("compiler emitted invalid atomic workflow"),this.causeError=t,this.name="CompilerInvariantError"}},Xt=class extends Error{issues;constructor(t){super("compound workflow validation failed"),this.issues=t,this.name="CompilerValidationError"}}});function so(e){let t=e.workflow?.concurrent_limit??1,r=e.job.concurrency_key_resolved??e.workflow?.concurrency_key??null;return r===null||r.trim().length===0?{concurrency_key:null,concurrent_limit:t}:{concurrency_key:vR(r,{job:{id:e.job.id,kind:e.job.source,source:e.job.source,source_ref:e.job.source_ref,payload:IR(e.job.payload)},project:e.project===null?null:{id:e.project.id,name:e.project.name}}),concurrent_limit:t}}function vR(e,t){return e.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(r,n)=>{let s=kR(t,n.trim());return s==null?"":typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):JSON.stringify(s)})}function kR(e,t){let r=e;for(let n of t.split(".")){if(typeof r!="object"||r===null||!Object.prototype.hasOwnProperty.call(r,n))return;r=r[n]}return r}function IR(e){if(e===null||e.trim().length===0)return null;try{return JSON.parse(e)}catch{return e}}var Fc=T(()=>{"use strict"});var hh={};ye(hh,{enqueueFromAgentOutput:()=>xR,enqueueFromGitHubIssue:()=>Uc,enqueueManual:()=>NR,enqueueScheduled:()=>AR});function Uc(e,t){return oo(e,{project_id:t.project_id,workflow_id_override:t.workflow_id_override??null,source:"gh_issue",source_ref:t.issue_url,dedupe_key:t.dedupe_key??t.issue_url,payload:io(t.payload),concurrency_key:t.concurrency_key,priority:t.priority})}function NR(e,t){return oo(e,{project_id:t.project_id,workflow_id_override:null,source:"manual",source_ref:t.source_ref??null,dedupe_key:t.source_ref??null,payload:io(t.payload),concurrency_key:t.concurrency_key})}function xR(e,t){let r=t.sequence===void 0?`run:${t.parent_run_id}`:`run:${t.parent_run_id}:${t.sequence}`;return oo(e,{project_id:t.project_id,workflow_id_override:null,source:"agent_output",source_ref:r,dedupe_key:r,available_at:t.available_at,payload:io(t.payload),concurrency_key:t.concurrency_key})}function AR(e,t){return oo(e,{project_id:t.project_id,workflow_id_override:null,source:"schedule",source_ref:t.source_ref,dedupe_key:t.source_ref,available_at:t.available_at,payload:io(t.payload),concurrency_key:t.concurrency_key})}function io(e){return e==null?null:typeof e=="string"?e:JSON.stringify(e)}function oo(e,t){let r=t.concurrency_key;if(r!==void 0)return e.enqueueJob({...t,concurrency_key:r});let n=e.getProject(t.project_id),s=n===null?null:t.workflow_id_override!==void 0&&t.workflow_id_override!==null?e.getWorkflow(t.workflow_id_override):e.getWorkflowByName(n.workflow_name);if(n===null||s===null)return e.enqueueJob(t);try{let i=ct(s.definition),o={id:-1,project_id:t.project_id,workflow_id_override:t.workflow_id_override??null,source:t.source,source_ref:t.source_ref??null,payload:t.payload??null,status:"queued",priority:t.priority??0,available_at:t.available_at??new Date().toISOString(),locked_by:null,locked_until:null,attempt_count:0,last_error:null,dedupe_key:t.dedupe_key??null,concurrency_key_resolved:null,enqueued_at:new Date().toISOString(),started_at:null,ended_at:null,run_id:null},a=so({workflow:i,job:o,project:n});return e.enqueueJob({...t,concurrency_key:a.concurrency_key})}catch{return e.enqueueJob(t)}}var Wc=T(()=>{"use strict";cs();Fc()});async function yh(e){let t=e.dal.listProjectWorkflows(e.project.id,{enabled_only:!0});if(t.length===0)return gh(e.dal,e.project.id,e.issue,e.issue.url,null,e.issue,void 0);let r={event:{kind:"github_issue",issue:e.issue}},n=[],s=0;for(let i of t){if(!await RR(i.condition,r))continue;let o=`${e.issue.url}#workflow:${i.workflow_id}`,a={issue:e.issue,...LR(i.parameters_override)},l=gh(e.dal,e.project.id,e.issue,o,i.workflow_id,a,-i.priority);n.push(...l.jobs),s+=l.new_jobs}return{jobs:n,new_jobs:s}}function gh(e,t,r,n,s,i,o){let a=e.findJobBySourceAndDedupe("gh_issue",n);return{jobs:[Uc(e,{project_id:t,issue_url:r.url,payload:i,workflow_id_override:s,dedupe_key:n,priority:o})],new_jobs:a===null?1:0}}async function RR(e,t){if(e===null||e.trim().length===0)return!0;try{return await $r(e,t)===!0}catch{return!1}}function LR(e){if(e===null||e.trim().length===0)return{};try{let t=JSON.parse(e);if(t!==null&&typeof t=="object"&&!Array.isArray(t))return t}catch{return{}}return{}}var wh=T(()=>{"use strict";as();Wc()});import{spawnSync as OR}from"node:child_process";async function $R(e){let t=e.labels??["bug"],r=e.state??"open",n=["issue","list","--repo",e.project.name,"--state",r,"--json","number,title,url,body,state,labels","--limit","100"];t.length>0&&n.splice(4,0,"--label",t.join(","));let s=OR(e.binary??"gh",n,{encoding:"utf8",timeout:e.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 i;try{i=JSON.parse(s.stdout??"[]")}catch{throw new Error("gh issue list returned malformed JSON")}if(!MR(i))throw new Error("gh issue list returned unexpected JSON shape");let o=0;for(let a of i){let l=await yh({dal:e.dal,project:e.project,issue:jR(a)});o+=l.new_jobs}return{scanned:i.length,new_jobs:o}}async function ao(e){if(process.env.LMCTL_INTAKE_DISABLED==="1")return[];let t=[];for(let r of e.listProjectsWithIntakeEnabled()){let n=CR(r.intake_config);try{let s=await $R({dal:e,project:r,labels:n.labels,state:n.state});t.push({project_id:r.id,project_name:r.name,...s})}catch(s){let i=s instanceof Error?s.message:String(s);t.push({project_id:r.id,project_name:r.name,scanned:0,new_jobs:0,error:i});try{e.raiseAttention({kind:"daemon_intake_scan_failed",severity:"warn",project_id:r.id,payload:JSON.stringify({project_id:r.id,project_name:r.name,error:i})})}catch{}}}return t}function CR(e){if(e===null)return{};try{let t=JSON.parse(e);if(!Bc(t))return{};let r=t.state==="open"||t.state==="closed"||t.state==="all"?t.state:void 0,n=Array.isArray(t.labels)?t.labels.filter(s=>typeof s=="string"&&s.length>0):void 0;return{scan_github_issues:t.scan_github_issues===!0,labels:n,state:r}}catch{return{}}}function MR(e){return Array.isArray(e)&&e.every(t=>{if(!Bc(t))return!1;let r=t.labels;return typeof t.number=="number"&&typeof t.title=="string"&&typeof t.url=="string"&&(typeof t.body=="string"||t.body===null||t.body===void 0)&&(t.state===void 0||typeof t.state=="string")&&(r===void 0||Array.isArray(r)&&r.every(n=>typeof n=="string"?!0:Bc(n)&&typeof n.name=="string"))})}function jR(e){let t=e.labels?.map(s=>typeof s=="string"?s:s.name),{labels:r,...n}=e;return t===void 0?n:{...n,labels:t}}function Bc(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}var qc=T(()=>{"use strict";wh()});function Th(e){return async t=>PR(e.app,t,e.log!==void 0?{log:e.log}:{})}async function PR(e,t,r={}){let n=FR(t.path),s={"content-type":"application/json",...t.headers??{},[lo]:Hc},i={method:t.method,headers:s};t.body!==void 0&&t.method!=="GET"&&t.method!=="DELETE"&&(i.body=typeof t.body=="string"?t.body:JSON.stringify(t.body));let o=new Request(n,i),a=Date.now();try{let l=await e.fetch(o),c=await UR(l);if(r.log!==void 0){let d=Date.now()-a;r.log(`[mailbox-dispatch] ${t.method} ${Eh(t.path)} \u2192 ${c.status} (${d}ms)`)}return c}catch(l){if(r.log!==void 0){let c=Date.now()-a;r.log(`[mailbox-dispatch] ${t.method} ${Eh(t.path)} \u2192 ERR (${c}ms)`)}throw l}}function Eh(e){let t=e.startsWith("/")?e:`/${e}`,r=t.search(/[?#]/);return r===-1?t:t.slice(0,r)}function FR(e){let t=e.startsWith("/")?e:`/${e}`;return`${DR}${t}`}async function UR(e){let t=await e.text(),r;if(t==="")r=void 0;else try{r=JSON.parse(t)}catch{r=t}let n={};e.headers.forEach((i,o)=>{o.toLowerCase()!==lo&&(n[o]=i)});let s={status:e.status};return Object.keys(n).length>0&&(s.headers=n),r!==void 0&&(s.body=r),s}var lo,Hc,DR,Jc=T(()=>{"use strict";lo="x-mailbox-channel",Hc="1",DR="http://mailbox.local"});import{createHash as bh,createHmac as WR,timingSafeEqual as BR}from"node:crypto";function Sh(){return async(e,t)=>{let r=vh();if(r===null||GR(e.req.path)){await t();return}if(e.req.path.startsWith("/mailbox/")&&e.req.header(lo)===Hc){await t();return}let n=e.req.query("token");if(n!==void 0&&co(n,r)){Gc(e,r),await t();return}if(XR(e,r)){await t();return}return e.req.path.startsWith("/api/")||e.req.path.startsWith("/mailbox/")?e.json({error:"API requires auth; set LMCTL_API_TOKEN"},401):e.redirect("/login",302)}}function vh(){let e=process.env.LMCTL_API_TOKEN;return e&&e.length>0?e:null}function kh(e){let t=vh();return t!==null&&co(e,t)}function Gc(e,t,r=new Date){e.header("Set-Cookie",`${Xc}=${HR(t,r)}; Path=/; HttpOnly; SameSite=Lax`)}function Ih(e){e.header("Set-Cookie",`${Xc}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`)}function HR(e,t=new Date){let n=`auth=ok|${new Date(t.getTime()+qR*24*60*60*1e3).toISOString()}`;return Buffer.from(`${n}|${Nh(e,n)}`,"utf8").toString("base64url")}function JR(e,t,r=new Date){let n;try{n=Buffer.from(e,"base64url").toString("utf8")}catch{return!1}let s=n.split("|");if(s.length!==3||s[0]!=="auth=ok")return!1;let i=new Date(s[1]);return Number.isNaN(i.getTime())||i.getTime()<=r.getTime()?!1:co(s[2],Nh(t,`${s[0]}|${s[1]}`))}function co(e,t){return BR(bh("sha256").update(e).digest(),bh("sha256").update(t).digest())}function XR(e,t){let r=/^Bearer\s+(.+)$/i.exec(e.req.header("authorization")??"")?.[1];if(r!==void 0&&co(r,t))return!0;let n=VR(e.req.header("cookie")??"")[Xc];return n!==void 0&&JR(n,t)}function GR(e){return e==="/login"||e==="/logout"}function VR(e){let t={};for(let r of e.split(";")){let[n,...s]=r.trim().split("=");n===void 0||n.length===0||s.length===0||(t[n]=s.join("="))}return t}function Nh(e,t){return WR("sha256",e).update(t).digest("hex")}var Xc,qR,xh=T(()=>{"use strict";Jc();Xc="lmctl_next_session",qR=30});import{existsSync as un,mkdirSync as KR,readdirSync as YR,readFileSync as uo,unlinkSync as zR,writeFileSync as Yc}from"node:fs";import{join as Cr}from"node:path";function et(e){if(!ZR.test(e))throw new Error(`invalid memory name "${e}": only alphanumeric characters, underscores, and hyphens are allowed`)}function Rh(e,t){let r=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(r===null)return null;let n=r[1],s=r[2].trimStart(),i=n.match(/^type:\s*(.+)$/m),o=n.match(/^description:\s*(.+)$/m),a=i?.[1]?.trim()??"";return rL(a)?{name:e,type:a,description:o?.[1]?.trim()??null,body:s,created_at:Ah,updated_at:Ah}:null}function QR(e,t,r,n){let s=r!==null?`
|
|
1757
|
+
`)){let r=t.replace(/#.*/,"").trim();if(r.length!==0)return/^workflow\s+\S+\s+v\d+\s*$/.test(r)}return!1}function ct(e){if(typeof e=="string"&&wR()&&ER(e)){let r;try{r=fh(e)}catch(s){throw s instanceof dn?new Xt(s.issues.map(i=>({path:`dsl:${i.line}`,message:i.message}))):s}let n=It.safeParse(r);if(!n.success)throw new Xt(n.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));return n.data}let t=so(bR(e));if(SR(t)&&t.definition_schema_version===3){let r=It.safeParse(t);if(!r.success)throw new Xt(r.error.issues.map(n=>({path:n.path.length===0?"$":n.path.map(String).join("."),message:n.message})));return r.data}return TR(t)}function TR(e){let t=ro.safeParse(e);if(!t.success)throw new Xt(t.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));let r=t.data,n=new Set(["Task","Pause","Parallel","LoopUntil","Pass","Fail","Succeed"]);for(let[s,i]of Object.entries(r.states))if(n.has(i.type))throw new Xt([{path:`states.${s}`,message:`v2 workflows (primitive_version: 2) may not use v1 primitive type: ${i.type}`}]);try{return sh(r)}catch(s){throw s instanceof Jt?new Pc(s):s}}function bR(e){if(typeof e!="string")return e;let t=e.trim();return e.includes(`
|
|
1758
|
+
`)||t.startsWith("{")||t.startsWith("[")?_h(e):t.endsWith(".json")?_h(yR(t,"utf8")):e}function _h(e){return JSON.parse(e)}function SR(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var Pc,Xt,cs=T(()=>{"use strict";ln();oh();Dc();cn();ph();Pc=class extends Error{causeError;constructor(t){super("compiler emitted invalid atomic workflow"),this.causeError=t,this.name="CompilerInvariantError"}},Xt=class extends Error{issues;constructor(t){super("compound workflow validation failed"),this.issues=t,this.name="CompilerValidationError"}}});function io(e){let t=e.workflow?.concurrent_limit??1,r=e.job.concurrency_key_resolved??e.workflow?.concurrency_key??null;return r===null||r.trim().length===0?{concurrency_key:null,concurrent_limit:t}:{concurrency_key:vR(r,{job:{id:e.job.id,kind:e.job.source,source:e.job.source,source_ref:e.job.source_ref,payload:IR(e.job.payload)},project:e.project===null?null:{id:e.project.id,name:e.project.name}}),concurrent_limit:t}}function vR(e,t){return e.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(r,n)=>{let s=kR(t,n.trim());return s==null?"":typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):JSON.stringify(s)})}function kR(e,t){let r=e;for(let n of t.split(".")){if(typeof r!="object"||r===null||!Object.prototype.hasOwnProperty.call(r,n))return;r=r[n]}return r}function IR(e){if(e===null||e.trim().length===0)return null;try{return JSON.parse(e)}catch{return e}}var Fc=T(()=>{"use strict"});var hh={};we(hh,{enqueueFromAgentOutput:()=>xR,enqueueFromGitHubIssue:()=>Uc,enqueueManual:()=>NR,enqueueScheduled:()=>AR});function Uc(e,t){return ao(e,{project_id:t.project_id,workflow_id_override:t.workflow_id_override??null,source:"gh_issue",source_ref:t.issue_url,dedupe_key:t.dedupe_key??t.issue_url,payload:oo(t.payload),concurrency_key:t.concurrency_key,priority:t.priority})}function NR(e,t){return ao(e,{project_id:t.project_id,workflow_id_override:null,source:"manual",source_ref:t.source_ref??null,dedupe_key:t.source_ref??null,payload:oo(t.payload),concurrency_key:t.concurrency_key})}function xR(e,t){let r=t.sequence===void 0?`run:${t.parent_run_id}`:`run:${t.parent_run_id}:${t.sequence}`;return ao(e,{project_id:t.project_id,workflow_id_override:null,source:"agent_output",source_ref:r,dedupe_key:r,available_at:t.available_at,payload:oo(t.payload),concurrency_key:t.concurrency_key})}function AR(e,t){return ao(e,{project_id:t.project_id,workflow_id_override:null,source:"schedule",source_ref:t.source_ref,dedupe_key:t.source_ref,available_at:t.available_at,payload:oo(t.payload),concurrency_key:t.concurrency_key})}function oo(e){return e==null?null:typeof e=="string"?e:JSON.stringify(e)}function ao(e,t){let r=t.concurrency_key;if(r!==void 0)return e.enqueueJob({...t,concurrency_key:r});let n=e.getProject(t.project_id),s=n===null?null:t.workflow_id_override!==void 0&&t.workflow_id_override!==null?e.getWorkflow(t.workflow_id_override):e.getWorkflowByName(n.workflow_name);if(n===null||s===null)return e.enqueueJob(t);try{let i=ct(s.definition),o={id:-1,project_id:t.project_id,workflow_id_override:t.workflow_id_override??null,source:t.source,source_ref:t.source_ref??null,payload:t.payload??null,status:"queued",priority:t.priority??0,available_at:t.available_at??new Date().toISOString(),locked_by:null,locked_until:null,attempt_count:0,last_error:null,dedupe_key:t.dedupe_key??null,concurrency_key_resolved:null,enqueued_at:new Date().toISOString(),started_at:null,ended_at:null,run_id:null},a=io({workflow:i,job:o,project:n});return e.enqueueJob({...t,concurrency_key:a.concurrency_key})}catch{return e.enqueueJob(t)}}var Wc=T(()=>{"use strict";cs();Fc()});async function yh(e){let t=e.dal.listProjectWorkflows(e.project.id,{enabled_only:!0});if(t.length===0)return gh(e.dal,e.project.id,e.issue,e.issue.url,null,e.issue,void 0);let r={event:{kind:"github_issue",issue:e.issue}},n=[],s=0;for(let i of t){if(!await RR(i.condition,r))continue;let o=`${e.issue.url}#workflow:${i.workflow_id}`,a={issue:e.issue,...LR(i.parameters_override)},l=gh(e.dal,e.project.id,e.issue,o,i.workflow_id,a,-i.priority);n.push(...l.jobs),s+=l.new_jobs}return{jobs:n,new_jobs:s}}function gh(e,t,r,n,s,i,o){let a=e.findJobBySourceAndDedupe("gh_issue",n);return{jobs:[Uc(e,{project_id:t,issue_url:r.url,payload:i,workflow_id_override:s,dedupe_key:n,priority:o})],new_jobs:a===null?1:0}}async function RR(e,t){if(e===null||e.trim().length===0)return!0;try{return await $r(e,t)===!0}catch{return!1}}function LR(e){if(e===null||e.trim().length===0)return{};try{let t=JSON.parse(e);if(t!==null&&typeof t=="object"&&!Array.isArray(t))return t}catch{return{}}return{}}var wh=T(()=>{"use strict";as();Wc()});import{spawnSync as OR}from"node:child_process";async function $R(e){let t=e.labels??["bug"],r=e.state??"open",n=["issue","list","--repo",e.project.name,"--state",r,"--json","number,title,url,body,state,labels","--limit","100"];t.length>0&&n.splice(4,0,"--label",t.join(","));let s=OR(e.binary??"gh",n,{encoding:"utf8",timeout:e.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 i;try{i=JSON.parse(s.stdout??"[]")}catch{throw new Error("gh issue list returned malformed JSON")}if(!MR(i))throw new Error("gh issue list returned unexpected JSON shape");let o=0;for(let a of i){let l=await yh({dal:e.dal,project:e.project,issue:jR(a)});o+=l.new_jobs}return{scanned:i.length,new_jobs:o}}async function lo(e){if(process.env.LMCTL_INTAKE_DISABLED==="1")return[];let t=[];for(let r of e.listProjectsWithIntakeEnabled()){let n=CR(r.intake_config);try{let s=await $R({dal:e,project:r,labels:n.labels,state:n.state});t.push({project_id:r.id,project_name:r.name,...s})}catch(s){let i=s instanceof Error?s.message:String(s);t.push({project_id:r.id,project_name:r.name,scanned:0,new_jobs:0,error:i});try{e.raiseAttention({kind:"daemon_intake_scan_failed",severity:"warn",project_id:r.id,payload:JSON.stringify({project_id:r.id,project_name:r.name,error:i})})}catch{}}}return t}function CR(e){if(e===null)return{};try{let t=JSON.parse(e);if(!Bc(t))return{};let r=t.state==="open"||t.state==="closed"||t.state==="all"?t.state:void 0,n=Array.isArray(t.labels)?t.labels.filter(s=>typeof s=="string"&&s.length>0):void 0;return{scan_github_issues:t.scan_github_issues===!0,labels:n,state:r}}catch{return{}}}function MR(e){return Array.isArray(e)&&e.every(t=>{if(!Bc(t))return!1;let r=t.labels;return typeof t.number=="number"&&typeof t.title=="string"&&typeof t.url=="string"&&(typeof t.body=="string"||t.body===null||t.body===void 0)&&(t.state===void 0||typeof t.state=="string")&&(r===void 0||Array.isArray(r)&&r.every(n=>typeof n=="string"?!0:Bc(n)&&typeof n.name=="string"))})}function jR(e){let t=e.labels?.map(s=>typeof s=="string"?s:s.name),{labels:r,...n}=e;return t===void 0?n:{...n,labels:t}}function Bc(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}var qc=T(()=>{"use strict";wh()});function Th(e){return async t=>PR(e.app,t,e.log!==void 0?{log:e.log}:{})}async function PR(e,t,r={}){let n=FR(t.path),s={"content-type":"application/json",...t.headers??{},[co]:Hc},i={method:t.method,headers:s};t.body!==void 0&&t.method!=="GET"&&t.method!=="DELETE"&&(i.body=typeof t.body=="string"?t.body:JSON.stringify(t.body));let o=new Request(n,i),a=Date.now();try{let l=await e.fetch(o),c=await UR(l);if(r.log!==void 0){let d=Date.now()-a;r.log(`[mailbox-dispatch] ${t.method} ${Eh(t.path)} \u2192 ${c.status} (${d}ms)`)}return c}catch(l){if(r.log!==void 0){let c=Date.now()-a;r.log(`[mailbox-dispatch] ${t.method} ${Eh(t.path)} \u2192 ERR (${c}ms)`)}throw l}}function Eh(e){let t=e.startsWith("/")?e:`/${e}`,r=t.search(/[?#]/);return r===-1?t:t.slice(0,r)}function FR(e){let t=e.startsWith("/")?e:`/${e}`;return`${DR}${t}`}async function UR(e){let t=await e.text(),r;if(t==="")r=void 0;else try{r=JSON.parse(t)}catch{r=t}let n={};e.headers.forEach((i,o)=>{o.toLowerCase()!==co&&(n[o]=i)});let s={status:e.status};return Object.keys(n).length>0&&(s.headers=n),r!==void 0&&(s.body=r),s}var co,Hc,DR,Jc=T(()=>{"use strict";co="x-mailbox-channel",Hc="1",DR="http://mailbox.local"});import{createHash as bh,createHmac as WR,timingSafeEqual as BR}from"node:crypto";function Sh(){return async(e,t)=>{let r=vh();if(r===null||GR(e.req.path)){await t();return}if(e.req.path.startsWith("/mailbox/")&&e.req.header(co)===Hc){await t();return}let n=e.req.query("token");if(n!==void 0&&uo(n,r)){Gc(e,r),await t();return}if(XR(e,r)){await t();return}return e.req.path.startsWith("/api/")||e.req.path.startsWith("/mailbox/")?e.json({error:"API requires auth; set LMCTL_API_TOKEN"},401):e.redirect("/login",302)}}function vh(){let e=process.env.LMCTL_API_TOKEN;return e&&e.length>0?e:null}function kh(e){let t=vh();return t!==null&&uo(e,t)}function Gc(e,t,r=new Date){e.header("Set-Cookie",`${Xc}=${HR(t,r)}; Path=/; HttpOnly; SameSite=Lax`)}function Ih(e){e.header("Set-Cookie",`${Xc}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`)}function HR(e,t=new Date){let n=`auth=ok|${new Date(t.getTime()+qR*24*60*60*1e3).toISOString()}`;return Buffer.from(`${n}|${Nh(e,n)}`,"utf8").toString("base64url")}function JR(e,t,r=new Date){let n;try{n=Buffer.from(e,"base64url").toString("utf8")}catch{return!1}let s=n.split("|");if(s.length!==3||s[0]!=="auth=ok")return!1;let i=new Date(s[1]);return Number.isNaN(i.getTime())||i.getTime()<=r.getTime()?!1:uo(s[2],Nh(t,`${s[0]}|${s[1]}`))}function uo(e,t){return BR(bh("sha256").update(e).digest(),bh("sha256").update(t).digest())}function XR(e,t){let r=/^Bearer\s+(.+)$/i.exec(e.req.header("authorization")??"")?.[1];if(r!==void 0&&uo(r,t))return!0;let n=VR(e.req.header("cookie")??"")[Xc];return n!==void 0&&JR(n,t)}function GR(e){return e==="/login"||e==="/logout"}function VR(e){let t={};for(let r of e.split(";")){let[n,...s]=r.trim().split("=");n===void 0||n.length===0||s.length===0||(t[n]=s.join("="))}return t}function Nh(e,t){return WR("sha256",e).update(t).digest("hex")}var Xc,qR,xh=T(()=>{"use strict";Jc();Xc="lmctl_next_session",qR=30});import{existsSync as un,mkdirSync as KR,readdirSync as YR,readFileSync as fo,unlinkSync as zR,writeFileSync as Yc}from"node:fs";import{join as Cr}from"node:path";function et(e){if(!ZR.test(e))throw new Error(`invalid memory name "${e}": only alphanumeric characters, underscores, and hyphens are allowed`)}function Rh(e,t){let r=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(r===null)return null;let n=r[1],s=r[2].trimStart(),i=n.match(/^type:\s*(.+)$/m),o=n.match(/^description:\s*(.+)$/m),a=i?.[1]?.trim()??"";return rL(a)?{name:e,type:a,description:o?.[1]?.trim()??null,body:s,created_at:Ah,updated_at:Ah}:null}function QR(e,t,r,n){let s=r!==null?`
|
|
1759
1759
|
description: ${r}`:"";return`---
|
|
1760
1760
|
name: ${e}${s}
|
|
1761
1761
|
type: ${t}
|
|
1762
1762
|
---
|
|
1763
|
-
${n}`}function eL(e,t,r,n){let s=Cr(e,zc),i=`- [${t}.md](${t}.md)${n!==null?` \u2014 ${n}`:""} (${r})`,o=un(s)?
|
|
1763
|
+
${n}`}function eL(e,t,r,n){let s=Cr(e,zc),i=`- [${t}.md](${t}.md)${n!==null?` \u2014 ${n}`:""} (${r})`,o=un(s)?fo(s,"utf8"):"",a=new RegExp(`^- \\[${Lh(t)}\\.md\\].*$`,"m");a.test(o)?o=o.replace(a,i):o=o.length>0&&!o.endsWith(`
|
|
1764
1764
|
`)?`${o}
|
|
1765
1765
|
${i}
|
|
1766
1766
|
`:`${o}${i}
|
|
1767
|
-
`,Yc(s,o,"utf8")}function tL(e,t){let r=Cr(e,zc);if(!un(r))return;let n=uo(r,"utf8"),s=new RegExp(`^- \\[${Lh(t)}\\.md\\].*$\\r?\\n?`,"m");s.test(n)&&Yc(r,n.replace(s,""),"utf8")}function Lh(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function rL(e){return e==="user"||e==="feedback"||e==="project"||e==="reference"}function dt(e,t){return e.durable_memory_mode==="db"?new Kc(t,e.id):new Vc(e.local_path)}var ZR,zc,Ah,Vc,Kc,Zc=T(()=>{"use strict";ZR=/^[a-zA-Z0-9_-]+$/;zc="MEMORY.md",Ah="1970-01-01T00:00:00.000Z",Vc=class{dir;constructor(t){this.dir=Cr(t,"durable-memory")}read(t){et(t);let r=Cr(this.dir,`${t}.md`);if(!un(r))return null;let n=uo(r,"utf8");return Rh(t,n)}write(t){et(t.name),KR(this.dir,{recursive:!0});let r=Cr(this.dir,`${t.name}.md`),n=!un(r),s=QR(t.name,t.type,t.description??null,t.body);return Yc(r,s,"utf8"),eL(this.dir,t.name,t.type,t.description??null),{created:n}}index(t){return this.listFiles().filter(r=>t===void 0||t.length===0||t.includes(r.type)).map(({name:r,type:n,description:s,updated_at:i})=>({name:r,type:n,description:s,updated_at:i}))}list(t){return this.listFiles().filter(r=>t===void 0||r.type===t).map(({name:r,type:n,updated_at:s})=>({name:r,type:n,updated_at:s}))}delete(t){et(t);let r=Cr(this.dir,`${t}.md`);return un(r)?(zR(r),tL(this.dir,t),!0):!1}listFiles(){if(!un(this.dir))return[];let t=YR(this.dir).filter(n=>n.endsWith(".md")&&n!==zc),r=[];for(let n of t){let s=n.slice(0,-3),i=uo(Cr(this.dir,n),"utf8"),o=Rh(s,i);o!==null&&r.push(o)}return r.sort((n,s)=>n.name.localeCompare(s.name))}};Kc=class{dal;projectId;constructor(t,r){this.dal=t,this.projectId=r}read(t){et(t);let r=this.dal.getDurableMemoryByName(this.projectId,t);return r===null?null:{name:r.name,type:r.type,description:r.description,body:r.body,created_at:r.created_at,updated_at:r.updated_at}}write(t){et(t.name);let r=this.dal.getDurableMemoryByName(this.projectId,t.name);return this.dal.upsertDurableMemory({project_id:this.projectId,type:t.type,name:t.name,description:t.description??null,body:t.body}),{created:r===null}}index(t){return this.dal.indexDurableMemory(this.projectId,t).map(n=>({name:n.name,type:n.type,description:n.description,updated_at:n.updated_at}))}list(t){return this.dal.listDurableMemory(this.projectId,t).map(n=>({name:n.name,type:n.type,updated_at:n.updated_at}))}delete(t){return et(t),this.dal.deleteDurableMemory(this.projectId,t)}}});function $h(e,t){let{dal:r}=t;e.get("/api/durable-memory/index/:project_id",n=>{let s=Number(n.req.param("project_id")),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let o=dt(i,r),a=n.req.query("types"),l=a!==void 0&&a.length>0?a.split(",").map(c=>c.trim()).filter(Boolean):void 0;return n.json(o.index(l))}),e.get("/api/durable-memory/read/:project_id/:name",n=>{let s=Number(n.req.param("project_id")),i=n.req.param("name"),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let a=dt(o,r),l;try{l=a.read(i)}catch(c){return n.json({error:c.message},400)}return l===null?n.json({error:`memory entry not found: ${i}`},404):n.json(l)}),e.post("/api/durable-memory/write/:project_id",async n=>{let s=Number(n.req.param("project_id")),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let o;try{o=await n.req.json()}catch{return n.json({error:"invalid JSON body"},400)}let a=typeof o.type=="string"?o.type:null,l=typeof o.name=="string"?o.name:null,c=typeof o.body=="string"?o.body:null,d=typeof o.description=="string"?o.description:null;if(a===null||!Oh.has(a))return n.json({error:`invalid type: must be one of ${[...Oh].join("|")}`},400);if(l===null)return n.json({error:"missing name"},400);if(c===null)return n.json({error:"missing body"},400);let u=dt(i,r),f;try{({created:f}=u.write({type:a,name:l,description:d,body:c}))}catch(m){return n.json({error:m.message},400)}return n.json({success:!0,created_or_updated:f?"created":"updated"})}),e.get("/api/durable-memory/list/:project_id",n=>{let s=Number(n.req.param("project_id")),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let o=dt(i,r),a=n.req.query("type");return n.json(o.list(a))})}var Oh,Ch=T(()=>{"use strict";Zc();Oh=new Set(["user","feedback","project","reference"])});function sL(e){let t=4294967295;for(let r=0;r<e.length;r+=1)t=(nL[(t^e[r])&255]^t>>>8)>>>0;return(t^4294967295)>>>0}function iL(e){let t=Math.max(1980,e.getFullYear()),r=(e.getHours()&31)<<11|(e.getMinutes()&63)<<5|Math.floor(e.getSeconds()/2)&31,n=(t-1980&127)<<9|(e.getMonth()+1&15)<<5|e.getDate()&31;return{time:r,date:n}}function Mh(e,t=new Date){let{time:r,date:n}=iL(t),s=[],i=[],o=0,a=new TextEncoder;for(let _ of e){let g=a.encode(_.name),h=sL(_.data),S=_.data.length,y=new Uint8Array(30+g.length),w=new DataView(y.buffer);w.setUint32(0,67324752,!0),w.setUint16(4,20,!0),w.setUint16(6,0,!0),w.setUint16(8,0,!0),w.setUint16(10,r,!0),w.setUint16(12,n,!0),w.setUint32(14,h,!0),w.setUint32(18,S,!0),w.setUint32(22,S,!0),w.setUint16(26,g.length,!0),w.setUint16(28,0,!0),y.set(g,30),s.push(y,_.data);let I=new Uint8Array(46+g.length),x=new DataView(I.buffer);x.setUint32(0,33639248,!0),x.setUint16(4,20,!0),x.setUint16(6,20,!0),x.setUint16(8,0,!0),x.setUint16(10,0,!0),x.setUint16(12,r,!0),x.setUint16(14,n,!0),x.setUint32(16,h,!0),x.setUint32(20,S,!0),x.setUint32(24,S,!0),x.setUint16(28,g.length,!0),x.setUint16(30,0,!0),x.setUint16(32,0,!0),x.setUint16(34,0,!0),x.setUint16(36,0,!0),x.setUint32(38,0,!0),x.setUint32(42,o,!0),I.set(g,46),i.push(I),o+=y.length+_.data.length}let l=o,c=0;for(let _ of i)c+=_.length;let d=new Uint8Array(22),u=new DataView(d.buffer);u.setUint32(0,101010256,!0),u.setUint16(4,0,!0),u.setUint16(6,0,!0),u.setUint16(8,e.length,!0),u.setUint16(10,e.length,!0),u.setUint32(12,c,!0),u.setUint32(16,l,!0),u.setUint16(20,0,!0);let f=l+c+d.length,m=new Uint8Array(f),p=0;for(let _ of s)m.set(_,p),p+=_.length;for(let _ of i)m.set(_,p),p+=_.length;return m.set(d,p),m}var nL,jh=T(()=>{"use strict";nL=(()=>{let e=new Uint32Array(256);for(let t=0;t<256;t+=1){let r=t;for(let n=0;n<8;n+=1)r=r&1?3988292384^r>>>1:r>>>1;e[t]=r>>>0}return e})()});import{existsSync as po,mkdirSync as oL,readdirSync as aL,readFileSync as Fh,statSync as lL,unlinkSync as cL,writeFileSync as dL}from"node:fs";import{join as fs}from"node:path";function Uh(e,t){let{dal:r}=t;e.post("/api/projects",async n=>{let s=await ut(n);if(typeof s=="string")return R(n,s,400);let i=oe(s,"name"),o=oe(s,"local_path");if(i===null||i.length===0)return R(n,"missing or empty name",400);if(o===null||o.length===0)return R(n,"missing or empty local_path",400);if(r.findProjectByName(i)!==null)return R(n,`project already exists: ${i}`,409);let a=oe(s,"workflow_name")??"bugfix",l,c=oe(s,"team_name");if(c!==null&&c.length>0){let u=r.findTeamByName(c);if(u===null)return R(n,`team not found: ${c}`,404);l=u.id}else{let u=r.listTeams();if(u.length===0)return R(n,"no teams exist; create a team first",400);l=u[0].id}let d=r.insertProject({name:i,local_path:o,workflow_name:a,team_id:l,default_branch:oe(s,"default_branch")});return n.json(d,201)}),e.patch("/api/projects/:name",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=await ut(n);if(typeof i=="string")return R(n,i,400);let o={};if(Object.prototype.hasOwnProperty.call(i,"local_path")){let l=i.local_path;if(typeof l!="string"||l.length===0)return R(n,"local_path must be a non-empty string",400);o.local_path=l}if(Object.prototype.hasOwnProperty.call(i,"durable_memory_mode")){let l=i.durable_memory_mode;if(l!=="folder"&&l!=="db")return R(n,'durable_memory_mode must be "folder" or "db"',400);o.durable_memory_mode=l}if(Object.prototype.hasOwnProperty.call(i,"default_branch")){let l=i.default_branch;if(l!==null&&typeof l!="string")return R(n,"default_branch must be string or null",400);o.default_branch=l}if(Object.prototype.hasOwnProperty.call(i,"intake_config")){let l=i.intake_config;if(l===null)o.intake_config=null;else if(typeof l=="string")o.intake_config=l;else if(typeof l=="object"&&!Array.isArray(l))o.intake_config=JSON.stringify(l);else return R(n,"intake_config must be a JSON object, string, or null",400)}let a=r.updateProjectSettings(s.id,o);return a===null?R(n,"project not found",404):n.json(a)}),e.post("/api/teams",async n=>{let s=await ut(n);if(typeof s=="string")return R(n,s,400);let i=oe(s,"name");if(i===null||i.length===0)return R(n,"missing or empty name",400);if(r.findTeamByName(i)!==null)return R(n,`team already exists: ${i}`,409);let o=r.insertTeam({name:i});return n.json(o,201)}),e.post("/api/teams/:name/members",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return R(n,"team not found",404);let i=await ut(n);if(typeof i=="string")return R(n,i,400);let o=oe(i,"alias"),a=oe(i,"provider");if(o===null||o.length===0)return R(n,"missing or empty alias",400);if(a===null||a.length===0)return R(n,"missing or empty provider",400);if(r.findTeamMemberByAlias(s.id,o)!==null)return R(n,`member already exists: ${o}`,409);let l=oe(i,"model"),c=r.insertTeamMember({team_id:s.id,alias:o,provider:a,model:l,sessiondir:`.lmctl/sessions/${s.name}/${o}`}),d=oe(i,"role_prompt");d!==null&&r.setMemberRolePrompt(c.id,d);let u=r.findTeamMemberByAlias(s.id,o);return n.json(u??c,201)}),e.put("/api/teams/:name/members/:alias",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return R(n,"team not found",404);let i=r.findTeamMemberByAlias(s.id,n.req.param("alias"));if(i===null)return R(n,"member not found",404);let o=await ut(n);if(typeof o=="string")return R(n,o,400);let a={};if(Object.prototype.hasOwnProperty.call(o,"role_prompt")){let c=o.role_prompt;if(c!==null&&typeof c!="string")return R(n,"role_prompt must be string or null",400);a.role_prompt=c}if(Object.prototype.hasOwnProperty.call(o,"model")){let c=o.model;if(c!==null&&typeof c!="string")return R(n,"model must be string or null",400);a.model=c}if(Object.prototype.hasOwnProperty.call(o,"provider")){let c=o.provider;if(typeof c!="string"||c.length===0)return R(n,"provider must be a non-empty string",400);a.provider=c}if(Object.keys(a).length===0)return R(n,"no updatable fields provided",400);let l=r.updateTeamMemberMeta(i.id,a);return l===null?R(n,"member not found",404):n.json(l)}),e.get("/api/projects/:name/durable-memory",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=dt(s,r);return n.json(i.index())}),e.post("/api/projects/:name/durable-memory",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=await ut(n);if(typeof i=="string")return R(n,i,400);let o=oe(i,"name"),a=oe(i,"body"),l=oe(i,"type");if(o===null||o.length===0)return R(n,"missing or empty name",400);if(a===null)return R(n,"missing body",400);if(l===null||!fo.includes(l))return R(n,`invalid type: must be one of ${fo.join("|")}`,400);try{et(o)}catch(u){return R(n,u.message,400)}let c=dt(s,r);try{if(c.read(o)!==null)return R(n,`chapter already exists: ${o}`,409)}catch(u){return R(n,u.message,400)}try{c.write({type:l,name:o,description:oe(i,"description"),body:a})}catch(u){return R(n,u.message,400)}let d=c.read(o);return d===null?R(n,"chapter created but unreadable",500):n.json(d,201)}),e.get("/api/projects/:name/durable-memory/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=dt(s,r),o;try{o=i.read(n.req.param("chapter"))}catch(a){return R(n,a.message,400)}return o===null?R(n,"chapter not found",404):n.json(o)}),e.put("/api/projects/:name/durable-memory/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=n.req.param("chapter"),o=await ut(n);if(typeof o=="string")return R(n,o,400);let a=dt(s,r),l;try{l=a.read(i)}catch(m){return R(n,m.message,400)}if(l===null)return R(n,"chapter not found",404);let c=oe(o,"body")??l.body,d=Object.prototype.hasOwnProperty.call(o,"description")?oe(o,"description"):l.description,u=oe(o,"type")??l.type;if(!fo.includes(u))return R(n,`invalid type: must be one of ${fo.join("|")}`,400);try{a.write({type:u,name:i,description:d,body:c})}catch(m){return R(n,m.message,400)}let f=a.read(i);return f===null?R(n,"chapter updated but unreadable",500):n.json(f)}),e.delete("/api/projects/:name/durable-memory/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=dt(s,r),o;try{o=i.delete(n.req.param("chapter"))}catch(a){return R(n,a.message,400)}return o?n.json({removed:!0}):R(n,"chapter not found",404)}),e.get("/api/projects/:name/ai-test",n=>{let s=r.findProjectByName(n.req.param("name"));return s===null?R(n,"project not found",404):n.json(fL(s.local_path))}),e.post("/api/projects/:name/ai-test",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=await ut(n);if(typeof i=="string")return R(n,i,400);let o=oe(i,"name"),a=oe(i,"body"),l=oe(i,"type");if(o===null||o.length===0)return R(n,"missing or empty name",400);if(a===null)return R(n,"missing body",400);if(l===null||!mo.has(l))return R(n,`invalid type: must be one of ${[...mo].join("|")}`,400);try{et(o)}catch(f){return R(n,f.message,400)}let c=ds(s.local_path),d=fs(c,`${o}.md`);if(po(d))return R(n,`chapter already exists: ${o}`,409);oL(c,{recursive:!0}),Ph(d,o,l,oe(i,"description"),a);let u=us(c,o);return u===null?R(n,"chapter created but unreadable",500):n.json(u,201)}),e.get("/api/projects/:name/ai-test/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);try{et(n.req.param("chapter"))}catch(o){return R(n,o.message,400)}let i=us(ds(s.local_path),n.req.param("chapter"));return i===null?R(n,"chapter not found",404):n.json(i)}),e.put("/api/projects/:name/ai-test/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=n.req.param("chapter");try{et(i)}catch(m){return R(n,m.message,400)}let o=ds(s.local_path),a=us(o,i);if(a===null)return R(n,"chapter not found",404);let l=await ut(n);if(typeof l=="string")return R(n,l,400);let c=oe(l,"body")??a.body,d=Object.prototype.hasOwnProperty.call(l,"description")?oe(l,"description"):a.description,u=oe(l,"type")??a.type;if(!mo.has(u))return R(n,`invalid type: must be one of ${[...mo].join("|")}`,400);Ph(fs(o,`${i}.md`),i,u,d,c);let f=us(o,i);return f===null?R(n,"chapter updated but unreadable",500):n.json(f)}),e.delete("/api/projects/:name/ai-test/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=n.req.param("chapter");try{et(i)}catch(a){return R(n,a.message,400)}let o=fs(ds(s.local_path),`${i}.md`);return po(o)?(cL(o),n.json({removed:!0})):R(n,"chapter not found",404)}),e.get("/api/tokens",n=>n.json([])),e.post("/api/tokens",n=>R(n,"scoped-tokens table not yet migrated; see briefs/scoped-tokens-design.md",501)),e.get("/api/settings",n=>n.json({})),e.patch("/api/settings",async n=>{let s=await ut(n);return typeof s=="string"?R(n,s,400):n.json({accepted:s,note:"settings persistence not yet implemented"})}),e.get("/api/chat/sessions",n=>n.json(r.listChatbotSessions(Dh))),e.post("/api/chat/sessions",async n=>{let s=await uL(n);if(typeof s=="string")return R(n,s,400);let i=s!==null?oe(s,"title"):null,o=r.createChatbotSession(Dh,i);return n.json(o,201)}),e.get("/api/chat/sessions/:id/messages",n=>{let s=n.req.param("id");return r.getChatbotSession(s)===null?R(n,"chat session not found",404):n.json(r.listChatbotMessages(s))}),e.post("/api/chat/sessions/:id/messages",async n=>{let s=n.req.param("id");if(r.getChatbotSession(s)===null)return R(n,"chat session not found",404);let i=await ut(n);if(typeof i=="string")return R(n,i,400);let o=oe(i,"role"),a=oe(i,"content");if(o===null||o!=="user"&&o!=="assistant"&&o!=="tool")return R(n,"role must be one of user|assistant|tool",400);if(a===null)return R(n,"missing content",400);let l=r.appendChatbotMessage(s,o,a);return n.json(l,201)}),e.get("/api/runs/:id/artifacts.zip",n=>{let s=Number(n.req.param("id"));if(!Number.isInteger(s))return R(n,"invalid run id",400);if(r.getRun(s)===null)return R(n,"run not found",404);let o=Lr(r,s),a=[];for(let c of o){let d=pL(c),u=null;if(c.content!==null&&c.content!==void 0)u=new TextEncoder().encode(c.content);else if(c.path!==null&&c.path!==void 0)try{let f=Fh(c.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);u=new Uint8Array(m)}catch{u=new Uint8Array(0)}u!==null&&a.push({name:d,data:u})}let l=Mh(a);return new Response(l,{status:200,headers:{"Content-Type":"application/zip","Content-Disposition":`attachment; filename="run-${s}-artifacts.zip"`,"Content-Length":String(l.byteLength)}})})}function R(e,t,r){return e.json({error:t},r)}async function ut(e){try{let t=await e.req.json();return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:"invalid JSON body"}catch{return"invalid JSON body"}}async function uL(e){let t=await e.req.text().catch(()=>"");if(t.trim().length===0)return null;try{let r=JSON.parse(t);return r!==null&&typeof r=="object"&&!Array.isArray(r)?r:"invalid JSON body"}catch{return"invalid JSON body"}}function oe(e,t){let r=e[t];return typeof r!="string"?null:r}function ds(e){return fs(e,"ai-test")}function us(e,t){let r=fs(e,`${t}.md`);if(!po(r))return null;let n=Fh(r,"utf8"),s=mL(n),i=lL(r).mtime.toISOString();return{name:t,type:s.type,description:s.description,body:s.body,updated_at:i}}function fL(e){let t=ds(e);return po(t)?aL(t).filter(r=>r.endsWith(".md")&&r!=="index.md").map(r=>r.slice(0,-3)).sort().map(r=>{let n=us(t,r);if(n===null)return null;let{name:s,type:i,description:o,updated_at:a}=n;return{name:s,type:i,description:o,updated_at:a}}).filter(r=>r!==null):[]}function Ph(e,t,r,n,s){let i=n!==null&&n.length>0?`
|
|
1767
|
+
`,Yc(s,o,"utf8")}function tL(e,t){let r=Cr(e,zc);if(!un(r))return;let n=fo(r,"utf8"),s=new RegExp(`^- \\[${Lh(t)}\\.md\\].*$\\r?\\n?`,"m");s.test(n)&&Yc(r,n.replace(s,""),"utf8")}function Lh(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function rL(e){return e==="user"||e==="feedback"||e==="project"||e==="reference"}function dt(e,t){return e.durable_memory_mode==="db"?new Kc(t,e.id):new Vc(e.local_path)}var ZR,zc,Ah,Vc,Kc,Zc=T(()=>{"use strict";ZR=/^[a-zA-Z0-9_-]+$/;zc="MEMORY.md",Ah="1970-01-01T00:00:00.000Z",Vc=class{dir;constructor(t){this.dir=Cr(t,"durable-memory")}read(t){et(t);let r=Cr(this.dir,`${t}.md`);if(!un(r))return null;let n=fo(r,"utf8");return Rh(t,n)}write(t){et(t.name),KR(this.dir,{recursive:!0});let r=Cr(this.dir,`${t.name}.md`),n=!un(r),s=QR(t.name,t.type,t.description??null,t.body);return Yc(r,s,"utf8"),eL(this.dir,t.name,t.type,t.description??null),{created:n}}index(t){return this.listFiles().filter(r=>t===void 0||t.length===0||t.includes(r.type)).map(({name:r,type:n,description:s,updated_at:i})=>({name:r,type:n,description:s,updated_at:i}))}list(t){return this.listFiles().filter(r=>t===void 0||r.type===t).map(({name:r,type:n,updated_at:s})=>({name:r,type:n,updated_at:s}))}delete(t){et(t);let r=Cr(this.dir,`${t}.md`);return un(r)?(zR(r),tL(this.dir,t),!0):!1}listFiles(){if(!un(this.dir))return[];let t=YR(this.dir).filter(n=>n.endsWith(".md")&&n!==zc),r=[];for(let n of t){let s=n.slice(0,-3),i=fo(Cr(this.dir,n),"utf8"),o=Rh(s,i);o!==null&&r.push(o)}return r.sort((n,s)=>n.name.localeCompare(s.name))}};Kc=class{dal;projectId;constructor(t,r){this.dal=t,this.projectId=r}read(t){et(t);let r=this.dal.getDurableMemoryByName(this.projectId,t);return r===null?null:{name:r.name,type:r.type,description:r.description,body:r.body,created_at:r.created_at,updated_at:r.updated_at}}write(t){et(t.name);let r=this.dal.getDurableMemoryByName(this.projectId,t.name);return this.dal.upsertDurableMemory({project_id:this.projectId,type:t.type,name:t.name,description:t.description??null,body:t.body}),{created:r===null}}index(t){return this.dal.indexDurableMemory(this.projectId,t).map(n=>({name:n.name,type:n.type,description:n.description,updated_at:n.updated_at}))}list(t){return this.dal.listDurableMemory(this.projectId,t).map(n=>({name:n.name,type:n.type,updated_at:n.updated_at}))}delete(t){return et(t),this.dal.deleteDurableMemory(this.projectId,t)}}});function $h(e,t){let{dal:r}=t;e.get("/api/durable-memory/index/:project_id",n=>{let s=Number(n.req.param("project_id")),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let o=dt(i,r),a=n.req.query("types"),l=a!==void 0&&a.length>0?a.split(",").map(c=>c.trim()).filter(Boolean):void 0;return n.json(o.index(l))}),e.get("/api/durable-memory/read/:project_id/:name",n=>{let s=Number(n.req.param("project_id")),i=n.req.param("name"),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let a=dt(o,r),l;try{l=a.read(i)}catch(c){return n.json({error:c.message},400)}return l===null?n.json({error:`memory entry not found: ${i}`},404):n.json(l)}),e.post("/api/durable-memory/write/:project_id",async n=>{let s=Number(n.req.param("project_id")),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let o;try{o=await n.req.json()}catch{return n.json({error:"invalid JSON body"},400)}let a=typeof o.type=="string"?o.type:null,l=typeof o.name=="string"?o.name:null,c=typeof o.body=="string"?o.body:null,d=typeof o.description=="string"?o.description:null;if(a===null||!Oh.has(a))return n.json({error:`invalid type: must be one of ${[...Oh].join("|")}`},400);if(l===null)return n.json({error:"missing name"},400);if(c===null)return n.json({error:"missing body"},400);let u=dt(i,r),f;try{({created:f}=u.write({type:a,name:l,description:d,body:c}))}catch(m){return n.json({error:m.message},400)}return n.json({success:!0,created_or_updated:f?"created":"updated"})}),e.get("/api/durable-memory/list/:project_id",n=>{let s=Number(n.req.param("project_id")),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let o=dt(i,r),a=n.req.query("type");return n.json(o.list(a))})}var Oh,Ch=T(()=>{"use strict";Zc();Oh=new Set(["user","feedback","project","reference"])});function sL(e){let t=4294967295;for(let r=0;r<e.length;r+=1)t=(nL[(t^e[r])&255]^t>>>8)>>>0;return(t^4294967295)>>>0}function iL(e){let t=Math.max(1980,e.getFullYear()),r=(e.getHours()&31)<<11|(e.getMinutes()&63)<<5|Math.floor(e.getSeconds()/2)&31,n=(t-1980&127)<<9|(e.getMonth()+1&15)<<5|e.getDate()&31;return{time:r,date:n}}function Mh(e,t=new Date){let{time:r,date:n}=iL(t),s=[],i=[],o=0,a=new TextEncoder;for(let _ of e){let g=a.encode(_.name),h=sL(_.data),S=_.data.length,y=new Uint8Array(30+g.length),w=new DataView(y.buffer);w.setUint32(0,67324752,!0),w.setUint16(4,20,!0),w.setUint16(6,0,!0),w.setUint16(8,0,!0),w.setUint16(10,r,!0),w.setUint16(12,n,!0),w.setUint32(14,h,!0),w.setUint32(18,S,!0),w.setUint32(22,S,!0),w.setUint16(26,g.length,!0),w.setUint16(28,0,!0),y.set(g,30),s.push(y,_.data);let I=new Uint8Array(46+g.length),x=new DataView(I.buffer);x.setUint32(0,33639248,!0),x.setUint16(4,20,!0),x.setUint16(6,20,!0),x.setUint16(8,0,!0),x.setUint16(10,0,!0),x.setUint16(12,r,!0),x.setUint16(14,n,!0),x.setUint32(16,h,!0),x.setUint32(20,S,!0),x.setUint32(24,S,!0),x.setUint16(28,g.length,!0),x.setUint16(30,0,!0),x.setUint16(32,0,!0),x.setUint16(34,0,!0),x.setUint16(36,0,!0),x.setUint32(38,0,!0),x.setUint32(42,o,!0),I.set(g,46),i.push(I),o+=y.length+_.data.length}let l=o,c=0;for(let _ of i)c+=_.length;let d=new Uint8Array(22),u=new DataView(d.buffer);u.setUint32(0,101010256,!0),u.setUint16(4,0,!0),u.setUint16(6,0,!0),u.setUint16(8,e.length,!0),u.setUint16(10,e.length,!0),u.setUint32(12,c,!0),u.setUint32(16,l,!0),u.setUint16(20,0,!0);let f=l+c+d.length,m=new Uint8Array(f),p=0;for(let _ of s)m.set(_,p),p+=_.length;for(let _ of i)m.set(_,p),p+=_.length;return m.set(d,p),m}var nL,jh=T(()=>{"use strict";nL=(()=>{let e=new Uint32Array(256);for(let t=0;t<256;t+=1){let r=t;for(let n=0;n<8;n+=1)r=r&1?3988292384^r>>>1:r>>>1;e[t]=r>>>0}return e})()});import{existsSync as _o,mkdirSync as oL,readdirSync as aL,readFileSync as Fh,statSync as lL,unlinkSync as cL,writeFileSync as dL}from"node:fs";import{join as fs}from"node:path";function Uh(e,t){let{dal:r}=t;e.post("/api/projects",async n=>{let s=await ut(n);if(typeof s=="string")return R(n,s,400);let i=oe(s,"name"),o=oe(s,"local_path");if(i===null||i.length===0)return R(n,"missing or empty name",400);if(o===null||o.length===0)return R(n,"missing or empty local_path",400);if(r.findProjectByName(i)!==null)return R(n,`project already exists: ${i}`,409);let a=oe(s,"workflow_name")??"bugfix",l,c=oe(s,"team_name");if(c!==null&&c.length>0){let u=r.findTeamByName(c);if(u===null)return R(n,`team not found: ${c}`,404);l=u.id}else{let u=r.listTeams();if(u.length===0)return R(n,"no teams exist; create a team first",400);l=u[0].id}let d=r.insertProject({name:i,local_path:o,workflow_name:a,team_id:l,default_branch:oe(s,"default_branch")});return n.json(d,201)}),e.patch("/api/projects/:name",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=await ut(n);if(typeof i=="string")return R(n,i,400);let o={};if(Object.prototype.hasOwnProperty.call(i,"local_path")){let l=i.local_path;if(typeof l!="string"||l.length===0)return R(n,"local_path must be a non-empty string",400);o.local_path=l}if(Object.prototype.hasOwnProperty.call(i,"durable_memory_mode")){let l=i.durable_memory_mode;if(l!=="folder"&&l!=="db")return R(n,'durable_memory_mode must be "folder" or "db"',400);o.durable_memory_mode=l}if(Object.prototype.hasOwnProperty.call(i,"default_branch")){let l=i.default_branch;if(l!==null&&typeof l!="string")return R(n,"default_branch must be string or null",400);o.default_branch=l}if(Object.prototype.hasOwnProperty.call(i,"intake_config")){let l=i.intake_config;if(l===null)o.intake_config=null;else if(typeof l=="string")o.intake_config=l;else if(typeof l=="object"&&!Array.isArray(l))o.intake_config=JSON.stringify(l);else return R(n,"intake_config must be a JSON object, string, or null",400)}let a=r.updateProjectSettings(s.id,o);return a===null?R(n,"project not found",404):n.json(a)}),e.post("/api/teams",async n=>{let s=await ut(n);if(typeof s=="string")return R(n,s,400);let i=oe(s,"name");if(i===null||i.length===0)return R(n,"missing or empty name",400);if(r.findTeamByName(i)!==null)return R(n,`team already exists: ${i}`,409);let o=r.insertTeam({name:i});return n.json(o,201)}),e.post("/api/teams/:name/members",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return R(n,"team not found",404);let i=await ut(n);if(typeof i=="string")return R(n,i,400);let o=oe(i,"alias"),a=oe(i,"provider");if(o===null||o.length===0)return R(n,"missing or empty alias",400);if(a===null||a.length===0)return R(n,"missing or empty provider",400);if(r.findTeamMemberByAlias(s.id,o)!==null)return R(n,`member already exists: ${o}`,409);let l=oe(i,"model"),c=r.insertTeamMember({team_id:s.id,alias:o,provider:a,model:l,sessiondir:`.lmctl/sessions/${s.name}/${o}`}),d=oe(i,"role_prompt");d!==null&&r.setMemberRolePrompt(c.id,d);let u=r.findTeamMemberByAlias(s.id,o);return n.json(u??c,201)}),e.put("/api/teams/:name/members/:alias",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return R(n,"team not found",404);let i=r.findTeamMemberByAlias(s.id,n.req.param("alias"));if(i===null)return R(n,"member not found",404);let o=await ut(n);if(typeof o=="string")return R(n,o,400);let a={};if(Object.prototype.hasOwnProperty.call(o,"role_prompt")){let c=o.role_prompt;if(c!==null&&typeof c!="string")return R(n,"role_prompt must be string or null",400);a.role_prompt=c}if(Object.prototype.hasOwnProperty.call(o,"model")){let c=o.model;if(c!==null&&typeof c!="string")return R(n,"model must be string or null",400);a.model=c}if(Object.prototype.hasOwnProperty.call(o,"provider")){let c=o.provider;if(typeof c!="string"||c.length===0)return R(n,"provider must be a non-empty string",400);a.provider=c}if(Object.keys(a).length===0)return R(n,"no updatable fields provided",400);let l=r.updateTeamMemberMeta(i.id,a);return l===null?R(n,"member not found",404):n.json(l)}),e.get("/api/projects/:name/durable-memory",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=dt(s,r);return n.json(i.index())}),e.post("/api/projects/:name/durable-memory",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=await ut(n);if(typeof i=="string")return R(n,i,400);let o=oe(i,"name"),a=oe(i,"body"),l=oe(i,"type");if(o===null||o.length===0)return R(n,"missing or empty name",400);if(a===null)return R(n,"missing body",400);if(l===null||!mo.includes(l))return R(n,`invalid type: must be one of ${mo.join("|")}`,400);try{et(o)}catch(u){return R(n,u.message,400)}let c=dt(s,r);try{if(c.read(o)!==null)return R(n,`chapter already exists: ${o}`,409)}catch(u){return R(n,u.message,400)}try{c.write({type:l,name:o,description:oe(i,"description"),body:a})}catch(u){return R(n,u.message,400)}let d=c.read(o);return d===null?R(n,"chapter created but unreadable",500):n.json(d,201)}),e.get("/api/projects/:name/durable-memory/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=dt(s,r),o;try{o=i.read(n.req.param("chapter"))}catch(a){return R(n,a.message,400)}return o===null?R(n,"chapter not found",404):n.json(o)}),e.put("/api/projects/:name/durable-memory/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=n.req.param("chapter"),o=await ut(n);if(typeof o=="string")return R(n,o,400);let a=dt(s,r),l;try{l=a.read(i)}catch(m){return R(n,m.message,400)}if(l===null)return R(n,"chapter not found",404);let c=oe(o,"body")??l.body,d=Object.prototype.hasOwnProperty.call(o,"description")?oe(o,"description"):l.description,u=oe(o,"type")??l.type;if(!mo.includes(u))return R(n,`invalid type: must be one of ${mo.join("|")}`,400);try{a.write({type:u,name:i,description:d,body:c})}catch(m){return R(n,m.message,400)}let f=a.read(i);return f===null?R(n,"chapter updated but unreadable",500):n.json(f)}),e.delete("/api/projects/:name/durable-memory/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=dt(s,r),o;try{o=i.delete(n.req.param("chapter"))}catch(a){return R(n,a.message,400)}return o?n.json({removed:!0}):R(n,"chapter not found",404)}),e.get("/api/projects/:name/ai-test",n=>{let s=r.findProjectByName(n.req.param("name"));return s===null?R(n,"project not found",404):n.json(fL(s.local_path))}),e.post("/api/projects/:name/ai-test",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=await ut(n);if(typeof i=="string")return R(n,i,400);let o=oe(i,"name"),a=oe(i,"body"),l=oe(i,"type");if(o===null||o.length===0)return R(n,"missing or empty name",400);if(a===null)return R(n,"missing body",400);if(l===null||!po.has(l))return R(n,`invalid type: must be one of ${[...po].join("|")}`,400);try{et(o)}catch(f){return R(n,f.message,400)}let c=ds(s.local_path),d=fs(c,`${o}.md`);if(_o(d))return R(n,`chapter already exists: ${o}`,409);oL(c,{recursive:!0}),Ph(d,o,l,oe(i,"description"),a);let u=us(c,o);return u===null?R(n,"chapter created but unreadable",500):n.json(u,201)}),e.get("/api/projects/:name/ai-test/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);try{et(n.req.param("chapter"))}catch(o){return R(n,o.message,400)}let i=us(ds(s.local_path),n.req.param("chapter"));return i===null?R(n,"chapter not found",404):n.json(i)}),e.put("/api/projects/:name/ai-test/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=n.req.param("chapter");try{et(i)}catch(m){return R(n,m.message,400)}let o=ds(s.local_path),a=us(o,i);if(a===null)return R(n,"chapter not found",404);let l=await ut(n);if(typeof l=="string")return R(n,l,400);let c=oe(l,"body")??a.body,d=Object.prototype.hasOwnProperty.call(l,"description")?oe(l,"description"):a.description,u=oe(l,"type")??a.type;if(!po.has(u))return R(n,`invalid type: must be one of ${[...po].join("|")}`,400);Ph(fs(o,`${i}.md`),i,u,d,c);let f=us(o,i);return f===null?R(n,"chapter updated but unreadable",500):n.json(f)}),e.delete("/api/projects/:name/ai-test/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=n.req.param("chapter");try{et(i)}catch(a){return R(n,a.message,400)}let o=fs(ds(s.local_path),`${i}.md`);return _o(o)?(cL(o),n.json({removed:!0})):R(n,"chapter not found",404)}),e.get("/api/tokens",n=>n.json([])),e.post("/api/tokens",n=>R(n,"scoped-tokens table not yet migrated; see briefs/scoped-tokens-design.md",501)),e.get("/api/settings",n=>n.json({})),e.patch("/api/settings",async n=>{let s=await ut(n);return typeof s=="string"?R(n,s,400):n.json({accepted:s,note:"settings persistence not yet implemented"})}),e.get("/api/chat/sessions",n=>n.json(r.listChatbotSessions(Dh))),e.post("/api/chat/sessions",async n=>{let s=await uL(n);if(typeof s=="string")return R(n,s,400);let i=s!==null?oe(s,"title"):null,o=r.createChatbotSession(Dh,i);return n.json(o,201)}),e.get("/api/chat/sessions/:id/messages",n=>{let s=n.req.param("id");return r.getChatbotSession(s)===null?R(n,"chat session not found",404):n.json(r.listChatbotMessages(s))}),e.post("/api/chat/sessions/:id/messages",async n=>{let s=n.req.param("id");if(r.getChatbotSession(s)===null)return R(n,"chat session not found",404);let i=await ut(n);if(typeof i=="string")return R(n,i,400);let o=oe(i,"role"),a=oe(i,"content");if(o===null||o!=="user"&&o!=="assistant"&&o!=="tool")return R(n,"role must be one of user|assistant|tool",400);if(a===null)return R(n,"missing content",400);let l=r.appendChatbotMessage(s,o,a);return n.json(l,201)}),e.get("/api/runs/:id/artifacts.zip",n=>{let s=Number(n.req.param("id"));if(!Number.isInteger(s))return R(n,"invalid run id",400);if(r.getRun(s)===null)return R(n,"run not found",404);let o=Lr(r,s),a=[];for(let c of o){let d=pL(c),u=null;if(c.content!==null&&c.content!==void 0)u=new TextEncoder().encode(c.content);else if(c.path!==null&&c.path!==void 0)try{let f=Fh(c.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);u=new Uint8Array(m)}catch{u=new Uint8Array(0)}u!==null&&a.push({name:d,data:u})}let l=Mh(a);return new Response(l,{status:200,headers:{"Content-Type":"application/zip","Content-Disposition":`attachment; filename="run-${s}-artifacts.zip"`,"Content-Length":String(l.byteLength)}})})}function R(e,t,r){return e.json({error:t},r)}async function ut(e){try{let t=await e.req.json();return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:"invalid JSON body"}catch{return"invalid JSON body"}}async function uL(e){let t=await e.req.text().catch(()=>"");if(t.trim().length===0)return null;try{let r=JSON.parse(t);return r!==null&&typeof r=="object"&&!Array.isArray(r)?r:"invalid JSON body"}catch{return"invalid JSON body"}}function oe(e,t){let r=e[t];return typeof r!="string"?null:r}function ds(e){return fs(e,"ai-test")}function us(e,t){let r=fs(e,`${t}.md`);if(!_o(r))return null;let n=Fh(r,"utf8"),s=mL(n),i=lL(r).mtime.toISOString();return{name:t,type:s.type,description:s.description,body:s.body,updated_at:i}}function fL(e){let t=ds(e);return _o(t)?aL(t).filter(r=>r.endsWith(".md")&&r!=="index.md").map(r=>r.slice(0,-3)).sort().map(r=>{let n=us(t,r);if(n===null)return null;let{name:s,type:i,description:o,updated_at:a}=n;return{name:s,type:i,description:o,updated_at:a}}).filter(r=>r!==null):[]}function Ph(e,t,r,n,s){let i=n!==null&&n.length>0?`
|
|
1768
1768
|
description: ${n}`:"",o=`---
|
|
1769
1769
|
name: ${t}${i}
|
|
1770
1770
|
type: ${r}
|
|
1771
1771
|
---
|
|
1772
|
-
${s}`;dL(e,o,"utf8")}function mL(e){let t=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(t===null)return{type:"scenario",description:null,body:e};let r=t[1],n=t[2].trimStart(),s=r.match(/^type:\s*(.+)$/m),i=r.match(/^description:\s*(.+)$/m);return{type:s?.[1]?.trim()??"scenario",description:i?.[1]?.trim()??null,body:n}}function pL(e){let t=e.state_name.replace(/[^a-zA-Z0-9_-]+/g,"_"),r=e.kind.replace(/[^a-zA-Z0-9_-]+/g,"_"),n=e.path!==null?_L(e.path):hL(e.kind);return`step-${e.step_id}-${t}/${e.id}-${r}${n}`}function _L(e){let t=e.lastIndexOf(".");if(t<0)return"";let r=e.slice(t);return/^\.[A-Za-z0-9]+$/.test(r)?r:""}function hL(e){return e.endsWith("_md")||e.includes("markdown")?".md":e.endsWith("_json")||e.includes("json")?".json":".txt"}var
|
|
1772
|
+
${s}`;dL(e,o,"utf8")}function mL(e){let t=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(t===null)return{type:"scenario",description:null,body:e};let r=t[1],n=t[2].trimStart(),s=r.match(/^type:\s*(.+)$/m),i=r.match(/^description:\s*(.+)$/m);return{type:s?.[1]?.trim()??"scenario",description:i?.[1]?.trim()??null,body:n}}function pL(e){let t=e.state_name.replace(/[^a-zA-Z0-9_-]+/g,"_"),r=e.kind.replace(/[^a-zA-Z0-9_-]+/g,"_"),n=e.path!==null?_L(e.path):hL(e.kind);return`step-${e.step_id}-${t}/${e.id}-${r}${n}`}function _L(e){let t=e.lastIndexOf(".");if(t<0)return"";let r=e.slice(t);return/^\.[A-Za-z0-9]+$/.test(r)?r:""}function hL(e){return e.endsWith("_md")||e.includes("markdown")?".md":e.endsWith("_json")||e.includes("json")?".json":".txt"}var mo,po,Dh,Wh=T(()=>{"use strict";Ht();jh();Zc();mo=["user","feedback","project","reference"],po=new Set(["smoke","integration","vision","scenario","regression"]),Dh="operator"});function Re(e,t){return`<!doctype html>
|
|
1773
1773
|
<html lang="en">
|
|
1774
1774
|
<head>
|
|
1775
1775
|
<meta charset="utf-8">
|
|
@@ -1830,8 +1830,8 @@ ${s}`;dL(e,o,"utf8")}function mL(e){let t=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r
|
|
|
1830
1830
|
</nav>
|
|
1831
1831
|
<main>${t}</main>
|
|
1832
1832
|
</body>
|
|
1833
|
-
</html>`}function b(e){return String(e??"").replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function me(e,t){let r=e.map(s=>`<th>${b(s)}</th>`).join(""),n=t.length===0?`<tr><td colspan="${e.length}"><span class="muted">(empty)</span></td></tr>`:t.map(s=>`<tr>${s.map(i=>`<td>${i}</td>`).join("")}</tr>`).join("");return`<table><thead><tr>${r}</tr></thead><tbody>${n}</tbody></table>`}function de(e){return`<pre>${b(JSON.stringify(e,null,2))}</pre>`}var Qc=T(()=>{"use strict"});import{createHash as gL}from"node:crypto";import{existsSync as ms,mkdirSync as qh,readFileSync as ps,readdirSync as yL,renameSync as wL,statSync as EL,unlinkSync as TL,writeFileSync as
|
|
1834
|
-
`,"utf8"),wL(n,r)}function NL(e){if(typeof e=="object"&&e!==null&&"code"in e){let t=e.code;if(typeof t=="string")return t}}function xL(e,t,r,n,s){let i=`${t}.dist-${r}`;for(let o=0;o<1e3;o+=1){let a=o===0?i:`${i}-${o}`,l=ft(e,a);try{return
|
|
1833
|
+
</html>`}function b(e){return String(e??"").replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function me(e,t){let r=e.map(s=>`<th>${b(s)}</th>`).join(""),n=t.length===0?`<tr><td colspan="${e.length}"><span class="muted">(empty)</span></td></tr>`:t.map(s=>`<tr>${s.map(i=>`<td>${i}</td>`).join("")}</tr>`).join("");return`<table><thead><tr>${r}</tr></thead><tbody>${n}</tbody></table>`}function de(e){return`<pre>${b(JSON.stringify(e,null,2))}</pre>`}var Qc=T(()=>{"use strict"});import{createHash as gL}from"node:crypto";import{existsSync as ms,mkdirSync as qh,readFileSync as ps,readdirSync as yL,renameSync as wL,statSync as EL,unlinkSync as TL,writeFileSync as ho}from"node:fs";import{homedir as bL}from"node:os";import{dirname as ed,isAbsolute as Bh,join as ft,relative as SL,resolve as fn}from"node:path";import{fileURLToPath as vL}from"node:url";function Jh(e){let t=fn(e);for(;;){let r=ft(t,td);try{if(EL(r).isDirectory())return r}catch{}let n=ed(t);if(n===t)return null;t=n}}function rd(e=process.cwd()){let t=process.env.LMCTL_HOME;if(t!==void 0&&t.trim().length>0)return fn(t);let r=Jh(e);return r!==null?r:ft(Hh(),td)}function Xh(){return fn(ed(vL(import.meta.url)),"..","..","workflows")}function kL(e){let t=ft(e,Gh);try{let r=JSON.parse(ps(t,"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 IL(e,t){qh(e,{recursive:!0});let r=ft(e,Gh),n=`${r}.tmp-${process.pid}`;ho(n,`${JSON.stringify(t,null,2)}
|
|
1834
|
+
`,"utf8"),wL(n,r)}function NL(e){if(typeof e=="object"&&e!==null&&"code"in e){let t=e.code;if(typeof t=="string")return t}}function xL(e,t,r,n,s){let i=`${t}.dist-${r}`;for(let o=0;o<1e3;o+=1){let a=o===0?i:`${i}-${o}`,l=ft(e,a);try{return ho(l,n,{flag:"wx"}),a}catch(c){if(NL(c)!=="EEXIST")throw c;if(go(ps(l))===s)return a}}throw new Error(`could not find available dist shadow path for ${t}`)}function AL(e,t){if(Bh(t)||ed(t)!=="workflows")return null;let r=t.slice(10);if(r.length===0||r.includes("/")||r.includes("\\")||r.includes(".."))return null;let n=fn(e,"templates","workflows"),s=fn(e,"templates",t),i=SL(n,s);return i.length===0||i.startsWith("..")||Bh(i)||i.includes("/")||i.includes("\\")?null:s}function RL(e,t,r){for(let[n,s]of Object.entries(t.files)){if(r.has(n))continue;let i=AL(e,n);if(i===null){delete t.files[n];continue}if(!ms(i)){delete t.files[n];continue}try{if(go(ps(i))!==s)continue;TL(i),delete t.files[n]}catch{}}}function Vh(e={}){let t=rd(e.cwd),r=ft(t,"templates","workflows"),n=Xh(),s={basedir:t,copied:[],refreshed:[],preserved:[],shadowed:[]};try{let i=ms(n)?yL(n).filter(c=>c.endsWith(".compound.json")||c.endsWith(".lmctl")||c==="index.jsonl"):[];if(i.length===0)return s;qh(r,{recursive:!0});let o=kL(t),a=yt(),l=new Set(i.map(c=>`workflows/${c}`));for(let c of i){let d=`workflows/${c}`,u=ps(ft(n,c)),f=go(u),m=ft(r,c);if(!ms(m)){try{ho(m,u,{flag:"wx"}),s.copied.push(c)}catch{}o.files[d]=f;continue}let p=go(ps(m));if(p===f){o.files[d]=f;continue}let _=o.files[d];if(_!==void 0&&p===_)ho(m,u),o.files[d]=f,s.refreshed.push(c);else{let g=xL(r,c,a,u,f);s.preserved.push(c),s.shadowed.push(g)}}RL(t,o,l),IL(t,{version:a,files:o.files})}catch(i){if(e.swallow!==!0)throw i}return s}function nd(e){let t=[],r=process.env.LMCTL_HOME;r!==void 0&&r.trim().length>0&&t.push(fn(r));let n=Jh(e??process.cwd());return n!==null&&t.push(n),t.push(ft(Hh(),td)),t}function yo(e,t){let r=nd(t),n=[`${e}.compound.json`,`${e}.lmctl`];for(let s of r)for(let i of n){let o=ft(s,"templates","workflows",i);if(ms(o))return o}for(let s of n){let i=ft(Xh(),s);if(ms(i))return i}return null}var td,Hh,go,Gh,sd=T(()=>{"use strict";Fn();td=".lmctl",Hh=()=>process.env.HOME??bL(),go=e=>gL("sha256").update(e).digest("hex");Gh=".dist-manifest.json"});function Kh(e,t){if(t.query(`SELECT sa.id FROM step_artifact sa
|
|
1835
1835
|
JOIN step s ON s.id = sa.step_id
|
|
1836
1836
|
WHERE s.run_id = ? AND sa.kind = 'run_report' LIMIT 1`,e).length>0)return;let n=t.getRun(e);if(n===null)return;let s=t.query("SELECT id FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",e);if(s.length===0)return;let i=s[0].id,o=t.query("SELECT id, state_name, outcome, started_at, ended_at FROM step WHERE run_id = ? ORDER BY id ASC",e),a=t.query(`SELECT sa.id, sa.step_id, sa.kind FROM step_artifact sa
|
|
1837
1837
|
JOIN step s ON s.id = sa.step_id
|
|
@@ -1840,40 +1840,40 @@ ${s}`;dL(e,o,"utf8")}function mL(e){let t=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r
|
|
|
1840
1840
|
FROM session_size WHERE observed_at >= ? AND observed_at <= ?`,n.started_at,n.ended_at??new Date().toISOString())[0],U=x?.input!==null&&x?.input!==void 0?`input: ${x.input}, output: ${x.output??0}`:"n/a",ue=t.getWorkflow(n.workflow_id),W=n.started_at!==null&&n.ended_at!==null?Math.max(0,new Date(n.ended_at).getTime()-new Date(n.started_at).getTime()):null,M={run_id:e,workflow_name:ue?.name??null,started_at:n.started_at,ended_at:n.ended_at,terminal_state:n.terminal_state,duration_ms:W,steps:c,tool_stats:m,reviewer_interventions:{count:p.length,state_names:_},drift_signals:w,token_totals:U};t.insertStepArtifact({step_id:i,kind:"run_report",content:JSON.stringify(M)})}var Yh=T(()=>{"use strict"});import{spawnSync as Zh}from"node:child_process";function id(e){return LL[e]??`no install hint; ensure '${e}' is on PATH`}function OL(e){switch(e){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 zh(e){return Zh("which",[e],{encoding:"utf8"}).status===0}function Qh(e){if(e===void 0)return null;for(let t of e.tools??[])if(!zh(t)){let r=id(t);return{kind:"missing_tool",tool:t,install_hint:r,message:`missing dependency: ${t}; ${r}`}}for(let t of e.auth??[]){if(!zh(t)){let s=id(t);return{kind:"missing_tool",tool:t,install_hint:s,message:`missing dependency: ${t}; ${s}`}}let r=OL(t);if(r===null)continue;let n=Zh(t,r.args,{encoding:"utf8"});if(n.status!==0){let s=typeof n.stderr=="string"?n.stderr.trim():"";return{kind:"auth_failed",tool:t,install_hint:id(t),message:`${t} not authenticated; run \`${t} login\` or equivalent`,detail:s.length>0?s:void 0}}}return null}var LL,eg=T(()=>{"use strict";LL={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 $L,readdirSync as CL,readFileSync as ML}from"node:fs";import{join as tg}from"node:path";function jL(e){let t=e.match(/^---\n([\s\S]*?)\n---/);if(!t)return[];let r=t[1],n=r.match(/^tags:\s*\[([^\]]*)\]/m);if(n)return n[1].split(",").map(i=>i.trim()).filter(Boolean);let s=r.match(/^tags:\s*\n((?:\s*-\s+.+\n?)*)/m);return s?s[1].split(`
|
|
1841
1841
|
`).map(i=>i.replace(/^\s*-\s+/,"").trim()).filter(Boolean):[]}function rg(e,t){let r=e.match(/^---\n([\s\S]*?)\n---/);if(!r)return null;let s=r[1].match(new RegExp(`^${t}:\\s*(.+)$`,"m"));return s?s[1].trim():null}function ng(e,t){if(t.length===0)return null;let r=tg(e,"durable-memory");if(!$L(r))return null;let n;try{n=CL(r).filter(i=>i.endsWith(".md")&&i!=="index.md")}catch{return null}let s=[];for(let i of n)try{let o=ML(tg(r,i),"utf8");if(jL(o).some(l=>t.includes(l))){let l=rg(o,"name")??i.replace(".md",""),c=rg(o,"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 sg=T(()=>{"use strict"});function ld(e){let t=e.trim().replace(DL,"").trim();for(let r=0;r<4;r+=1){let n=PL.exec(t);if(n===null)break;t=n[2].trim()}return t}function ig(e){let t=e.trim(),r=FL.exec(t);if(r!==null)return r[2];let n=UL.exec(t);return n!==null?n[0]:null}function _s(e,t){let r=e.split(`
|
|
1842
1842
|
`),n=null,s=-1;for(let o=0;o<r.length;o+=1){let a=ld(r[o]),l=od.exec(a);if(l===null)continue;let c=l[1].trim();if(ad.test(c))continue;let d=ig(c);d!==null&&(n=d,s=o)}if(n===null)return{outcome:null,reason:"no_stance"};if(!t.includes(n))return{outcome:null,reason:"unknown_outcome",actual:n};let i={};for(let o=s-1;o>=0;o-=1){let a=ld(r[o]),l=od.exec(a);if(l===null)break;let c=ad.exec(l[1].trim());if(c===null)break;i[c[1]]=c[2].trim()}return{outcome:n,evidence:i}}function og(e){let t=e.split(`
|
|
1843
|
-
`),r=null;for(let n=0;n<t.length;n+=1){let s=ld(t[n]),i=od.exec(s);if(i===null)continue;let o=i[1].trim();if(ad.test(o))continue;let a=ig(o);if(a===null||!Vr(a))continue;let c=o.slice(o.indexOf(a)+a.length).replace(/^[`*_:\s\-–—]+/,"").trim();r={token:a,reason:c}}return r}var DL,PL,od,ad,FL,UL,cd=T(()=>{"use strict";Xn();DL=/^#{1,6}\s+/,PL=/^(```|\*\*|__|`|\*|_)([\s\S]+?)\1$/,od=/^STANCE:\s+(.+)$/,ad=/^([A-Z][A-Z0-9_]*):\s*(.+)$/,FL=/^(```|\*\*|__|`|\*|_)([A-Za-z0-9_-]+)\1/,UL=/^[A-Za-z0-9_-]+/});function ag(e,t,r){return n=>{let s=r(),i=Date.now(),o=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(o,"utf8");if(a<=262144){e.insertSessionEvent({run_id:t,step_id:s,kind:n.kind,timestamp_ms:i,payload:o});return}let l=o.slice(0,1024),c=JSON.stringify({truncated:!0,size:a,preview:l});if(s!==null){let d=e.insertStepArtifact({step_id:s,kind:"session_event_overflow",content:o});e.insertSessionEvent({run_id:t,step_id:s,kind:n.kind,timestamp_ms:i,payload:c,payload_truncated:1,overflow_artifact_id:d.id})}else e.insertSessionEvent({run_id:t,step_id:null,kind:n.kind,timestamp_ms:i,payload:c,payload_truncated:1,overflow_artifact_id:null})}}var lg=T(()=>{"use strict"});import{readFileSync as WL}from"node:fs";import{dirname as BL,join as qL}from"node:path";import{fileURLToPath as HL}from"node:url";function GL(e){return e.rules.map(t=>({command:t.command,subcommands:t.argv_patterns.map(r=>r.trim().split(/\s+/)),kind:t.kind}))}function zL(e){let t=[],r=[];for(let n of e)JL.has(n)?(r.length>0&&t.push(r),r=[]):r.push(n);return r.length>0&&t.push(r),t}function ZL(e,t){if(e.length===0)return{matched:!1};let r=0;for(;r<e.length&&XL.test(e[r]);)r+=1;if(r>=e.length)return{matched:!1};let n=e[r],s=e.slice(r+1);for(let i of t)if(n===i.command){for(let o of i.subcommands)if(o.every((l,c)=>s[c]===l))return{matched:!0,kind:i.kind}}return{matched:!1}}function QL(e,t){if(e.length===0)return{matched:!1};let r=zL(e);for(let n of r){let s=ZL(n,t);if(s.matched)return s}return{matched:!1}}function dd(e){return QL(e,YL)}function eO(e){return e.replace(/&&/g," && ").replace(/\|\|/g," || ").replace(/;/g," ; ").replace(/\|/g," | ").replace(/(?<!\d)>{1,2}/g,t=>` ${t} `).replace(/(?<!\d)<{1,2}/g,t=>` ${t} `).replace(/\s+/g," ").trim()}function ud(e){return eO(e).split(" ").filter(t=>t.length>0)}var JL,XL,VL,KL,YL,cg=T(()=>{"use strict";JL=new Set(["&&","||",";","|",">",">>","<","<<"]),XL=/^[A-Za-z_][A-Za-z0-9_]*=/;VL=BL(HL(import.meta.url)),KL=JSON.parse(WL(qL(VL,"side_effect_classifier.json"),"utf-8")),YL=GL(KL)});function
|
|
1844
|
-
\u2026[truncated ${e.length-8e3} chars]`:e}function
|
|
1843
|
+
`),r=null;for(let n=0;n<t.length;n+=1){let s=ld(t[n]),i=od.exec(s);if(i===null)continue;let o=i[1].trim();if(ad.test(o))continue;let a=ig(o);if(a===null||!Vr(a))continue;let c=o.slice(o.indexOf(a)+a.length).replace(/^[`*_:\s\-–—]+/,"").trim();r={token:a,reason:c}}return r}var DL,PL,od,ad,FL,UL,cd=T(()=>{"use strict";Xn();DL=/^#{1,6}\s+/,PL=/^(```|\*\*|__|`|\*|_)([\s\S]+?)\1$/,od=/^STANCE:\s+(.+)$/,ad=/^([A-Z][A-Z0-9_]*):\s*(.+)$/,FL=/^(```|\*\*|__|`|\*|_)([A-Za-z0-9_-]+)\1/,UL=/^[A-Za-z0-9_-]+/});function ag(e,t,r){return n=>{let s=r(),i=Date.now(),o=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(o,"utf8");if(a<=262144){e.insertSessionEvent({run_id:t,step_id:s,kind:n.kind,timestamp_ms:i,payload:o});return}let l=o.slice(0,1024),c=JSON.stringify({truncated:!0,size:a,preview:l});if(s!==null){let d=e.insertStepArtifact({step_id:s,kind:"session_event_overflow",content:o});e.insertSessionEvent({run_id:t,step_id:s,kind:n.kind,timestamp_ms:i,payload:c,payload_truncated:1,overflow_artifact_id:d.id})}else e.insertSessionEvent({run_id:t,step_id:null,kind:n.kind,timestamp_ms:i,payload:c,payload_truncated:1,overflow_artifact_id:null})}}var lg=T(()=>{"use strict"});import{readFileSync as WL}from"node:fs";import{dirname as BL,join as qL}from"node:path";import{fileURLToPath as HL}from"node:url";function GL(e){return e.rules.map(t=>({command:t.command,subcommands:t.argv_patterns.map(r=>r.trim().split(/\s+/)),kind:t.kind}))}function zL(e){let t=[],r=[];for(let n of e)JL.has(n)?(r.length>0&&t.push(r),r=[]):r.push(n);return r.length>0&&t.push(r),t}function ZL(e,t){if(e.length===0)return{matched:!1};let r=0;for(;r<e.length&&XL.test(e[r]);)r+=1;if(r>=e.length)return{matched:!1};let n=e[r],s=e.slice(r+1);for(let i of t)if(n===i.command){for(let o of i.subcommands)if(o.every((l,c)=>s[c]===l))return{matched:!0,kind:i.kind}}return{matched:!1}}function QL(e,t){if(e.length===0)return{matched:!1};let r=zL(e);for(let n of r){let s=ZL(n,t);if(s.matched)return s}return{matched:!1}}function dd(e){return QL(e,YL)}function eO(e){return e.replace(/&&/g," && ").replace(/\|\|/g," || ").replace(/;/g," ; ").replace(/\|/g," | ").replace(/(?<!\d)>{1,2}/g,t=>` ${t} `).replace(/(?<!\d)<{1,2}/g,t=>` ${t} `).replace(/\s+/g," ").trim()}function ud(e){return eO(e).split(" ").filter(t=>t.length>0)}var JL,XL,VL,KL,YL,cg=T(()=>{"use strict";JL=new Set(["&&","||",";","|",">",">>","<","<<"]),XL=/^[A-Za-z_][A-Za-z0-9_]*=/;VL=BL(HL(import.meta.url)),KL=JSON.parse(WL(qL(VL,"side_effect_classifier.json"),"utf-8")),YL=GL(KL)});function wo(e){return{context:{outcomes:e.outcomes,inputs:e.inputs,item:e.iteration?.item,index:e.iteration?.index},outcomes:e.outcomes,inputs:e.inputs,item:e.iteration?.item,index:e.iteration?.index}}async function dg(e,t){try{return await $r(fd(e)??e,wo(t))===!0}catch{return!1}}async function Eo(e,t){try{return await $r(fd(e)??e,wo(t))}catch{return}}async function ug(e,t){if(typeof e!="string")return e;let r=fd(e);if(r===null)return e;try{return await $r(r,wo(t))}catch{return}}async function fg(e,t){let r=Array.from(e.matchAll(/=\{\{([\s\S]*?)\}\}/g));if(r.length===0)return e;let n="",s=0;for(let i of r){let o=i.index??0;n+=e.slice(s,o);let a=i[1]?.trim()??"";try{n+=tO(await $r(a,wo(t)))}catch{n+=""}s=o+i[0].length}return n+=e.slice(s),n}function fd(e){let t=e.trim();return!t.startsWith("={{")||!t.endsWith("}}")?null:t.slice(3,-2).trim()}function tO(e){return e==null?"":typeof e=="string"?e:JSON.stringify(e)}var hs=T(()=>{"use strict";as()});import{existsSync as mg,readdirSync as pg,readFileSync as rO,statSync as _g}from"node:fs";import{join as bo}from"node:path";function hg(e,t,r,n){return Object.assign(e,{stateId:t,state:r,displayName:n})}function q(e,t){return e.dal.insertStep({...t,parent_step_id:e.parent_step_id})}function X(e,t){return t.startsWith("@terminal:")?{kind:"terminal",terminal:t.slice(10)}:e.states[t]===void 0?{kind:"escalate",token:t,reason:`unknown state ref '${t}'`}:{kind:"state",state:t}}function tt(e,t,r,n,s={}){let i=O(),o=q(e,{run_id:e.run_id,state_name:t.name});e.steps_executed+=1,e.dal.finishStep(o.id,null,`escalation:${n}`.slice(0,480)),e.dal.setRunPausedState(e.run_id,`${gs}${t.id}`,i);let a=e.dal.getRun(e.run_id),l=Vr(r)?"generic":"unhandled";return e.dal.raiseAttention({kind:ti,severity:"attn",project_id:e.project.id,run_id:e.run_id,requires_user:!0,payload:JSON.stringify({run_id:e.run_id,step_id:o.id,project_id:e.project.id,workflow_name:e.workflow.name,workflow_version_id:a?.workflow_version_id??null,step:{id:t.id,name:t.name,type:t.type},tier:l,token:r,reason:n,declared_outcomes:[...s.declared_outcomes??[]],agent_output:nO(s.agent_output??n),paused_at:i,created_at:i})}),e.dal.pauseJob(e.job.id),{kind:"paused"}}function nO(e){return e.length>8e3?`${e.slice(0,8e3)}
|
|
1844
|
+
\u2026[truncated ${e.length-8e3} chars]`:e}function G(e,t,r,n){e.outcomes[t]=n,r!==t&&(e.outcomes[r]=n)}function Y(e){return e.terminals.aborted?.kind==="failure"?"aborted":Object.entries(e.terminals).find(([,r])=>r.kind==="failure")?.[0]??Object.keys(e.terminals)[0]??"aborted"}function gg(e,t){let r=t.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 i=fr(e.job.payload)?.[n];if(Array.isArray(i)&&i.every(o=>typeof o=="string"))return i}return null}async function Ke(e,t,r){let n=e.replace(/(?<!=)\{\{\s*([a-zA-Z0-9_.]+)\s*\}\}/g,(s,i)=>{if(i==="run_id")return String(t.run_id);if(i==="state_id")return r;if(i==="item")return t.iteration?.item??"";if(i==="index")return t.iteration===null?"":String(t.iteration.index);if(i.startsWith("project.")){let o=i.slice(8);if(o==="id")return String(t.project.id);if(o==="name")return t.project.name;if(o==="local_path")return t.project.local_path;if(o==="default_branch")return t.project.default_branch??"";if(o==="owner"){let a=t.project.name.indexOf("/");return a>0?t.project.name.slice(0,a):""}if(o==="repo"){let a=t.project.name.indexOf("/");return a>0?t.project.name.slice(a+1):t.project.name}if(o==="test_command"){let a=t.project.test_command;return a===null||a===""?"npm test":a}return""}if(i==="job_payload"){let o=fr(t.job.payload);return o===null?"":JSON.stringify(o)}if(i.startsWith("job_payload.")){let o=i.slice(12),l=fr(t.job.payload)?.[o];return l==null?"":String(l)}if(i.startsWith("outcomes.")){let o=sO(t.outcomes,i.slice(9));return o==null?"":typeof o=="string"?o:JSON.stringify(o)}return""});return fg(n,t)}function sO(e,t){let r=e;for(let n of t.split(".")){if(r===null||typeof r!="object"||Array.isArray(r))return;r=r[n]}return r}function fr(e){if(e===null)return null;try{let t=JSON.parse(e);return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:null}catch{return null}}async function ys(e){let{context:t,stateId:r,member:n,prompt:s,stepId:i,timeoutMs:o,writesToProjectPath:a}=e,l=ag(t.dal,t.run_id,()=>i),c=md(t,r),d={violation:null},u=S=>{if(l(S),d.violation===null&&S.kind==="tool_use"&&S.tool==="Bash"&&S.summary){let y=ud(S.summary),w=dd(y);w.matched&&!c&&(d.violation={summary:S.summary,kind:w.kind})}},f=new Date(Date.now()-1),m=0,p=0,_=S=>{u(S),iO(S,(y,w)=>{m+=y,p+=w})},g=await Li({sessionid:n.sessionid,sessiondir:n.sessiondir,prompt:s,timeoutMs:o,dal:t.dal,team_member_id:n.id,onProgress:_});t.dal.insertSessionEvent({run_id:t.run_id,step_id:i,kind:"agent_call",timestamp_ms:Date.now(),payload:JSON.stringify({alias:n.alias,provider:Ue(n),model:n.model??"unknown",tokens_in:m,tokens_out:p,wall_time_ms:g.ms})}),oO(t.project,t.dal,f);let h=d.violation;return h!==null?{kind:"g3_violation",summary:h.summary,violationKind:h.kind}:!a&&t.project.local_path.trim().length>0&&pd(t.project.local_path,f)?{kind:"g2_violation"}:{kind:"ok",text:g.text,ms:g.ms,argv:g.argv}}function iO(e,t){let r=e.raw;if(r==null)return;let s=r.message?.usage;if(s!==void 0){let o=To(s.input_tokens),a=To(s.output_tokens);(o>0||a>0)&&t(o,a);return}let i=r.usage;if(i!==void 0){let o=To(i.input_tokens),a=To(i.output_tokens);(o>0||a>0)&&t(o,a)}}function To(e){return typeof e=="number"&&Number.isFinite(e)&&e>=0?e:0}async function Gt(e,t,r,n){if(r.sessionid===null)return;let s=`${t}:write_back`,i=q(e,{run_id:e.run_id,state_name:s});e.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 ys({context:e,stateId:s,member:r,prompt:a,stepId:i.id,timeoutMs:e.workflow.default_task_timeout_ms,writesToProjectPath:!1});if(l.kind==="ok"){e.dal.insertStepArtifact({step_id:i.id,kind:"write_back_transcript",content:l.text});let c=!l.text.includes("STANCE: no_writeback");e.dal.finishStep(i.id,c?"wrote_back":"no_writeback","write_back_turn")}else e.dal.finishStep(i.id,null,`write_back_${l.kind}`)}catch{e.dal.finishStep(i.id,null,"write_back_error")}}async function mn(e,t,r,n,s,i,o,a=!1,l){let c=e.membersByAlias.get(r.alias);if(c===void 0||c.sessionid===null)return{outcome:null,text:"",status_detail:`missing_agent:${r.alias}`};let d=q(e,{run_id:e.run_id,state_name:t});e.steps_executed+=1;let u=[];c.prompt_snapshot!==null&&c.prompt_snapshot.length>0&&u.push(c.prompt_snapshot),i&&u.push(Cm(s)),l!=null&&l.length>0&&u.push(l);let f=r.prompt_template!==void 0?await Ke(r.prompt_template,e,t):"";f.length>0&&u.push(f),n!==null&&n.length>0&&u.push(n);let m=u.join(`
|
|
1845
1845
|
|
|
1846
1846
|
`);try{let p=await ys({context:e,stateId:t,member:c,prompt:m,stepId:d.id,timeoutMs:o,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 e.dal.insertSessionEvent({run_id:e.run_id,step_id:d.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(p.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:t,kind:p.violationKind,command_summary:p.summary,message:`State ${t} ran a classified side-effect command (${p.violationKind}) without a preceding approved Pause`}:{violation:"writes_to_project_path",state_id:t,message:`State ${t} wrote to project.local_path without writes_to_project_path: true`})}),e.dal.finishStep(d.id,null,g),{outcome:null,text:"",status_detail:g}}if(e.dal.insertStepArtifact({step_id:d.id,kind:`${t}_transcript`,content:p.text}),e.transcripts[t]=p.text,!i)return e.dal.finishStep(d.id,"done",`chat_ms=${p.ms}`),e.outcomes[t]="done",{outcome:"done",text:p.text,status_detail:`chat_ms=${p.ms}`};let _=_s(p.text,s);return e.dal.finishStep(d.id,_.outcome,_.outcome!==null?`chat_ms=${p.ms}`:_.reason),_.outcome!==null&&(e.outcomes[t]=_.outcome),{outcome:_.outcome,text:p.text,status_detail:_.outcome!==null?`chat_ms=${p.ms}`:_.reason}}catch(p){let _=p instanceof ve?`chat_${p.kind}`:"chat_other";return e.dal.finishStep(d.id,null,_),{outcome:null,text:"",status_detail:_}}}function pn(e,t){return(t?.length??0)>0?ng(e.project.local_path,t):null}function yg(e){return dd(ud(e))}function md(e,t){let r=e.dal.query(`SELECT state_name, outcome FROM step
|
|
1847
1847
|
WHERE run_id = ? AND state_name != ? AND ended_at IS NOT NULL
|
|
1848
|
-
ORDER BY started_at DESC, id DESC LIMIT 1`,e.run_id,t);if(r.length===0)return!1;let n=r[0];return e.workflow.states[n.state_name]?.type==="Interactive"&&n.outcome==="done"}function pd(e,t){if(!mg(e))return!1;let r=
|
|
1849
|
-
`);continue}if(e.durable_memory_mode==="db")try{t.upsertDurableMemory({project_id:e.id,type:c.type,name:c.name,description:c.description,body:c.body})}catch{}}}function lO(e){let t=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(t===null)return null;let r=t[1],n=t[2].trimStart(),s=r.match(/^name:\s*(.+)$/m),i=r.match(/^type:\s*(.+)$/m),o=r.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=i?.[1]?.trim();return a===void 0||a.length===0||l===void 0||!aO.has(l)?null:{name:a,type:l,description:o?.[1]?.trim()??null,body:n}}var gs,aO,qe=T(()=>{"use strict";Ze();ln();
|
|
1848
|
+
ORDER BY started_at DESC, id DESC LIMIT 1`,e.run_id,t);if(r.length===0)return!1;let n=r[0];return e.workflow.states[n.state_name]?.type==="Interactive"&&n.outcome==="done"}function pd(e,t){if(!mg(e))return!1;let r=bo(e,"durable-memory");function n(s){let i;try{i=pg(s,{withFileTypes:!0})}catch{return!1}for(let o of i){if(o.name===".git")continue;let a=bo(s,o.name);if(a!==r)if(o.isDirectory()){if(n(a))return!0}else try{if(_g(a).mtime>t)return!0}catch{}}return!1}return n(e)}function oO(e,t,r){let n=bo(e.local_path,"durable-memory");if(!mg(n))return;let s;try{s=pg(n)}catch{return}for(let i of s){if(!i.endsWith(".md")||i==="MEMORY.md")continue;let o=bo(n,i),a;try{a=_g(o).mtime}catch{continue}if(a<=r)continue;let l;try{l=rO(o,"utf8")}catch{continue}let c=lO(l);if(c===null){process.stderr.write(`[durable-memory-sync] warning: ${i} has no valid frontmatter, skipping
|
|
1849
|
+
`);continue}if(e.durable_memory_mode==="db")try{t.upsertDurableMemory({project_id:e.id,type:c.type,name:c.name,description:c.description,body:c.body})}catch{}}}function lO(e){let t=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(t===null)return null;let r=t[1],n=t[2].trimStart(),s=r.match(/^name:\s*(.+)$/m),i=r.match(/^type:\s*(.+)$/m),o=r.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=i?.[1]?.trim();return a===void 0||a.length===0||l===void 0||!aO.has(l)?null:{name:a,type:l,description:o?.[1]?.trim()??null,body:n}}var gs,aO,qe=T(()=>{"use strict";Ze();ln();Oi();sg();cd();Xn();lg();cg();hs();gs="__paused__:";aO=new Set(["user","feedback","project","reference"])});import{spawnSync as wg}from"node:child_process";function cO(e,t){let r=e.stateId,n=e.displayName,s=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;let i=e.project.local_path,o=wg("git",["diff","--quiet"],{cwd:i}).status!==0,a=wg("git",["diff","--cached","--quiet"],{cwd:i}).status!==0;if(o||a){let l=t.fail_message??"repository has uncommitted changes";return e.dal.finishStep(s.id,null,l),G(e,r,n,Lc),{kind:"terminal",terminal:Y(e.workflow)}}return e.dal.finishStep(s.id,"clean","repo_clean"),G(e,r,n,"clean"),X(e.workflow,t.next)}var Eg,Tg=T(()=>{"use strict";qe();Eg={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:e=>cO(e,e.state)}});async function dO(e,t){let r=e.stateId,n=e.displayName,s=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;for(let i of t.branches)if(await dg(i.when,e))return e.dal.finishStep(s.id,"matched",i.when),G(e,r,n,"matched"),X(e.workflow,i.next);return e.dal.finishStep(s.id,"no_match","choice_no_match"),G(e,r,n,"no_match"),t.default_next!==void 0?X(e.workflow,t.default_next):{kind:"terminal",terminal:e.workflow.terminals.no_match?"no_match":Y(e.workflow)}}var bg,Sg=T(()=>{"use strict";qe();hs();bg={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 e=>dO(e,e.state)}});async function uO(e,t){let r=e.stateId,n=e.displayName,s=e.workflow.default_task_timeout_ms,i=t.researchers??[],o=pn(e,t.durable_memory_tags),a=new Array(i.length).fill(null);await Promise.all(i.map(async(m,p)=>{let _=`${n}:researcher_${m.alias}[${p}]`,g=await mn(e,_,m,`TOPIC: ${m.topic}`,[],!1,s,!1,o);g.text.length>0&&(a[p]=g.text)}));let l=a.map((m,p)=>m!==null?`# Research ${p+1}: ${i[p]?.topic??""}
|
|
1850
1850
|
${m}`:null).filter(m=>m!==null).join(`
|
|
1851
1851
|
|
|
1852
|
-
`),c=`${n}:consolidator`,d=await mn(e,c,t.consolidator,l.length>0?l:null,["ok","error"],!0,s,!1,o),u=q(e,{run_id:e.run_id,state_name:n});if(e.steps_executed+=1,d.outcome===null||d.outcome==="error"){e.dal.finishStep(u.id,d.outcome,d.status_detail),d.outcome==="error"&&
|
|
1852
|
+
`),c=`${n}:consolidator`,d=await mn(e,c,t.consolidator,l.length>0?l:null,["ok","error"],!0,s,!1,o),u=q(e,{run_id:e.run_id,state_name:n});if(e.steps_executed+=1,d.outcome===null||d.outcome==="error"){e.dal.finishStep(u.id,d.outcome,d.status_detail),d.outcome==="error"&&G(e,r,n,"error");let m=t.outcomes.error;return m!==void 0?X(e.workflow,m):{kind:"terminal",terminal:Y(e.workflow)}}let f=t.research_artifact_prefix??n;if(e.dal.insertStepArtifact({step_id:u.id,kind:`${f}_consolidated`,content:d.text}),e.dal.finishStep(u.id,"ok","consolidated"),G(e,r,n,"ok"),t.write_back_durable_memory){let m=e.membersByAlias.get(t.consolidator.alias);m!==void 0&&await Gt(e,n,m,t.write_back_durable_memory)}return X(e.workflow,t.outcomes.ok)}var vg,kg=T(()=>{"use strict";qe();vg={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 e=>uO(e,e.state)}});async function fO(e,t){let r=e.stateId,n=e.displayName,s=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;let i=e.progress_step_id;e.progress_step_id=s.id;try{let o=await Eo(t.items_from,e),a=hO(o);if(a===null){e.dal.finishStep(s.id,null,`foreach_invalid_items:${t.items_from}`);let f=t.outcomes.any_failed;return f!==void 0?X(e.workflow,f):{kind:"terminal",terminal:Y(e.workflow)}}let l={routed:null},c=t.mode==="parallel"?await pO(e,t,s.id,a,l):await mO(e,t,s.id,a,l);if(l.routed!==null)return e.dal.finishStep(s.id,null,`foreach_propagated:${l.routed.kind}`),l.routed;let d=c.some(f=>f.outcome===null||f.outcome==="__failure__"),u=d?"any_failed":"all_ok";if(e.dal.finishStep(s.id,u,JSON.stringify({iterations:c,count:a.length})),G(e,r,n,u),d){let f=t.outcomes.any_failed;return f!==void 0?X(e.workflow,f):{kind:"terminal",terminal:Y(e.workflow)}}return X(e.workflow,t.outcomes.all_ok)}finally{e.progress_step_id=i}}async function mO(e,t,r,n,s){let i=[];for(let o=0;o<n.length;o+=1){let a=await Ng(e,t,r,n[o],o,s);if(s.routed!==null||(i.push(a),(a.outcome===null||a.outcome==="__failure__")&&t.on_item_failure==="stop"))break}return i}async function pO(e,t,r,n,s){let i=new Array(n.length),o=0,a=Array.from({length:Math.min(t.max_concurrency,n.length)},async()=>{for(;o<n.length&&s.routed===null;){let l=o;o+=1,i[l]=await Ng(e,t,r,n[l],l,s)}});return await Promise.all(a),i}async function Ng(e,t,r,n,s,i){let o=e.iteration;e.iteration={item:n,index:s};let a=`${e.displayName}[${s}]`;e.emit_progress?.({kind:"item_started",data:{index:s,item:n}});let l;try{l=await e.dispatchState(a,t.body,{parent_step_id:r,iteration:{item:n,index:s}})}finally{e.iteration=o}(l.kind==="paused"||l.kind==="escalate")&&i.routed===null&&(i.routed=l);let d=l.kind==="terminal"&&e.workflow.terminals[l.terminal]?.kind==="failure"?"__failure__":_O(e.outcomes[a]);return e.emit_progress?.({kind:d===null||d==="__failure__"?"item_failed":"item_completed",data:{index:s,item:n,outcome:d}}),{index:s,value:n,outcome:d}}function _O(e){return e==null?null:typeof e=="string"?e:JSON.stringify(e)}function hO(e){if(!Array.isArray(e))return null;let t=[];for(let r of e)if(typeof r=="string")t.push(r);else if(typeof r=="number"||typeof r=="boolean")t.push(String(r));else return null;return t}var Ig,xg=T(()=>{"use strict";qe();hs();Ig={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 e=>fO(e,e.state)}});async function gO(e,t){let r=e.stateId,n=e.displayName,s=t.termination.timeout_seconds!==void 0?t.termination.timeout_seconds*1e3:void 0,i=e.membersByAlias.get(t.agent.alias);if(i===void 0||i.sessionid===null){let f=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(f.id,null,`missing_agent:${t.agent.alias}`),{kind:"terminal",terminal:Y(e.workflow)}}let o=pn(e,t.durable_memory_tags),a=e.dal.getInteractiveSessionByRunAndState(e.run_id,r);if(a!==null){if(a.status==="done")return e.dal.finishStep(a.step_id,"done","operator_done"),e.outcomes[n]="done",t.write_back_durable_memory&&await Gt(e,n,i,t.write_back_durable_memory),X(e.workflow,t.outcomes.done);if(a.status==="waiting_agent"){if(a.turn_count>=t.termination.max_turns){e.dal.finishStep(a.step_id,"timeout",`max_turns=${t.termination.max_turns}`),G(e,r,n,"timeout");let m=t.outcomes.timeout;return m!==void 0?X(e.workflow,m):{kind:"terminal",terminal:Y(e.workflow)}}let f=a.last_operator_input??"";try{let m=await ys({context:e,stateId:n,member:i,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 e.dal.insertSessionEvent({run_id:e.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`})}),e.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:Y(e.workflow)}}return e.dal.setInteractiveAgentOutput(a.id,m.text,"waiting_operator"),t.termination.agent_signal!==void 0&&m.text.includes(t.termination.agent_signal)?(t.artifact_name!==void 0&&e.dal.insertStepArtifact({step_id:a.step_id,kind:t.artifact_name,content:m.text}),e.dal.finishStep(a.step_id,"done","agent_signal"),G(e,r,n,"done"),t.write_back_durable_memory&&await Gt(e,n,i,t.write_back_durable_memory),X(e.workflow,t.outcomes.done)):(Ag({context:e,state:t,stateId:r,displayName:n,stepId:a.step_id,agentText:m.text}),{kind:"paused"})}catch(m){let p=m instanceof ve?`chat_${m.kind}`:"chat_other";return e.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:Y(e.workflow)}}}return{kind:"paused"}}let l=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;let c=e.dal.insertInteractiveSession({run_id:e.run_id,step_id:l.id,state_name:r,status:"waiting_agent"}),d=await Ke(t.agent.initial_prompt_template,e,n),u=o?`${o}
|
|
1853
1853
|
|
|
1854
|
-
${d}`:d;try{let f=await ys({context:e,stateId:n,member:i,prompt:u,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 e.dal.insertSessionEvent({run_id:e.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`})}),e.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:Y(e.workflow)}}return e.dal.setInteractiveAgentOutput(c.id,f.text,"waiting_operator"),t.artifact_name!==void 0&&e.dal.insertStepArtifact({step_id:l.id,kind:t.artifact_name,content:f.text}),t.termination.agent_signal!==void 0&&f.text.includes(t.termination.agent_signal)?(e.dal.finishStep(l.id,"done","agent_signal"),e.outcomes[n]="done",t.write_back_durable_memory&&await Gt(e,n,i,t.write_back_durable_memory),
|
|
1854
|
+
${d}`:d;try{let f=await ys({context:e,stateId:n,member:i,prompt:u,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 e.dal.insertSessionEvent({run_id:e.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`})}),e.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:Y(e.workflow)}}return e.dal.setInteractiveAgentOutput(c.id,f.text,"waiting_operator"),t.artifact_name!==void 0&&e.dal.insertStepArtifact({step_id:l.id,kind:t.artifact_name,content:f.text}),t.termination.agent_signal!==void 0&&f.text.includes(t.termination.agent_signal)?(e.dal.finishStep(l.id,"done","agent_signal"),e.outcomes[n]="done",t.write_back_durable_memory&&await Gt(e,n,i,t.write_back_durable_memory),X(e.workflow,t.outcomes.done)):(Ag({context:e,state:t,stateId:r,displayName:n,stepId:l.id,agentText:f.text}),{kind:"paused"})}catch(f){let m=f instanceof ve?`chat_${f.kind}`:"chat_other";return e.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:Y(e.workflow)}}}function Ag(e){let{context:t,state:r,stateId:n,displayName:s,stepId:i,agentText:o}=e,a=O();t.dal.setRunPausedState(t.run_id,`${gs}${n}`,a),t.dal.raiseAttention({kind:"interactive_waiting_operator",severity:"attn",project_id:t.project.id,run_id:t.run_id,requires_user:!0,payload:JSON.stringify(yO({context:t,stateId:s,state:r,stepId:i,agentText:o,pausedAt:a}))}),t.dal.pauseJob(t.job.id)}function yO(e){let{context:t,stateId:r,state:n,stepId:s,agentText:i,pausedAt:o}=e,a=t.dal.getRun(t.run_id),l=wO(t,r),c={kind:"free_text",choices:null};return{run_id:t.run_id,step_id:s,state_name:r,workflow_name:t.workflow.name,workflow_version_id:a?.workflow_version_id??null,node_path:l,prompt:i,expected_response:c,transcript_tail:EO(i,3),paused_at:o,created_run_inputs:fr(t.job.payload)}}function wO(e,t){let r=[],s=e.dal.getRun(e.run_id)?.parent_run_id??null;for(let i=0;i<32&&s!==null;i+=1){let o=e.dal.getRun(s);if(o===null)break;o.current_state!==null&&r.unshift(o.current_state),s=o.parent_run_id}return r.push(t),r}function EO(e,t){if(typeof e!="string"||e.length===0)return[];let r=e.split(/\r?\n/);return(r.length>0&&r[r.length-1]===""?r.slice(0,-1):r).slice(-t)}var Rg,Lg=T(()=>{"use strict";Oi();qe();Rg={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 e=>gO(e,e.state)}});async function TO(e,t){let r=e.stateId,n=e.displayName,s=gg(e,t.over);if(s===null){let u=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1,e.dal.finishStep(u.id,null,`loop_invalid_items:${t.over}`);let f=t.outcomes.error;return f!==void 0?X(e.workflow,f):{kind:"terminal",terminal:Y(e.workflow)}}let i=e.workflow.states[t.body];if(i===void 0){let u=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(u.id,null,`loop_body_not_found:${t.body}`),{kind:"terminal",terminal:Y(e.workflow)}}let o=s.slice(0,t.max_items),a=[],l=!1;for(let u=0;u<o.length;u+=1){let f=o[u],m=`${n}[${u}]`,p=e.iteration;e.iteration={item:f,index:u};let _;try{_=await e.dispatchState(m,i,{iteration:{item:f,index:u}})}finally{e.iteration=p}if(_.kind==="paused"||_.kind==="escalate")return _;let g=bO(e.outcomes[m]);if(a.push({index:u,value:f,outcome:g}),g===null&&t.stop_on_error){l=!0;break}}let c=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;let d=l?"error":"ok";if(e.dal.finishStep(c.id,d,JSON.stringify({iterations:a,count:o.length})),G(e,r,n,d),l){let u=t.outcomes.error;return u!==void 0?X(e.workflow,u):{kind:"terminal",terminal:Y(e.workflow)}}return X(e.workflow,t.outcomes.ok)}function bO(e){return e==null?null:typeof e=="string"?e:JSON.stringify(e)}var Og,$g=T(()=>{"use strict";qe();Og={description:{displayName:"Loop",name:"loop",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],builtin:!0},execute:async e=>TO(e,e.state)}});import{createHash as SO}from"node:crypto";import{existsSync as vO,mkdirSync as kO,readFileSync as IO,writeFileSync as NO}from"node:fs";import{dirname as xO,isAbsolute as Mg,normalize as AO,resolve as ws}from"node:path";import{Document as RO,ExternalHyperlink as LO,HeadingLevel as _n,LevelFormat as OO,Packer as $O,Paragraph as mt,Table as CO,TableCell as MO,TableRow as jO,TextRun as pt,WidthType as DO}from"docx";import{marked as PO}from"marked";async function FO(e,t){let r=e.stateId,n=e.displayName,s=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;try{let i=await UO(e,t,n),o=await WO(e,t),a=await BO(e,t.title),l=await GO(i,a??e.workflow.name);if(l.length===0)throw new Error("rendered DOCX buffer was empty");return kO(xO(o),{recursive:!0}),NO(o,l),e.dal.insertStepArtifact({step_id:s.id,kind:"render_docx",path:o,sha:SO("sha256").update(l).digest("hex"),provider_call_mode:"library"}),e.dal.finishStep(s.id,"done",`wrote:${o}`),G(e,r,n,{output_path:o,path:o,bytes:l.length}),X(e.workflow,t.outcomes?.done??"@terminal:done")}catch(i){let o=i instanceof Error?i.message:String(i);return e.dal.finishStep(s.id,"error",o),G(e,r,n,{error:o}),X(e.workflow,t.outcomes?.error??"@terminal:error")}}async function UO(e,t,r){if(typeof t.markdown_source!="string"||t.markdown_source.trim().length===0)throw new Error("markdown_source is required");let n=(await Ke(t.markdown_source,e,r)).trim(),i=(n.length===0?XO(e,t.markdown_source):null)??n;if(i.length===0)throw new Error("markdown_source resolved empty");let o=HO(e.project.local_path,i);if(o!==null){if(!vO(o))throw new Error(`markdown_source file not found: ${o}`);return So(IO(o,"utf8"))}return So(i)}async function WO(e,t){if(typeof t.output_path!="string"||t.output_path.trim().length===0)throw new Error("output_path is required");let r=(await Ke(t.output_path,e,e.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=qO(e.project.local_path,r);if(!n.endsWith(".docx"))throw new Error(`output_path must end with .docx: ${n}`);return n}async function BO(e,t){if(typeof t!="string"||t.trim().length===0)return null;let r=(await Ke(t,e,e.stateId)).trim();return r.length===0?null:r}function qO(e,t){let r=ws(e);return AO(Mg(t)?ws(t):ws(r,t))}function HO(e,t){return JO(t)?Mg(t)?ws(t):ws(e,t):null}function JO(e){return e.endsWith(".md")||e.endsWith(".markdown")||e.startsWith("./")||e.startsWith("../")||e.startsWith("/")}function XO(e,t){let n=/context\.outcomes\.([A-Za-z0-9_-]+)\.output/.exec(t)?.[1];if(n===void 0)return null;let s=Object.entries(e.transcripts).filter(([o])=>o.startsWith(`${n}:coder[`)).sort(([o],[a])=>a.localeCompare(o))[0]?.[1];if(s!==void 0)return So(s);let i=e.dal.query(`SELECT sa.content
|
|
1855
1855
|
FROM step_artifact sa
|
|
1856
1856
|
JOIN step s ON s.id = sa.step_id
|
|
1857
1857
|
WHERE s.run_id = ?
|
|
1858
1858
|
AND s.state_name LIKE ?
|
|
1859
1859
|
AND sa.content IS NOT NULL
|
|
1860
1860
|
ORDER BY sa.id DESC
|
|
1861
|
-
LIMIT 1`,e.run_id,`${n}:coder[%`);return i[0]?.content===void 0?null:
|
|
1862
|
-
`).map(r=>new mt({children:[new pt({text:r.length===0?" ":r,font:"Courier New"})]}))}function mr(e){let t=e.tokens;return Array.isArray(t)?t:[]}function zO(e){return e.type==="list"&&Array.isArray(e.items)}function ZO(e){let t=e;return e.type==="table"&&Array.isArray(t.header)&&Array.isArray(t.rows)}function QO(e){return e.type==="code"&&typeof e.text=="string"}function e$(e){switch(e){case 1:return _n.HEADING_1;case 2:return _n.HEADING_2;case 3:return _n.HEADING_3;case 4:return _n.HEADING_4;case 5:return _n.HEADING_5;default:return _n.HEADING_6}}var jg,Pg=T(()=>{"use strict";qe();jg={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 e=>FO(e,e.state)}});import{createHash as t$}from"node:crypto";import{existsSync as r$,mkdirSync as n$,readFileSync as Fg,statSync as s$}from"node:fs";import{dirname as i$,isAbsolute as Ug,normalize as o$,resolve as Es}from"node:path";import{marked as a$}from"marked";import l$ from"write-excel-file/node";async function c$(e,t){let r=e.stateId,n=e.displayName,s=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;try{let i=await d$(e,t),o=u$(t.input_format),a=await f$(e,t),l=await m$(e,t.title),c=o==="markdown"?b$(i):g$(i);await S$({sheets:c.length===0?[{name:"Sheet1",headers:[],rows:[]}]:c,outputPath:a,title:l??e.workflow.name});let d=s$(a).size;if(d===0)throw new Error("rendered XLSX file was empty");let u=t$("sha256").update(Fg(a)).digest("hex");return e.dal.insertStepArtifact({step_id:s.id,kind:"render_xlsx",path:a,sha:u,provider_call_mode:"library"}),e.dal.finishStep(s.id,"done",`wrote:${a}`),
|
|
1863
|
-
${a}`:null,c,l,s,t.writes_to_project_path===!0,i);if(l){let g=og(p.text);if(g!==null){let h=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(h.id,null,`escalation_vocab:${g.token}`),{kind:"escalate",token:g.token,reason:g.reason.length>0?`${g.token}: ${g.reason}`:g.token}}}if(p.outcome===null){let g=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(g.id,null,p.status_detail),{kind:"escalate",token:"",reason:`coder_no_outcome:${p.status_detail}`}}if(o.length===0){if(t.outcomes_from_stance!==void 0){let S=Object.keys(t.outcomes_from_stance),y=_s(p.text,S);if(y.outcome===null){let I=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(I.id,null,`unhandled_stance:${y.reason}`),{kind:"escalate",token:"",reason:`no_stance:${y.reason}`}}let w=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(w.id,y.outcome,"outcomes_from_stance"),
|
|
1864
|
-
${p.text}`,["approve","request_changes"],!0,s,t.writes_to_project_path===!0)));if(_.every(g=>g.outcome==="approve")){let g=q(e,{run_id:e.run_id,state_name:n});if(e.steps_executed+=1,e.dal.finishStep(g.id,"approve",`loop=${f}`),
|
|
1861
|
+
LIMIT 1`,e.run_id,`${n}:coder[%`);return i[0]?.content===void 0?null:So(i[0].content)}function So(e){return e.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}async function GO(e,t){let r=Dg(PO.lexer(e,{gfm:!0})),n=new RO({title:t,numbering:{config:[{reference:"ordered-list",levels:[{level:0,format:OO.DECIMAL,text:"%1."}]}]},sections:[{children:r.length===0?[new mt("")]:r}]});return $O.toBuffer(n)}function Dg(e){let t=[];for(let r of e)switch(r.type){case"space":break;case"heading":t.push(new mt({heading:e$(r.depth),children:pr(mr(r))}));break;case"paragraph":t.push(new mt({children:pr(mr(r))}));break;case"text":t.push(new mt({children:mr(r).length===0?[new pt(r.text)]:pr(mr(r))}));break;case"blockquote":t.push(...Dg(mr(r)).map(n=>n instanceof mt?n:new mt({children:[new pt(r.text)]})));break;case"list":zO(r)&&t.push(...VO(r));break;case"table":ZO(r)&&t.push(KO(r));break;case"code":QO(r)&&t.push(...YO(r));break;case"hr":t.push(new mt(""));break;case"html":r.text.trim().length>0&&t.push(new mt({children:[new pt(r.text)]}));break;default:break}return t}function pr(e,t){let r=[];for(let n of e)switch(n.type){case"text":case"escape":r.push(new pt({text:n.text,..._d(t)}));break;case"strong":r.push(...pr(mr(n),{...t,bold:!0}));break;case"em":r.push(...pr(mr(n),{...t,italics:!0}));break;case"codespan":r.push(new pt({text:n.text,..._d({...t,code:!0})}));break;case"link":r.push(new LO({link:n.href,children:pr(mr(n),{...t})}));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,..._d(t)}));break}return r.length===0?[new pt("")]:r}function _d(e){return{...e?.bold===!0?{bold:!0}:{},...e?.italics===!0?{italics:!0}:{},...e?.code===!0?{font:"Courier New"}:{}}}function VO(e){return e.items.map(t=>new mt({children:pr(t.tokens.length===1&&t.tokens[0]?.type==="text"?[{...t.tokens[0],text:Cg(t)+t.tokens[0].text}]:[{type:"text",raw:t.text,text:Cg(t)+t.text}]),...e.ordered?{numbering:{reference:"ordered-list",level:0}}:{bullet:{level:0}}}))}function Cg(e){return e.task?`[${e.checked?"x":" "}] `:""}function KO(e){let t=[e.header,...e.rows].map(r=>new jO({children:r.map(n=>new MO({children:[new mt({children:pr(n.tokens,n.header?{bold:!0}:void 0)})]}))}));return new CO({width:{size:100,type:DO.PERCENTAGE},rows:t})}function YO(e){return e.text.split(`
|
|
1862
|
+
`).map(r=>new mt({children:[new pt({text:r.length===0?" ":r,font:"Courier New"})]}))}function mr(e){let t=e.tokens;return Array.isArray(t)?t:[]}function zO(e){return e.type==="list"&&Array.isArray(e.items)}function ZO(e){let t=e;return e.type==="table"&&Array.isArray(t.header)&&Array.isArray(t.rows)}function QO(e){return e.type==="code"&&typeof e.text=="string"}function e$(e){switch(e){case 1:return _n.HEADING_1;case 2:return _n.HEADING_2;case 3:return _n.HEADING_3;case 4:return _n.HEADING_4;case 5:return _n.HEADING_5;default:return _n.HEADING_6}}var jg,Pg=T(()=>{"use strict";qe();jg={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 e=>FO(e,e.state)}});import{createHash as t$}from"node:crypto";import{existsSync as r$,mkdirSync as n$,readFileSync as Fg,statSync as s$}from"node:fs";import{dirname as i$,isAbsolute as Ug,normalize as o$,resolve as Es}from"node:path";import{marked as a$}from"marked";import l$ from"write-excel-file/node";async function c$(e,t){let r=e.stateId,n=e.displayName,s=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;try{let i=await d$(e,t),o=u$(t.input_format),a=await f$(e,t),l=await m$(e,t.title),c=o==="markdown"?b$(i):g$(i);await S$({sheets:c.length===0?[{name:"Sheet1",headers:[],rows:[]}]:c,outputPath:a,title:l??e.workflow.name});let d=s$(a).size;if(d===0)throw new Error("rendered XLSX file was empty");let u=t$("sha256").update(Fg(a)).digest("hex");return e.dal.insertStepArtifact({step_id:s.id,kind:"render_xlsx",path:a,sha:u,provider_call_mode:"library"}),e.dal.finishStep(s.id,"done",`wrote:${a}`),G(e,r,n,{output_path:a,path:a,bytes:d}),X(e.workflow,t.outcomes?.done??"@terminal:done")}catch(i){let o=i instanceof Error?i.message:String(i);return e.dal.finishStep(s.id,"error",o),G(e,r,n,{error:o}),X(e.workflow,t.outcomes?.error??"@terminal:error")}}async function d$(e,t){if(typeof t.source!="string"||t.source.trim().length===0)return"";let r=(await Ke(t.source,e,e.stateId)).trim(),n=_$(e.project.local_path,r);if(n!==null){if(!r$(n))throw new Error(`source file not found: ${n}`);return Fg(n,"utf8")}return r}function u$(e){if(e==null||e==="")return"json";if(e==="json"||e==="markdown")return e;throw new Error(`unsupported input_format: ${String(e)}`)}async function f$(e,t){if(typeof t.output_path!="string"||t.output_path.trim().length===0)throw new Error("output_path is required");let r=(await Ke(t.output_path,e,e.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=p$(e.project.local_path,r);if(!n.endsWith(".xlsx"))throw new Error(`output_path must end with .xlsx: ${n}`);return n}async function m$(e,t){if(typeof t!="string"||t.trim().length===0)return null;let r=(await Ke(t,e,e.stateId)).trim();return r.length===0?null:r}function p$(e,t){let r=Es(e);return o$(Ug(t)?Es(t):Es(r,t))}function _$(e,t){return h$(t)?Ug(t)?Es(t):Es(e,t):null}function h$(e){return e.endsWith(".json")||e.endsWith(".md")||e.endsWith(".markdown")||e.startsWith("./")||e.startsWith("../")||e.startsWith("/")}function g$(e){if(e.trim().length===0)return[];let t;try{t=JSON.parse(e)}catch(r){let n=r instanceof Error?r.message:String(r);throw new Error(`invalid JSON source: ${n}`)}if(!vo(t)||!Array.isArray(t.sheets))throw new Error("JSON source must be an object with sheets[]");return t.sheets.map((r,n)=>y$(r,n))}function y$(e,t){if(!vo(e))throw new Error(`sheets[${t}] must be an object`);let r=w$(e.headers,`sheets[${t}].headers`),n=E$(e.rows,`sheets[${t}].rows`);return{name:typeof e.name=="string"&&e.name.trim().length>0?e.name:`Sheet${t+1}`,headers:r,rows:n,headerStyle:T$(e.styles)}}function w$(e,t){if(e===void 0)return[];if(!Array.isArray(e)||!e.every(r=>typeof r=="string"))throw new Error(`${t} must be an array of strings`);return e}function E$(e,t){if(e===void 0)return[];if(!Array.isArray(e))throw new Error(`${t} must be an array`);return e.map((r,n)=>{if(!Array.isArray(r))throw new Error(`${t}[${n}] must be an array`);return r.map((s,i)=>{if(s===null||typeof s=="string"||typeof s=="number"||typeof s=="boolean")return s;throw new Error(`${t}[${n}][${i}] must be string, number, boolean, or null`)})})}function T$(e){if(!vo(e)||!vo(e.headers))return;let t={};return e.headers.bold===!0&&(t.bold=!0),typeof e.headers.fill=="string"&&(t.fill=e.headers.fill),Object.keys(t).length===0?void 0:t}function b$(e){let t=a$.lexer(e,{gfm:!0}),r=[],n=null;for(let s of t){if(R$(s)){n=s.text;continue}L$(s)&&(r.push({name:n??`Sheet${r.length+1}`,headers:s.header.map(i=>i.text),rows:s.rows.map(i=>i.map(o=>o.text)),headerStyle:{bold:!0}}),n=null)}return r}async function S$(e){n$(i$(e.outputPath),{recursive:!0});let t=new Set,r=e.sheets.map(n=>({sheet:N$(n.name,t),data:v$(n),columns:I$(n)}));await l$(r).toFile(e.outputPath)}function v$(e){let t=[];if(e.headers.length>0){let r=A$(e.headerStyle?.fill);t.push(e.headers.map(n=>({value:n,type:String,fontWeight:e.headerStyle?.bold===!1?void 0:"bold",backgroundColor:r??void 0})))}for(let r of e.rows)t.push(r.map(k$));return t.length===0?[[{}]]:t}function k$(e){return e===null?{}:typeof e=="string"?{value:e,type:String}:typeof e=="number"?{value:e,type:Number}:typeof e=="boolean"?{value:e,type:Boolean}:{}}function I$(e){let t=Math.max(e.headers.length,...e.rows.map(n=>n.length),1),r=[];for(let n=1;n<=t;n+=1){let s=[e.headers[n-1],...e.rows.map(o=>o[n-1])],i=Math.min(60,Math.max(10,...s.map(o=>String(o??"").length+2)));r.push({width:i})}return r}function N$(e,t){let r=x$(e),n=r,s=2;for(;t.has(n.toLowerCase());){let i=` ${s}`;n=`${r.slice(0,31-i.length)}${i}`,s+=1}return t.add(n.toLowerCase()),n}function x$(e){let t=e.replace(/[\[\]:*?/\\]/g," ").trim();return(t.length===0?"Sheet":t).slice(0,31)}function A$(e){if(e===void 0)return null;let t=e.startsWith("#")?e.slice(1):e;return/^[0-9a-fA-F]{6}$/.test(t)?`#${t.toUpperCase()}`:null}function R$(e){return e.type==="heading"&&typeof e.text=="string"}function L$(e){let t=e;return e.type==="table"&&Array.isArray(t.header)&&Array.isArray(t.rows)}function vo(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var Wg,Bg=T(()=>{"use strict";qe();Wg={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 e=>c$(e,e.state)}});import{spawnSync as O$}from"node:child_process";async function C$(e,t){let r=e.stateId,n=e.displayName,s=e.workflow.default_task_timeout_ms;for(let f of t.pre_checks??[])if(O$("sh",["-c",f.command],{cwd:e.project.local_path}).status!==0){let p=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1,e.dal.finishStep(p.id,"fail_pre_check",`pre_check_failed:${f.description??f.command}`),G(e,r,n,"fail_pre_check");let _=t.outcomes.fail_pre_check;return _!==void 0?X(e.workflow,_):{kind:"terminal",terminal:Y(e.workflow)}}let i=pn(e,t.durable_memory_tags),o=t.reviewers??[],a=null,l=o.length===0&&t.outcomes_from_stance!==void 0,c=l?Object.keys(t.outcomes_from_stance):[];for(let f=0;f<t.max_loops;f+=1){let m=`${n}:coder[${f}]`,p=await mn(e,m,t.coder,a!==null?`PRIOR REVIEW FEEDBACK:
|
|
1863
|
+
${a}`:null,c,l,s,t.writes_to_project_path===!0,i);if(l){let g=og(p.text);if(g!==null){let h=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(h.id,null,`escalation_vocab:${g.token}`),{kind:"escalate",token:g.token,reason:g.reason.length>0?`${g.token}: ${g.reason}`:g.token}}}if(p.outcome===null){let g=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(g.id,null,p.status_detail),{kind:"escalate",token:"",reason:`coder_no_outcome:${p.status_detail}`}}if(o.length===0){if(t.outcomes_from_stance!==void 0){let S=Object.keys(t.outcomes_from_stance),y=_s(p.text,S);if(y.outcome===null){let I=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(I.id,null,`unhandled_stance:${y.reason}`),{kind:"escalate",token:"",reason:`no_stance:${y.reason}`}}let w=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(w.id,y.outcome,"outcomes_from_stance"),G(e,r,n,y.outcome),X(e.workflow,t.outcomes_from_stance[y.outcome])}let g=_s(p.text,$$);if(g.outcome!==null){let S=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(S.id,g.outcome,"default_failure_stance"),G(e,r,n,g.outcome),{kind:"escalate",token:g.outcome,reason:`failure_stance:${g.outcome}`}}let h=q(e,{run_id:e.run_id,state_name:n});if(e.steps_executed+=1,e.dal.finishStep(h.id,"approve","no_reviewers"),G(e,r,n,"approve"),t.write_back_durable_memory){let S=e.membersByAlias.get(t.coder.alias);S!==void 0&&await Gt(e,n,S,t.write_back_durable_memory)}return X(e.workflow,t.outcomes.approve)}let _=await Promise.all(o.map(g=>mn(e,`${n}:reviewer_${g.alias}[${f}]`,g,`CODER OUTPUT:
|
|
1864
|
+
${p.text}`,["approve","request_changes"],!0,s,t.writes_to_project_path===!0)));if(_.every(g=>g.outcome==="approve")){let g=q(e,{run_id:e.run_id,state_name:n});if(e.steps_executed+=1,e.dal.finishStep(g.id,"approve",`loop=${f}`),G(e,r,n,"approve"),t.write_back_durable_memory){let h=e.membersByAlias.get(t.coder.alias);h!==void 0&&await Gt(e,n,h,t.write_back_durable_memory)}return X(e.workflow,t.outcomes.approve)}if(a=_.filter(g=>g.outcome==="request_changes").map(g=>g.text).join(`
|
|
1865
1865
|
|
|
1866
|
-
`),t.loop_feedback_artifact!==void 0){let g=q(e,{run_id:e.run_id,state_name:`${n}:feedback[${f}]`});e.steps_executed+=1,e.dal.finishStep(g.id,"feedback_captured",`loop=${f}`),e.dal.insertStepArtifact({step_id:g.id,kind:t.loop_feedback_artifact,content:a})}}let d=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1,e.dal.finishStep(d.id,"max_loops_exceeded",`loops=${t.max_loops}`),X(e,r,n,"max_loops_exceeded");let u=t.outcomes.max_loops_exceeded;return u!==void 0?J(e.workflow,u):{kind:"terminal",terminal:Y(e.workflow)}}var $$,qg,Hg=T(()=>{"use strict";cd();qe();$$=["blocked","failed","aborted"],qg={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 e=>C$(e,e.state)}});import{spawnSync as M$}from"node:child_process";async function j$(e,t){let r=e.stateId,n=e.displayName,s=await Ke(t.command,e,n),i=md(e,n),o=yg(s);if(o.matched&&!i){let _=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.insertSessionEvent({run_id:e.run_id,step_id:_.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"side_effect_without_pause",state_id:n,kind:o.kind,command:s,message:`ShellStep ${n} runs a classified side-effect command (${o.kind}) without a preceding approved gate`})}),e.dal.finishStep(_.id,null,`policy_violation:side_effect_without_pause:${o.kind}`),{kind:"terminal",terminal:Y(e.workflow)}}let a=new Date(Date.now()-1),l=typeof t.timeout_ms=="number"&&t.timeout_ms>0,c=M$("sh",["-c",s],{cwd:e.project.local_path,...l?{timeout:t.timeout_ms}:{},encoding:"utf8",env:{...process.env}}),d=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;let u=typeof c.stderr=="string"?c.stderr:"",f=c.error;if((u.length>0||f!==void 0)&&e.dal.insertSessionEvent({run_id:e.run_id,step_id:d.id,kind:"shellstep_stderr",timestamp_ms:Date.now(),payload:JSON.stringify({state_id:n,exit_status:c.status,stderr:u,spawn_error:f===void 0?null:f instanceof Error?f.message:String(f),command:s})}),c.status===null)return l?(e.dal.finishStep(d.id,null,`timeout:${t.timeout_ms}ms`),{kind:"terminal",terminal:"shell_step_timeout"}):(e.dal.finishStep(d.id,null,"shell_step_signal_terminated"),{kind:"terminal",terminal:Y(e.workflow)});if(t.writes_to_project_path!==!0&&e.project.local_path.trim().length>0&&pd(e.project.local_path,a))return e.dal.insertSessionEvent({run_id:e.run_id,step_id:d.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`})}),e.dal.finishStep(d.id,null,"policy_violation:writes_to_project_path"),{kind:"terminal",terminal:Y(e.workflow)};if(t.capture_output_to!==void 0){let _=c.stdout??"";e.dal.insertStepArtifact({step_id:d.id,kind:t.capture_output_to,content:_})}let m=String(c.status),p=t.outcomes_from_exit[m]??t.outcomes_from_exit.default;return p===void 0?(e.dal.insertStepArtifact({step_id:d.id,kind:"unhandled_exit",content:m}),e.dal.finishStep(d.id,null,`shell_step_unhandled_exit:${m}`),{kind:"terminal",terminal:"shell_step_unhandled_exit"}):(e.dal.finishStep(d.id,m,`exit=${c.status}`),X(e,r,n,m),J(e.workflow,p))}var Jg,Xg=T(()=>{"use strict";qe();Jg={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 e=>j$(e,e.state)}});async function D$(e,t){let r=e.stateId,n=e.displayName,s=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;let i=e.dal.getWorkflowByName(t.workflow_name);if(i===null)return e.dal.finishStep(s.id,null,`subflow_missing_workflow:${t.workflow_name}`),{kind:"terminal",terminal:Y(e.workflow)};let o=ct(i.definition),a=await P$(e,t),l=await e.runChildWorkflow(i,o,a);if(l.paused===!0)return e.dal.finishStep(s.id,null,`subflow_paused:${l.run_id}`),{kind:"paused"};let c=l.terminal_state;if(c===null)return e.dal.finishStep(s.id,null,`subflow_no_terminal:${l.run_id}`),{kind:"terminal",terminal:Y(e.workflow)};X(e,r,n,F$(e,l.run_id,o.outputs??[])),e.dal.finishStep(s.id,c,`child_run=${l.run_id}`);let d=t.outcomes[c]??t.outcomes.default;return d===void 0?{kind:"terminal",terminal:Y(e.workflow)}:J(e.workflow,d)}async function P$(e,t){let r={};for(let[n,s]of Object.entries(t.inputs??{})){let i=await ug(s,e);r[n]=i===s?await wo(s,e):i}return r}function F$(e,t,r){let n={};for(let s of r)n[s.name]=U$(e,t,s);return n}function U$(e,t,r){let s=e.dal.query("SELECT * FROM step WHERE run_id = ? AND state_name = ? ORDER BY id DESC LIMIT 1",t,r.source_step_id)[0];if(s===void 0)return null;let i=W$(s,r.source_field);if(i.found)return i.value;let a=e.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 W$(e,t){switch(t){case"id":return{found:!0,value:e.id};case"run_id":return{found:!0,value:e.run_id};case"parent_step_id":return{found:!0,value:e.parent_step_id};case"state_name":return{found:!0,value:e.state_name};case"outcome":return{found:!0,value:e.outcome};case"status_detail":return{found:!0,value:e.status_detail};case"started_at":return{found:!0,value:e.started_at};case"ended_at":return{found:!0,value:e.ended_at};default:return{found:!1}}}var Gg,Vg=T(()=>{"use strict";cs();qe();hs();Gg={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 e=>D$(e,e.state)}});function B$(e,t){let r=e.stateId,n=e.displayName,s=t.name??n,i=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(i.id,s,t.kind??"neutral"),X(e,r,n,s),{kind:"terminal",terminal:s}}var Kg,Yg=T(()=>{"use strict";qe();Kg={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:e=>B$(e,e.state)}});async function q$(e){let t=typeof e.parameters.org=="string"?e.parameters.org:"",r=typeof e.parameters.repo=="string"?e.parameters.repo:"";if(t.length===0||r.length===0)return null;let n=new URL(`https://api.github.com/repos/${t}/${r}/issues`);n.searchParams.set("state","open"),typeof e.parameters.label=="string"&&e.parameters.label.length>0&&n.searchParams.set("labels",e.parameters.label),typeof e.parameters.since=="string"&&e.parameters.since.length>0&&n.searchParams.set("since",e.parameters.since);let s=await fetch(n);if(!s.ok)throw new Error(`github issue trigger failed: HTTP ${s.status}`);let i=await s.json();if(!Array.isArray(i))throw new Error("github issue trigger returned unexpected JSON");let o=H$(e.cursor),a=i.filter(J$).filter(c=>c.id>o);if(a.length===0)return null;let l=Math.max(...a.map(c=>c.id));return{main:a.map(c=>({trigger_id:e.trigger_id,issue_id:c.id,issue_number:c.number,issue_url:c.html_url,title:c.title,cursor:String(l)}))}}function H$(e){if(e===void 0)return 0;let t=Number(e);return Number.isFinite(t)?t:0}function J$(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let t=e;return typeof t.id=="number"&&typeof t.number=="number"&&typeof t.html_url=="string"&&typeof t.title=="string"}var zg,Zg=T(()=>{"use strict";zg={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 e=>q$(e)}});async function X$(e){let t=typeof e.parameters.cron=="string"?e.parameters.cron.trim():"";if(t.length===0)return null;let r=new Date(Date.now()).toISOString().slice(0,16);return e.cursor===r?null:{main:[{trigger_id:e.trigger_id,fired_at:new Date(Date.now()).toISOString(),cursor:r,cron:t}]}}var Qg,ey=T(()=>{"use strict";Qg={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 e=>X$(e)}});function ty(e){e.register(Eg),e.register(qg),e.register(vg),e.register(Rg),e.register(Og),e.register(jg),e.register(Wg),e.register(Jg),e.register(bg),e.register(Ig),e.register(Gg),e.register(Kg),e.register(Qg),e.register(zg)}var ry=T(()=>{"use strict";Tg();Sg();kg();xg();Lg();$g();Pg();Bg();Hg();Xg();Vg();Yg();Zg();ey()});function ny(){return vo===null&&(vo=new hd,ty(vo)),vo}var G$,hd,vo,sy=T(()=>{"use strict";ry();G$={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"},hd=class{types=new Map;register(t){let r=`${t.description.namespace}/${t.description.name}`;if(this.types.has(r))throw new Error(`archetype already registered: ${r}`);this.types.set(r,t)}get(t){let r=t.includes("/")?t:G$[t];return r?this.types.get(r):void 0}list(){return Array.from(this.types.values())}},vo=null});async function ay(e){fy(e.workflow);let t=e.workflowRow??e.dal.getWorkflowByName(e.workflow.name,e.workflow.version);if(t===null)throw new Error(`workflow ${e.workflow.name}@${e.workflow.version} is not registered`);let r=e.dal.getProjectByJob(e.job.id);if(r===null)throw new Error(`job ${e.job.id} has no project`);let n=K$(t.definition,e.workflow),s=e.job.run_id===null?null:e.dal.getRun(e.job.run_id),i=Ts(n)?n.entry_step_id:n.start_at,o=s?.terminal_state===null?s:e.dal.insertRun({job_id:e.job.id,workflow_id:t.id,team_id:e.team.id,current_state:i}),a=n.requires,l=Qh(a);if(l!==null)return e.dal.setRunTerminalState(o.id,"aborted"),e.dal.raiseAttention({kind:"missing_workflow_dependency",severity:"error",project_id:r.id,run_id:o.id,payload:JSON.stringify({run_id:o.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:o.id,terminal_state:"aborted",steps_executed:0};let c=new Map(e.members.map(m=>[m.alias,m]));if(Ts(n)){let m=gd({dal:e.dal,workflow:Io(n),job:e.job,project:r,run:o,membersByAlias:c,outcomes:s!==null&&o===s?e.dal.listLatestStepOutcomesByState(o.id):{},inputs:fr(e.job.payload)??{},team_id:e.team.id}),p=await cy(n,m,o.current_state??n.entry_step_id);return oy(e.dal,r.id,o.id,n.name,p),p}let d=s!==null&&o===s?e.dal.listLatestStepOutcomesByState(o.id):{},u=gd({dal:e.dal,workflow:n,job:e.job,project:r,run:o,membersByAlias:c,outcomes:d,inputs:fr(e.job.payload)??{},team_id:e.team.id}),f=await ly(u,o.current_state??n.start_at);return oy(e.dal,r.id,o.id,n.name,f),f}function oy(e,t,r,n,s){if(s.paused===!0)return;let i=s.terminal_state;if(i===null)return;let o="unknown",a=!1;try{let d=e.getRun(r);if(d!==null){let u=e.getWorkflow(d.workflow_id);if(u!==null){let f=JSON.parse(u.definition),p=(f.terminals??{})[i];if(p!==void 0&&typeof p.kind=="string"&&(p.kind==="success"||p.kind==="failure"||p.kind==="neutral")&&(o=p.kind),o==="unknown"&&Array.isArray(f.steps)){for(let g of f.steps)if(g.type==="lmctl/terminal"&&g.parameters!==null&&typeof g.parameters=="object"){let h=g.parameters;if(h.name===i&&(h.kind==="success"||h.kind==="failure"||h.kind==="neutral")){o=h.kind;break}}}let _=f.errors;if(_!==null&&typeof _=="object"){let g=_;(g.on_unhandled_failure!==void 0||g.on_unhandled_failure_state!==void 0)&&(a=!0)}}}}catch{}if(o==="success"||o==="failure"&&a)return;let l=null;try{l=e.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=o==="failure"?"workflow_failed":"workflow_has_issues";e.raiseAttention({kind:c,severity:o==="failure"?"error":"warn",project_id:t,run_id:r,payload:JSON.stringify({run_id:r,workflow_name:n,terminal_state:i,terminal_kind:o,last_error:l})})}function gd(e){let t={dal:e.dal,workflow:e.workflow,job:e.job,project:e.project,run_id:e.run.id,membersByAlias:e.membersByAlias,inputs:e.inputs,outcomes:e.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 i=t.parent_step_id,o=t.iteration;t.parent_step_id=s?.parent_step_id??i,t.iteration=s?.iteration??o;try{return await yd(t,r,n,s?.display_name??r)}finally{t.parent_step_id=i,t.iteration=o}},runChildWorkflow:async(r,n,s)=>{fy(n);let i=Ts(n)?n.entry_step_id:n.start_at,o=e.dal.insertRun({job_id:e.job.id,workflow_id:r.id,team_id:e.team_id,current_state:i,parent_run_id:t.run_id}),a=gd({dal:e.dal,workflow:Ts(n)?Io(n):n,job:e.job,project:e.project,run:o,membersByAlias:e.membersByAlias,outcomes:{},inputs:s,team_id:e.team_id});return Ts(n)?cy(n,a,o.current_state??n.entry_step_id):ly(a,o.current_state??n.start_at)}};return t}async function ly(e,t){let r=t;if(r.startsWith(gs))return{run_id:e.run_id,terminal_state:null,steps_executed:0,paused:!0};for(let s=0;s<1e3;s+=1){if(r.startsWith("@terminal:"))return Vt(e,r.slice(10));e.dal.setRunCurrentState(e.run_id,r),e.last_state_id=r;let i=e.workflow.states[r];if(i===void 0){let l=ko(e,Y(e.workflow));if(l.kind==="paused")return Me(e);if(l.kind==="escalate")return tt(e,{id:r,name:r,type:"unknown"},l.token,l.reason),Me(e);if(l.kind==="terminal")return Vt(e,l.terminal);r=l.state;continue}let o,a=uy(e,r);if(a!==null){let l=q(e,{run_id:e.run_id,state_name:r});if(e.steps_executed+=1,e.dal.finishStep(l.id,a,"escalation_resume"),X(e,r,r,a),a===Jn)return Vt(e,il);let c=i.outcomes?.[a];o=c!==void 0?J(e.workflow,c):tt(e,{id:r,name:r,type:i.type},a,`no declared edge for resumed outcome '${a}' from state '${r}'`)}else o=await yd(e,r,i);if(o.kind==="paused")return Me(e);if(o.kind==="escalate")return tt(e,{id:r,name:r,type:i.type},o.token,o.reason),Me(e);if(o.kind==="terminal"){let l=ko(e,o.terminal);if(l.kind==="paused")return Me(e);if(l.kind==="escalate")return tt(e,{id:r,name:r,type:i.type},l.token,l.reason),Me(e);if(l.kind==="terminal")return Vt(e,l.terminal);r=l.state;continue}r=o.state}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})});let n=ko(e,Y(e.workflow));return n.kind==="terminal"?Vt(e,n.terminal):Vt(e,Y(e.workflow))}async function cy(e,t,r){let n=new Map(e.steps.map(o=>[o.id,o])),s=new Map(e.steps.map(o=>[o.name,o])),i=r;for(let o=0;o<1e3;o+=1){t.dal.setRunCurrentState(t.run_id,i);let a=n.get(i);if(a===void 0)return tt(t,{id:i,name:i,type:"unknown"},"",`internal:unknown v3 step '${i}'`),Me(t);let l=uy(t,a.id);if(l!==null){let m=q(t,{run_id:t.run_id,state_name:a.name});if(t.steps_executed+=1,t.dal.finishStep(m.id,l,"escalation_resume"),X(t,a.id,a.name,l),l===Jn)return Vt(t,il);let p=Object.keys(e.connections[a.id]??{}),_=e.connections[a.id]?.[l]?.[0]?.[0]?.step_id??e.connections[a.id]?.main?.[0]?.[0]?.step_id;if(_===void 0)return tt(t,{id:a.id,name:a.name,type:a.type},l,`no declared edge for resumed outcome '${l}' from step '${a.id}'`,{declared_outcomes:p}),Me(t);i=_;continue}let c=await V$(t,e,a);if(c.kind==="paused")return Me(t);let d=Object.keys(e.connections[a.id]??{});if(c.kind==="escalate")return tt(t,{id:a.id,name:a.name,type:a.type},c.token,c.reason,{declared_outcomes:d}),Me(t);let u=c.kind==="terminal"?c.terminal:c.state;if(a.type==="lmctl/terminal"){let m=t.workflow;t.workflow=Io(e,a);try{let p=ko(t,u);if(p.kind==="paused")return Me(t);if(p.kind==="escalate")return tt(t,{id:a.id,name:a.name,type:a.type},p.token,p.reason),Me(t);if(p.kind==="terminal")return Vt(t,p.terminal);let _=s.get(p.state);if(_===void 0)return tt(t,{id:a.id,name:a.name,type:a.type},"",`internal:unknown v3 error handler step '${p.state}'`),Me(t);i=_.id;continue}finally{t.workflow=m}}if(Vr(u))return tt(t,{id:a.id,name:a.name,type:a.type},u,`generic escalation '${u}' from step '${a.id}'`,{declared_outcomes:d}),Me(t);let f=e.connections[a.id]?.[u]?.[0]?.[0]?.step_id??e.connections[a.id]?.main?.[0]?.[0]?.step_id;if(f===void 0)return tt(t,{id:a.id,name:a.name,type:a.type},u,`no declared edge for outcome '${u}' from step '${a.id}'`,{declared_outcomes:d}),Me(t);i=f}return 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})}),Vt(t,"aborted")}async function V$(e,t,r){let n=dy(t,r),s=e.workflow;e.workflow=Io(t,r);try{return await yd(e,r.id,n,r.name)}finally{e.workflow=s}}function dy(e,t){let r=t.parameters,n=t.members??{},s=Object.keys(e.connections[t.id]??{}),i=Object.fromEntries(s.map(a=>[a,`@terminal:${a}`])),o={state_name:t.name};switch(t.type){case"lmctl/review":{let a=s.filter(l=>!["approve","request_changes","fail_pre_check","max_loops_exceeded"].includes(l));return{...o,type:"Review",...r,coder:n.coder,reviewers:n.reviewers,outcomes:{approve:i.approve??"@terminal:approve",...i.request_changes!==void 0?{request_changes:i.request_changes}:{},...i.fail_pre_check!==void 0?{fail_pre_check:i.fail_pre_check}:{},...i.max_loops_exceeded!==void 0?{max_loops_exceeded:i.max_loops_exceeded}:{}},...a.length>0?{outcomes_from_stance:Object.fromEntries(a.map(l=>[l,`@terminal:${l}`]))}:{}}}case"lmctl/consolidate":return{...o,type:"Consolidate",...r,researchers:n.researchers,consolidator:n.consolidator,outcomes:{ok:i.ok??"@terminal:ok",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/interactive":return{...o,type:"Interactive",...r,agent:n.agent,outcomes:{done:i.done??"@terminal:done",...i.timeout!==void 0?{timeout:i.timeout}:{}}};case"lmctl/loop":return{...o,type:"Loop",...r,outcomes:{ok:i.ok??"@terminal:ok",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/render-docx":return{...o,type:"lmctl/render-docx",...r,outcomes:{done:i.done??"@terminal:done",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/render-xlsx":return{...o,type:"lmctl/render-xlsx",...r,outcomes:{done:i.done??"@terminal:done",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/shell-step":return{...o,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{...o,type:"AssertRepoClean",...r,next:i.main??"@terminal:main"};case"lmctl/choice":return{...o,type:"Choice",...r};case"lmctl/foreach":return{...o,type:"ForEach",...r,outcomes:{all_ok:i.all_ok??"@terminal:all_ok",...i.any_failed!==void 0?{any_failed:i.any_failed}:{}}};case"lmctl/subflow":return{...o,type:"Subflow",...r,outcomes:i};case"lmctl/terminal":return{...o,type:"Terminal",name:r.name,kind:r.kind};default:return{...o,type:t.type,...r}}}async function yd(e,t,r,n){let s=ny().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 i=e.emit_progress,o=e.progress_step_id;e.emit_progress=s.description.emits_progress===!0?Z$(e,s):void 0,e.progress_step_id=null;try{return await s.execute(hg(e,t,r,n??t))}finally{e.emit_progress=i,e.progress_step_id=o}}function K$(e,t){try{let r=JSON.parse(e);if(z$(r)&&r.definition_schema_version===3)return It.parse(r)}catch{return t}return t}function Ts(e){return e.definition_schema_version===3}function Io(e,t){let r=t===void 0?[]:Object.keys(e.connections[t.id]??{}),n=Object.fromEntries(r.map(i=>[i,{kind:i==="aborted"?"failure":"neutral"}])),s={};if(t?.type==="lmctl/loop"&&typeof t.parameters.body=="string"){let i=e.steps.find(o=>o.name===t.parameters.body);i!==void 0&&(s[t.parameters.body]=dy(e,i))}return t?.type==="lmctl/terminal"&&typeof t.parameters.name=="string"&&(n[t.parameters.name]={kind:Y$(t.parameters.kind)}),n.aborted??={kind:"failure"},{name:e.name,version:e.version,definition_schema_version:2,primitive_version:2,start_at:t?.name??e.entry_step_id,states:s,terminals:n,...e.default_task_timeout_ms!==void 0?{default_task_timeout_ms:e.default_task_timeout_ms}:{},...e.concurrency_key!==void 0?{concurrency_key:e.concurrency_key}:{},...e.concurrent_limit!==void 0?{concurrent_limit:e.concurrent_limit}:{},...e.errors!==void 0?{errors:e.errors}:{}}}function Y$(e){return e==="success"||e==="failure"||e==="neutral"?e:"neutral"}function z$(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Z$(e,t){let r=`progress.${t.description.namespace}/${t.description.name}`;return n=>{try{if(typeof n.kind!="string"||n.kind.length===0)return;e.dal.insertSessionEvent({run_id:e.run_id,step_id:e.progress_step_id,kind:`${r}.${n.kind}`,timestamp_ms:Date.now(),payload:JSON.stringify({message:n.message,data:n.data})})}catch(s){let i=s instanceof Error?s.message:String(s);console.warn(`[progress] dropped ${r} event: ${i}`)}}}function Vt(e,t){e.dal.setRunTerminalState(e.run_id,t);try{Kh(e.run_id,e.dal)}catch{}return{run_id:e.run_id,terminal_state:t,steps_executed:e.steps_executed}}function Me(e){return{run_id:e.run_id,terminal_state:null,steps_executed:e.steps_executed,paused:!0}}function uy(e,t){let n=e.dal.getRun(e.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 i=s[t];if(typeof i!="string")return null;delete s[t];let o=Object.keys(s).length>0?JSON.stringify(s):null;return e.dal.setRunPendingEscalationDecision(e.run_id,o),i}function ko(e,t){if(!Q$(e.workflow,t)||e.errors_block_fired)return{kind:"terminal",terminal:t};let r=e.workflow.errors;return r===void 0?{kind:"terminal",terminal:t}:(e.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&&eC(e,t,r.on_unhandled_failure),{kind:"terminal",terminal:t}))}function Q$(e,t){return e.definition_schema_version===2&&e.terminals[t]?.kind==="failure"}function eC(e,t,r){let n=tC(e),s=r.capture_evidence&&n!==null?rC(e,n.id):[];e.dal.raiseAttention({kind:r.attention_kind,severity:r.severity,project_id:e.project.id,run_id:e.run_id,payload:JSON.stringify({run_id:e.run_id,terminal_state:t,current_state:e.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 tC(e){return e.dal.query("SELECT id, state_name, outcome, status_detail FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",e.run_id)[0]??null}function rC(e,t){return e.dal.query("SELECT path FROM step_artifact WHERE step_id = ? AND path IS NOT NULL ORDER BY id DESC",t).map(n=>n.path)}function fy(e){if(!iy.includes(e.definition_schema_version))throw new Error(`unsupported definition_schema_version ${e.definition_schema_version}; supported versions: ${iy.join(", ")}`)}var iy,my=T(()=>{"use strict";cn();Yh();eg();qe();sy();Xn();iy=[1,2,3]});import{readFileSync as nC,readdirSync as sC}from"node:fs";import{basename as iC,join as oC,resolve as aC}from"node:path";function hy(e={}){let t=aC(e.workflowsDir??"workflows"),r=sC(t).filter(n=>n.endsWith(".compound.json")).sort((n,s)=>n.localeCompare(s));return{generated_at:new Date().toISOString(),workflows_dir:t,rows:r.map(n=>lC(oC(t,n)))}}function lC(e){let t=iC(e);try{let r=nC(e,"utf8"),n=ct(r);return wy(t,n)}catch(r){return{file:t,workflow_name:null,status:"FAIL",first_step_id:null,first_step_type:null,first_step_disposition:null,note:Ey(r)}}}function gy(e,t){try{let r=ct(t);return wy(e,r)}catch(r){return{file:e,workflow_name:e,status:"FAIL",first_step_id:null,first_step_type:null,first_step_disposition:null,note:Ey(r)}}}function yy(e){let t=[];t.push(`workflow verification - ${e.generated_at}`),t.push(`dir: ${e.workflows_dir}`),t.push(""),t.push(`${"status".padEnd(17)} ${"workflow".padEnd(36)} ${"first step".padEnd(52)} note`),t.push(`${"-".repeat(17)} ${"-".repeat(36)} ${"-".repeat(52)} ${"-".repeat(30)}`);for(let i of e.rows){let o=(i.workflow_name??i.file).slice(0,36).padEnd(36),a=`${i.first_step_id??"-"}${i.first_step_type===null?"":` (${i.first_step_type})`}`;t.push(`${i.status.padEnd(17)} ${o} ${a.slice(0,52).padEnd(52)} ${i.note}`)}let r=e.rows.filter(i=>i.status==="PASS").length,n=e.rows.filter(i=>i.status==="PASS_NEEDS_INPUTS").length,s=e.rows.filter(i=>i.status==="FAIL").length;return t.push(""),t.push(`summary: ${r} pass, ${n} pass_needs_inputs, ${s} fail`),`${t.join(`
|
|
1866
|
+
`),t.loop_feedback_artifact!==void 0){let g=q(e,{run_id:e.run_id,state_name:`${n}:feedback[${f}]`});e.steps_executed+=1,e.dal.finishStep(g.id,"feedback_captured",`loop=${f}`),e.dal.insertStepArtifact({step_id:g.id,kind:t.loop_feedback_artifact,content:a})}}let d=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1,e.dal.finishStep(d.id,"max_loops_exceeded",`loops=${t.max_loops}`),G(e,r,n,"max_loops_exceeded");let u=t.outcomes.max_loops_exceeded;return u!==void 0?X(e.workflow,u):{kind:"terminal",terminal:Y(e.workflow)}}var $$,qg,Hg=T(()=>{"use strict";cd();qe();$$=["blocked","failed","aborted"],qg={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 e=>C$(e,e.state)}});import{spawnSync as M$}from"node:child_process";async function j$(e,t){let r=e.stateId,n=e.displayName,s=await Ke(t.command,e,n),i=md(e,n),o=yg(s);if(o.matched&&!i){let _=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.insertSessionEvent({run_id:e.run_id,step_id:_.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"side_effect_without_pause",state_id:n,kind:o.kind,command:s,message:`ShellStep ${n} runs a classified side-effect command (${o.kind}) without a preceding approved gate`})}),e.dal.finishStep(_.id,null,`policy_violation:side_effect_without_pause:${o.kind}`),{kind:"terminal",terminal:Y(e.workflow)}}let a=new Date(Date.now()-1),l=typeof t.timeout_ms=="number"&&t.timeout_ms>0,c=M$("sh",["-c",s],{cwd:e.project.local_path,...l?{timeout:t.timeout_ms}:{},encoding:"utf8",env:{...process.env}}),d=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;let u=typeof c.stderr=="string"?c.stderr:"",f=c.error;if((u.length>0||f!==void 0)&&e.dal.insertSessionEvent({run_id:e.run_id,step_id:d.id,kind:"shellstep_stderr",timestamp_ms:Date.now(),payload:JSON.stringify({state_id:n,exit_status:c.status,stderr:u,spawn_error:f===void 0?null:f instanceof Error?f.message:String(f),command:s})}),c.status===null)return l?(e.dal.finishStep(d.id,null,`timeout:${t.timeout_ms}ms`),{kind:"terminal",terminal:"shell_step_timeout"}):(e.dal.finishStep(d.id,null,"shell_step_signal_terminated"),{kind:"terminal",terminal:Y(e.workflow)});if(t.writes_to_project_path!==!0&&e.project.local_path.trim().length>0&&pd(e.project.local_path,a))return e.dal.insertSessionEvent({run_id:e.run_id,step_id:d.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`})}),e.dal.finishStep(d.id,null,"policy_violation:writes_to_project_path"),{kind:"terminal",terminal:Y(e.workflow)};if(t.capture_output_to!==void 0){let _=c.stdout??"";e.dal.insertStepArtifact({step_id:d.id,kind:t.capture_output_to,content:_})}let m=String(c.status),p=t.outcomes_from_exit[m]??t.outcomes_from_exit.default;return p===void 0?(e.dal.insertStepArtifact({step_id:d.id,kind:"unhandled_exit",content:m}),e.dal.finishStep(d.id,null,`shell_step_unhandled_exit:${m}`),{kind:"terminal",terminal:"shell_step_unhandled_exit"}):(e.dal.finishStep(d.id,m,`exit=${c.status}`),G(e,r,n,m),X(e.workflow,p))}var Jg,Xg=T(()=>{"use strict";qe();Jg={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 e=>j$(e,e.state)}});async function D$(e,t){let r=e.stateId,n=e.displayName,s=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;let i=e.dal.getWorkflowByName(t.workflow_name);if(i===null)return e.dal.finishStep(s.id,null,`subflow_missing_workflow:${t.workflow_name}`),{kind:"terminal",terminal:Y(e.workflow)};let o=ct(i.definition),a=await P$(e,t),l=await e.runChildWorkflow(i,o,a);if(l.paused===!0)return e.dal.finishStep(s.id,null,`subflow_paused:${l.run_id}`),{kind:"paused"};let c=l.terminal_state;if(c===null)return e.dal.finishStep(s.id,null,`subflow_no_terminal:${l.run_id}`),{kind:"terminal",terminal:Y(e.workflow)};G(e,r,n,F$(e,l.run_id,o.outputs??[])),e.dal.finishStep(s.id,c,`child_run=${l.run_id}`);let d=t.outcomes[c]??t.outcomes.default;return d===void 0?{kind:"terminal",terminal:Y(e.workflow)}:X(e.workflow,d)}async function P$(e,t){let r={};for(let[n,s]of Object.entries(t.inputs??{})){let i=await ug(s,e);r[n]=i===s?await Eo(s,e):i}return r}function F$(e,t,r){let n={};for(let s of r)n[s.name]=U$(e,t,s);return n}function U$(e,t,r){let s=e.dal.query("SELECT * FROM step WHERE run_id = ? AND state_name = ? ORDER BY id DESC LIMIT 1",t,r.source_step_id)[0];if(s===void 0)return null;let i=W$(s,r.source_field);if(i.found)return i.value;let a=e.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 W$(e,t){switch(t){case"id":return{found:!0,value:e.id};case"run_id":return{found:!0,value:e.run_id};case"parent_step_id":return{found:!0,value:e.parent_step_id};case"state_name":return{found:!0,value:e.state_name};case"outcome":return{found:!0,value:e.outcome};case"status_detail":return{found:!0,value:e.status_detail};case"started_at":return{found:!0,value:e.started_at};case"ended_at":return{found:!0,value:e.ended_at};default:return{found:!1}}}var Gg,Vg=T(()=>{"use strict";cs();qe();hs();Gg={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 e=>D$(e,e.state)}});function B$(e,t){let r=e.stateId,n=e.displayName,s=t.name??n,i=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(i.id,s,t.kind??"neutral"),G(e,r,n,s),{kind:"terminal",terminal:s}}var Kg,Yg=T(()=>{"use strict";qe();Kg={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:e=>B$(e,e.state)}});async function q$(e){let t=typeof e.parameters.org=="string"?e.parameters.org:"",r=typeof e.parameters.repo=="string"?e.parameters.repo:"";if(t.length===0||r.length===0)return null;let n=new URL(`https://api.github.com/repos/${t}/${r}/issues`);n.searchParams.set("state","open"),typeof e.parameters.label=="string"&&e.parameters.label.length>0&&n.searchParams.set("labels",e.parameters.label),typeof e.parameters.since=="string"&&e.parameters.since.length>0&&n.searchParams.set("since",e.parameters.since);let s=await fetch(n);if(!s.ok)throw new Error(`github issue trigger failed: HTTP ${s.status}`);let i=await s.json();if(!Array.isArray(i))throw new Error("github issue trigger returned unexpected JSON");let o=H$(e.cursor),a=i.filter(J$).filter(c=>c.id>o);if(a.length===0)return null;let l=Math.max(...a.map(c=>c.id));return{main:a.map(c=>({trigger_id:e.trigger_id,issue_id:c.id,issue_number:c.number,issue_url:c.html_url,title:c.title,cursor:String(l)}))}}function H$(e){if(e===void 0)return 0;let t=Number(e);return Number.isFinite(t)?t:0}function J$(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let t=e;return typeof t.id=="number"&&typeof t.number=="number"&&typeof t.html_url=="string"&&typeof t.title=="string"}var zg,Zg=T(()=>{"use strict";zg={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 e=>q$(e)}});async function X$(e){let t=typeof e.parameters.cron=="string"?e.parameters.cron.trim():"";if(t.length===0)return null;let r=new Date(Date.now()).toISOString().slice(0,16);return e.cursor===r?null:{main:[{trigger_id:e.trigger_id,fired_at:new Date(Date.now()).toISOString(),cursor:r,cron:t}]}}var Qg,ey=T(()=>{"use strict";Qg={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 e=>X$(e)}});function ty(e){e.register(Eg),e.register(qg),e.register(vg),e.register(Rg),e.register(Og),e.register(jg),e.register(Wg),e.register(Jg),e.register(bg),e.register(Ig),e.register(Gg),e.register(Kg),e.register(Qg),e.register(zg)}var ry=T(()=>{"use strict";Tg();Sg();kg();xg();Lg();$g();Pg();Bg();Hg();Xg();Vg();Yg();Zg();ey()});function ny(){return ko===null&&(ko=new hd,ty(ko)),ko}var G$,hd,ko,sy=T(()=>{"use strict";ry();G$={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"},hd=class{types=new Map;register(t){let r=`${t.description.namespace}/${t.description.name}`;if(this.types.has(r))throw new Error(`archetype already registered: ${r}`);this.types.set(r,t)}get(t){let r=t.includes("/")?t:G$[t];return r?this.types.get(r):void 0}list(){return Array.from(this.types.values())}},ko=null});async function ay(e){fy(e.workflow);let t=e.workflowRow??e.dal.getWorkflowByName(e.workflow.name,e.workflow.version);if(t===null)throw new Error(`workflow ${e.workflow.name}@${e.workflow.version} is not registered`);let r=e.dal.getProjectByJob(e.job.id);if(r===null)throw new Error(`job ${e.job.id} has no project`);let n=K$(t.definition,e.workflow),s=e.job.run_id===null?null:e.dal.getRun(e.job.run_id),i=Ts(n)?n.entry_step_id:n.start_at,o=s?.terminal_state===null?s:e.dal.insertRun({job_id:e.job.id,workflow_id:t.id,team_id:e.team.id,current_state:i}),a=n.requires,l=Qh(a);if(l!==null)return e.dal.setRunTerminalState(o.id,"aborted"),e.dal.raiseAttention({kind:"missing_workflow_dependency",severity:"error",project_id:r.id,run_id:o.id,payload:JSON.stringify({run_id:o.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:o.id,terminal_state:"aborted",steps_executed:0};let c=new Map(e.members.map(m=>[m.alias,m]));if(Ts(n)){let m=gd({dal:e.dal,workflow:No(n),job:e.job,project:r,run:o,membersByAlias:c,outcomes:s!==null&&o===s?e.dal.listLatestStepOutcomesByState(o.id):{},inputs:fr(e.job.payload)??{},team_id:e.team.id}),p=await cy(n,m,o.current_state??n.entry_step_id);return oy(e.dal,r.id,o.id,n.name,p),p}let d=s!==null&&o===s?e.dal.listLatestStepOutcomesByState(o.id):{},u=gd({dal:e.dal,workflow:n,job:e.job,project:r,run:o,membersByAlias:c,outcomes:d,inputs:fr(e.job.payload)??{},team_id:e.team.id}),f=await ly(u,o.current_state??n.start_at);return oy(e.dal,r.id,o.id,n.name,f),f}function oy(e,t,r,n,s){if(s.paused===!0)return;let i=s.terminal_state;if(i===null)return;let o="unknown",a=!1;try{let d=e.getRun(r);if(d!==null){let u=e.getWorkflow(d.workflow_id);if(u!==null){let f=JSON.parse(u.definition),p=(f.terminals??{})[i];if(p!==void 0&&typeof p.kind=="string"&&(p.kind==="success"||p.kind==="failure"||p.kind==="neutral")&&(o=p.kind),o==="unknown"&&Array.isArray(f.steps)){for(let g of f.steps)if(g.type==="lmctl/terminal"&&g.parameters!==null&&typeof g.parameters=="object"){let h=g.parameters;if(h.name===i&&(h.kind==="success"||h.kind==="failure"||h.kind==="neutral")){o=h.kind;break}}}let _=f.errors;if(_!==null&&typeof _=="object"){let g=_;(g.on_unhandled_failure!==void 0||g.on_unhandled_failure_state!==void 0)&&(a=!0)}}}}catch{}if(o==="success"||o==="failure"&&a)return;let l=null;try{l=e.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=o==="failure"?"workflow_failed":"workflow_has_issues";e.raiseAttention({kind:c,severity:o==="failure"?"error":"warn",project_id:t,run_id:r,payload:JSON.stringify({run_id:r,workflow_name:n,terminal_state:i,terminal_kind:o,last_error:l})})}function gd(e){let t={dal:e.dal,workflow:e.workflow,job:e.job,project:e.project,run_id:e.run.id,membersByAlias:e.membersByAlias,inputs:e.inputs,outcomes:e.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 i=t.parent_step_id,o=t.iteration;t.parent_step_id=s?.parent_step_id??i,t.iteration=s?.iteration??o;try{return await yd(t,r,n,s?.display_name??r)}finally{t.parent_step_id=i,t.iteration=o}},runChildWorkflow:async(r,n,s)=>{fy(n);let i=Ts(n)?n.entry_step_id:n.start_at,o=e.dal.insertRun({job_id:e.job.id,workflow_id:r.id,team_id:e.team_id,current_state:i,parent_run_id:t.run_id}),a=gd({dal:e.dal,workflow:Ts(n)?No(n):n,job:e.job,project:e.project,run:o,membersByAlias:e.membersByAlias,outcomes:{},inputs:s,team_id:e.team_id});return Ts(n)?cy(n,a,o.current_state??n.entry_step_id):ly(a,o.current_state??n.start_at)}};return t}async function ly(e,t){let r=t;if(r.startsWith(gs))return{run_id:e.run_id,terminal_state:null,steps_executed:0,paused:!0};for(let s=0;s<1e3;s+=1){if(r.startsWith("@terminal:"))return Vt(e,r.slice(10));e.dal.setRunCurrentState(e.run_id,r),e.last_state_id=r;let i=e.workflow.states[r];if(i===void 0){let l=Io(e,Y(e.workflow));if(l.kind==="paused")return Me(e);if(l.kind==="escalate")return tt(e,{id:r,name:r,type:"unknown"},l.token,l.reason),Me(e);if(l.kind==="terminal")return Vt(e,l.terminal);r=l.state;continue}let o,a=uy(e,r);if(a!==null){let l=q(e,{run_id:e.run_id,state_name:r});if(e.steps_executed+=1,e.dal.finishStep(l.id,a,"escalation_resume"),G(e,r,r,a),a===Jn)return Vt(e,il);let c=i.outcomes?.[a];o=c!==void 0?X(e.workflow,c):tt(e,{id:r,name:r,type:i.type},a,`no declared edge for resumed outcome '${a}' from state '${r}'`)}else o=await yd(e,r,i);if(o.kind==="paused")return Me(e);if(o.kind==="escalate")return tt(e,{id:r,name:r,type:i.type},o.token,o.reason),Me(e);if(o.kind==="terminal"){let l=Io(e,o.terminal);if(l.kind==="paused")return Me(e);if(l.kind==="escalate")return tt(e,{id:r,name:r,type:i.type},l.token,l.reason),Me(e);if(l.kind==="terminal")return Vt(e,l.terminal);r=l.state;continue}r=o.state}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})});let n=Io(e,Y(e.workflow));return n.kind==="terminal"?Vt(e,n.terminal):Vt(e,Y(e.workflow))}async function cy(e,t,r){let n=new Map(e.steps.map(o=>[o.id,o])),s=new Map(e.steps.map(o=>[o.name,o])),i=r;for(let o=0;o<1e3;o+=1){t.dal.setRunCurrentState(t.run_id,i);let a=n.get(i);if(a===void 0)return tt(t,{id:i,name:i,type:"unknown"},"",`internal:unknown v3 step '${i}'`),Me(t);let l=uy(t,a.id);if(l!==null){let m=q(t,{run_id:t.run_id,state_name:a.name});if(t.steps_executed+=1,t.dal.finishStep(m.id,l,"escalation_resume"),G(t,a.id,a.name,l),l===Jn)return Vt(t,il);let p=Object.keys(e.connections[a.id]??{}),_=e.connections[a.id]?.[l]?.[0]?.[0]?.step_id??e.connections[a.id]?.main?.[0]?.[0]?.step_id;if(_===void 0)return tt(t,{id:a.id,name:a.name,type:a.type},l,`no declared edge for resumed outcome '${l}' from step '${a.id}'`,{declared_outcomes:p}),Me(t);i=_;continue}let c=await V$(t,e,a);if(c.kind==="paused")return Me(t);let d=Object.keys(e.connections[a.id]??{});if(c.kind==="escalate")return tt(t,{id:a.id,name:a.name,type:a.type},c.token,c.reason,{declared_outcomes:d}),Me(t);let u=c.kind==="terminal"?c.terminal:c.state;if(a.type==="lmctl/terminal"){let m=t.workflow;t.workflow=No(e,a);try{let p=Io(t,u);if(p.kind==="paused")return Me(t);if(p.kind==="escalate")return tt(t,{id:a.id,name:a.name,type:a.type},p.token,p.reason),Me(t);if(p.kind==="terminal")return Vt(t,p.terminal);let _=s.get(p.state);if(_===void 0)return tt(t,{id:a.id,name:a.name,type:a.type},"",`internal:unknown v3 error handler step '${p.state}'`),Me(t);i=_.id;continue}finally{t.workflow=m}}if(Vr(u))return tt(t,{id:a.id,name:a.name,type:a.type},u,`generic escalation '${u}' from step '${a.id}'`,{declared_outcomes:d}),Me(t);let f=e.connections[a.id]?.[u]?.[0]?.[0]?.step_id??e.connections[a.id]?.main?.[0]?.[0]?.step_id;if(f===void 0)return tt(t,{id:a.id,name:a.name,type:a.type},u,`no declared edge for outcome '${u}' from step '${a.id}'`,{declared_outcomes:d}),Me(t);i=f}return 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})}),Vt(t,"aborted")}async function V$(e,t,r){let n=dy(t,r),s=e.workflow;e.workflow=No(t,r);try{return await yd(e,r.id,n,r.name)}finally{e.workflow=s}}function dy(e,t){let r=t.parameters,n=t.members??{},s=Object.keys(e.connections[t.id]??{}),i=Object.fromEntries(s.map(a=>[a,`@terminal:${a}`])),o={state_name:t.name};switch(t.type){case"lmctl/review":{let a=s.filter(l=>!["approve","request_changes","fail_pre_check","max_loops_exceeded"].includes(l));return{...o,type:"Review",...r,coder:n.coder,reviewers:n.reviewers,outcomes:{approve:i.approve??"@terminal:approve",...i.request_changes!==void 0?{request_changes:i.request_changes}:{},...i.fail_pre_check!==void 0?{fail_pre_check:i.fail_pre_check}:{},...i.max_loops_exceeded!==void 0?{max_loops_exceeded:i.max_loops_exceeded}:{}},...a.length>0?{outcomes_from_stance:Object.fromEntries(a.map(l=>[l,`@terminal:${l}`]))}:{}}}case"lmctl/consolidate":return{...o,type:"Consolidate",...r,researchers:n.researchers,consolidator:n.consolidator,outcomes:{ok:i.ok??"@terminal:ok",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/interactive":return{...o,type:"Interactive",...r,agent:n.agent,outcomes:{done:i.done??"@terminal:done",...i.timeout!==void 0?{timeout:i.timeout}:{}}};case"lmctl/loop":return{...o,type:"Loop",...r,outcomes:{ok:i.ok??"@terminal:ok",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/render-docx":return{...o,type:"lmctl/render-docx",...r,outcomes:{done:i.done??"@terminal:done",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/render-xlsx":return{...o,type:"lmctl/render-xlsx",...r,outcomes:{done:i.done??"@terminal:done",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/shell-step":return{...o,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{...o,type:"AssertRepoClean",...r,next:i.main??"@terminal:main"};case"lmctl/choice":return{...o,type:"Choice",...r};case"lmctl/foreach":return{...o,type:"ForEach",...r,outcomes:{all_ok:i.all_ok??"@terminal:all_ok",...i.any_failed!==void 0?{any_failed:i.any_failed}:{}}};case"lmctl/subflow":return{...o,type:"Subflow",...r,outcomes:i};case"lmctl/terminal":return{...o,type:"Terminal",name:r.name,kind:r.kind};default:return{...o,type:t.type,...r}}}async function yd(e,t,r,n){let s=ny().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 i=e.emit_progress,o=e.progress_step_id;e.emit_progress=s.description.emits_progress===!0?Z$(e,s):void 0,e.progress_step_id=null;try{return await s.execute(hg(e,t,r,n??t))}finally{e.emit_progress=i,e.progress_step_id=o}}function K$(e,t){try{let r=JSON.parse(e);if(z$(r)&&r.definition_schema_version===3)return It.parse(r)}catch{return t}return t}function Ts(e){return e.definition_schema_version===3}function No(e,t){let r=t===void 0?[]:Object.keys(e.connections[t.id]??{}),n=Object.fromEntries(r.map(i=>[i,{kind:i==="aborted"?"failure":"neutral"}])),s={};if(t?.type==="lmctl/loop"&&typeof t.parameters.body=="string"){let i=e.steps.find(o=>o.name===t.parameters.body);i!==void 0&&(s[t.parameters.body]=dy(e,i))}return t?.type==="lmctl/terminal"&&typeof t.parameters.name=="string"&&(n[t.parameters.name]={kind:Y$(t.parameters.kind)}),n.aborted??={kind:"failure"},{name:e.name,version:e.version,definition_schema_version:2,primitive_version:2,start_at:t?.name??e.entry_step_id,states:s,terminals:n,...e.default_task_timeout_ms!==void 0?{default_task_timeout_ms:e.default_task_timeout_ms}:{},...e.concurrency_key!==void 0?{concurrency_key:e.concurrency_key}:{},...e.concurrent_limit!==void 0?{concurrent_limit:e.concurrent_limit}:{},...e.errors!==void 0?{errors:e.errors}:{}}}function Y$(e){return e==="success"||e==="failure"||e==="neutral"?e:"neutral"}function z$(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Z$(e,t){let r=`progress.${t.description.namespace}/${t.description.name}`;return n=>{try{if(typeof n.kind!="string"||n.kind.length===0)return;e.dal.insertSessionEvent({run_id:e.run_id,step_id:e.progress_step_id,kind:`${r}.${n.kind}`,timestamp_ms:Date.now(),payload:JSON.stringify({message:n.message,data:n.data})})}catch(s){let i=s instanceof Error?s.message:String(s);console.warn(`[progress] dropped ${r} event: ${i}`)}}}function Vt(e,t){e.dal.setRunTerminalState(e.run_id,t);try{Kh(e.run_id,e.dal)}catch{}return{run_id:e.run_id,terminal_state:t,steps_executed:e.steps_executed}}function Me(e){return{run_id:e.run_id,terminal_state:null,steps_executed:e.steps_executed,paused:!0}}function uy(e,t){let n=e.dal.getRun(e.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 i=s[t];if(typeof i!="string")return null;delete s[t];let o=Object.keys(s).length>0?JSON.stringify(s):null;return e.dal.setRunPendingEscalationDecision(e.run_id,o),i}function Io(e,t){if(!Q$(e.workflow,t)||e.errors_block_fired)return{kind:"terminal",terminal:t};let r=e.workflow.errors;return r===void 0?{kind:"terminal",terminal:t}:(e.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&&eC(e,t,r.on_unhandled_failure),{kind:"terminal",terminal:t}))}function Q$(e,t){return e.definition_schema_version===2&&e.terminals[t]?.kind==="failure"}function eC(e,t,r){let n=tC(e),s=r.capture_evidence&&n!==null?rC(e,n.id):[];e.dal.raiseAttention({kind:r.attention_kind,severity:r.severity,project_id:e.project.id,run_id:e.run_id,payload:JSON.stringify({run_id:e.run_id,terminal_state:t,current_state:e.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 tC(e){return e.dal.query("SELECT id, state_name, outcome, status_detail FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",e.run_id)[0]??null}function rC(e,t){return e.dal.query("SELECT path FROM step_artifact WHERE step_id = ? AND path IS NOT NULL ORDER BY id DESC",t).map(n=>n.path)}function fy(e){if(!iy.includes(e.definition_schema_version))throw new Error(`unsupported definition_schema_version ${e.definition_schema_version}; supported versions: ${iy.join(", ")}`)}var iy,my=T(()=>{"use strict";cn();Yh();eg();qe();sy();Xn();iy=[1,2,3]});import{readFileSync as nC,readdirSync as sC}from"node:fs";import{basename as iC,join as oC,resolve as aC}from"node:path";function hy(e={}){let t=aC(e.workflowsDir??"workflows"),r=sC(t).filter(n=>n.endsWith(".compound.json")).sort((n,s)=>n.localeCompare(s));return{generated_at:new Date().toISOString(),workflows_dir:t,rows:r.map(n=>lC(oC(t,n)))}}function lC(e){let t=iC(e);try{let r=nC(e,"utf8"),n=ct(r);return wy(t,n)}catch(r){return{file:t,workflow_name:null,status:"FAIL",first_step_id:null,first_step_type:null,first_step_disposition:null,note:Ey(r)}}}function gy(e,t){try{let r=ct(t);return wy(e,r)}catch(r){return{file:e,workflow_name:e,status:"FAIL",first_step_id:null,first_step_type:null,first_step_disposition:null,note:Ey(r)}}}function yy(e){let t=[];t.push(`workflow verification - ${e.generated_at}`),t.push(`dir: ${e.workflows_dir}`),t.push(""),t.push(`${"status".padEnd(17)} ${"workflow".padEnd(36)} ${"first step".padEnd(52)} note`),t.push(`${"-".repeat(17)} ${"-".repeat(36)} ${"-".repeat(52)} ${"-".repeat(30)}`);for(let i of e.rows){let o=(i.workflow_name??i.file).slice(0,36).padEnd(36),a=`${i.first_step_id??"-"}${i.first_step_type===null?"":` (${i.first_step_type})`}`;t.push(`${i.status.padEnd(17)} ${o} ${a.slice(0,52).padEnd(52)} ${i.note}`)}let r=e.rows.filter(i=>i.status==="PASS").length,n=e.rows.filter(i=>i.status==="PASS_NEEDS_INPUTS").length,s=e.rows.filter(i=>i.status==="FAIL").length;return t.push(""),t.push(`summary: ${r} pass, ${n} pass_needs_inputs, ${s} fail`),`${t.join(`
|
|
1867
1867
|
`)}
|
|
1868
|
-
`}function wy(e,t){let r=dC(t),n=uC(t);if(r===null||n===null)return{file:e,workflow_name:t.name,status:"FAIL",first_step_id:r,first_step_type:n,first_step_disposition:null,note:"entry step missing after validation"};let s=cC(t.inputs);return s.length>0?{file:e,workflow_name:t.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:e,workflow_name:t.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 cC(e){return(e??[]).filter(t=>t.required===!0&&t.default===void 0).map(t=>t.name)}function dC(e){return wd(e)?e.entry_step_id:e.start_at}function uC(e){return wd(e)?e.steps.find(t=>t.id===e.entry_step_id)?.type??null:e.states[e.start_at]?.type??null}function wd(e){return e.definition_schema_version===3}function Ey(e){return e instanceof Xt?e.issues.map(t=>`${t.path}: ${t.message}`).join("; "):e instanceof SyntaxError?`JSON parse failed: ${e.message}`:e instanceof Error?e.message:String(e)}function Ty(e){let t=new Set;if(wd(e))for(let r of e.steps){let n=r.members??{};py(n,t)}else for(let r of Object.values(e.states))py(r,t);return[...t].sort()}function py(e,t){let r=["coder","agent","consolidator"],n=["reviewers","researchers"];for(let s of r){let i=e[s],o=_y(i);o!==null&&t.add(o)}for(let s of n){let i=e[s];if(Array.isArray(i))for(let o of i){let a=_y(o);a!==null&&t.add(a)}}}function _y(e){if(e===null||typeof e!="object")return null;let t=e.alias;return typeof t=="string"&&t.length>0?t:null}var
|
|
1868
|
+
`}function wy(e,t){let r=dC(t),n=uC(t);if(r===null||n===null)return{file:e,workflow_name:t.name,status:"FAIL",first_step_id:r,first_step_type:n,first_step_disposition:null,note:"entry step missing after validation"};let s=cC(t.inputs);return s.length>0?{file:e,workflow_name:t.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:e,workflow_name:t.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 cC(e){return(e??[]).filter(t=>t.required===!0&&t.default===void 0).map(t=>t.name)}function dC(e){return wd(e)?e.entry_step_id:e.start_at}function uC(e){return wd(e)?e.steps.find(t=>t.id===e.entry_step_id)?.type??null:e.states[e.start_at]?.type??null}function wd(e){return e.definition_schema_version===3}function Ey(e){return e instanceof Xt?e.issues.map(t=>`${t.path}: ${t.message}`).join("; "):e instanceof SyntaxError?`JSON parse failed: ${e.message}`:e instanceof Error?e.message:String(e)}function Ty(e){let t=new Set;if(wd(e))for(let r of e.steps){let n=r.members??{};py(n,t)}else for(let r of Object.values(e.states))py(r,t);return[...t].sort()}function py(e,t){let r=["coder","agent","consolidator"],n=["reviewers","researchers"];for(let s of r){let i=e[s],o=_y(i);o!==null&&t.add(o)}for(let s of n){let i=e[s];if(Array.isArray(i))for(let o of i){let a=_y(o);a!==null&&t.add(a)}}}function _y(e){if(e===null||typeof e!="object")return null;let t=e.alias;return typeof t=="string"&&t.length>0?t:null}var xo=T(()=>{"use strict";cs()});function fC({dal:e}){let t=e.listProjects();for(let r of t){let s=e.query("SELECT * FROM job WHERE project_id = ? AND source = ? ORDER BY id DESC LIMIT 1",r.id,Ao)[0]??null;if(s!==null&&(s.status==="queued"||s.status==="running"))continue;let o=(s?.payload?JSON.parse(s.payload):null)?.max_run_id??null,{count:a,maxRunId:l}=mC(e,r,o);if(a<20)continue;let c=o??"initial",d=`${bs}:${r.id}:${c}`;e.enqueueJob({project_id:r.id,source:Ao,source_ref:bs,payload:JSON.stringify({kind:bs,project_id:r.id,completed_sessions:a,max_run_id:l,since_run_id:o}),dedupe_key:d})}}function mC(e,t,r){let n=e.query(`SELECT COUNT(*) AS cnt, MAX(r.id) AS max_id
|
|
1869
1869
|
FROM run r
|
|
1870
1870
|
JOIN job j ON j.id = r.job_id
|
|
1871
1871
|
WHERE j.project_id = ?
|
|
1872
1872
|
AND r.terminal_state IS NOT NULL
|
|
1873
|
-
${r!==null?"AND r.id > ?":""}`,...r!==null?[t.id,r]:[t.id]);return{count:n[0]?.cnt??0,maxRunId:n[0]?.max_id??0}}function by(e){for(let t of pC)try{t(e)}catch{}}var
|
|
1873
|
+
${r!==null?"AND r.id > ?":""}`,...r!==null?[t.id,r]:[t.id]);return{count:n[0]?.cnt??0,maxRunId:n[0]?.max_id??0}}function by(e){for(let t of pC)try{t(e)}catch{}}var Ao,bs,pC,Ed=T(()=>{"use strict";Ao="memory_policy",bs="memory_consolidation_request";pC=[fC]});var xy={};we(xy,{getOrInsertConsolidationWorkflow:()=>vy,runJobById:()=>wC,runOnce:()=>jr,startWorker:()=>EC});import{createHash as _C}from"node:crypto";import{readFileSync as hC}from"node:fs";import{pathToFileURL as gC}from"node:url";function vy(e,t="durable-memory-consolidation-v2"){let r=e.getWorkflowByName(t);if(r!==null)return r;try{Vh({swallow:!0});let n=yo(t);if(n===null)return null;let s=hC(n,"utf8"),i=ct(s);return e.insertWorkflow({name:t,version:i.version,definition_schema_version:i.definition_schema_version,definition:s,source_uri:gC(n).href,source_sha256:_C("sha256").update(s).digest("hex")})}catch{return null}}async function jr(e){let t=Date.now(),r=null;try{return r=e.dal.claimNextJobWithConcurrency({worker_id:e.worker_id,lease_ms:e.lease_ms??Sy,evaluator:n=>Iy(e.dal,n)}),r===null?null:await ky(e.dal,r,t)}catch(n){if(r!==null)return _r(e.dal,r,"worker_run_failed",Mr(n),t);try{e.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:Ro(Mr(n))})})}catch{}return null}finally{e.max_concurrent}}async function wC(e){let t=Date.now(),r=null;try{let n=e.dal.claimJobByIdWithConcurrency({job_id:e.job_id,worker_id:e.worker_id,lease_ms:e.lease_ms??Sy,evaluator:s=>Iy(e.dal,s)});return n.claimed?(r=n.job,{claimed:!0,...await ky(e.dal,r,t)}):n}catch(n){if(r!==null)return{claimed:!0,..._r(e.dal,r,"worker_run_failed",Mr(n),t)};try{e.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:Ro(Mr(n)),job_id:e.job_id})})}catch{}return{claimed:!1,reason:"not_claimable",job_id:e.job_id}}finally{e.max_concurrent}}async function ky(e,t,r){let n=e.getProjectByJob(t.id);if(n===null)return _r(e,t,"worker_project_missing","project_not_found",r);let s=t.source===Ao&&t.source_ref===bs,i=t.run_id===null?null:e.getRun(t.run_id),o;if(i!==null?o=e.getWorkflow(i.workflow_id):s?o=vy(e):o=Ny(e,t,n),o===null)return _r(e,t,"worker_workflow_missing","workflow_not_found",r,n);let a=e.getTeam(i?.team_id??n.team_id),l=a===null?[]:e.listTeamMembers(a.id);if(a===null||l.length===0)return _r(e,t,"worker_team_missing","team_not_found",r,n);let c;try{c=ct(o.definition)}catch(u){return _r(e,t,"worker_workflow_invalid",Mr(u),r,n)}let d=TC(c,l);if(d.length>0)return _r(e,t,"worker_team_missing_aliases",`missing_aliases:${d.join(",")}`,r,n,a);try{let u=await ay({dal:e,job:t,workflow:c,team:a,members:l,workflowRow:o});return e.setJobRun(t.id,u.run_id),u.paused===!0?{job_id:t.id,run_id:u.run_id,status:"paused",terminal_state:null,ms:Date.now()-r}:(e.releaseJob(t.id,"done",null),{job_id:t.id,run_id:u.run_id,status:"done",terminal_state:u.terminal_state,ms:Date.now()-r})}catch(u){return _r(e,t,"worker_run_failed",Mr(u),r,n,a)}}function Iy(e,t){let r=e.getProjectByJob(t.id);if(r===null)return{concurrency_key:t.concurrency_key_resolved,concurrent_limit:1};let n=Ny(e,t,r);if(n===null)return{concurrency_key:t.concurrency_key_resolved,concurrent_limit:1};let s=null;try{s=ct(n.definition)}catch{s=null}return io({workflow:s,job:t,project:r})}function Ny(e,t,r){return t.workflow_id_override!==null?e.getWorkflow(t.workflow_id_override):e.getWorkflowByName(r.workflow_name)}async function EC(e){let t=!1,r=null,n=Promise.resolve(),s=async()=>{if(!t){try{let i;do i=await jr(e);while(!t&&i!==null)}catch(i){try{e.dal.raiseAttention({kind:"worker_loop_error",severity:"error",payload:JSON.stringify({error:Ro(Mr(i))})})}catch{}}t||(r=setTimeout(()=>{n=s()},e.poll_interval_ms??yC))}};return n=s(),{stop:async()=>{t=!0,r!==null&&clearTimeout(r),await n.catch(()=>{})}}}function _r(e,t,r,n,s,i,o){let a=Ro(n);return e.releaseJob(t.id,"failed",a),e.raiseAttention({kind:r,severity:"error",project_id:i?.id??t.project_id,payload:JSON.stringify({job_id:t.id,team_id:o?.id??null,error:a})}),{job_id:t.id,run_id:null,status:"failed",terminal_state:null,ms:Date.now()-s}}function Mr(e){return e instanceof Error?e.message:String(e)}function Ro(e){return e.length>4096?e.slice(0,4096):e}function TC(e,t){let r=Ty(e);if(r.length===0)return[];let n=new Set(t.map(s=>s.alias));return r.filter(s=>!n.has(s))}var Sy,yC,Lo=T(()=>{"use strict";sd();my();cs();xo();Fc();Ed();Sy=6e5,yC=5e3});import{existsSync as bC,readFileSync as SC}from"node:fs";import{marked as vC}from"marked";function Oy(e,t){e.get("/layman",r=>r.html(Re("Layman Home",kC(t.dal)))),e.get("/api/layman",r=>r.json(jy(t.dal))),e.get("/layman/start/:workflow",r=>{let n=Ly(r);return n===null?r.notFound():r.html(Re(`Start ${hn(n)}`,xC(t.dal,n)))}),e.post("/layman/start/:workflow",async r=>{let n=Ly(r);return n===null?r.notFound():n==="newspaper"?Ay(r,t.dal):AC(r,t.dal,n)}),e.get("/layman/run/:id",r=>{let n=Rr(t.dal,Oo(r,"id"));return n===null?r.notFound():r.html(Re(`Run ${n.id}`,OC(t.dal,n)))}),e.get("/api/layman/run/:id",r=>{let n=Rr(t.dal,Oo(r,"id"));return n===null?r.notFound():r.json(qC(t.dal,n))}),e.post("/layman/run/:id/respond",async r=>CC(r,t.dal)),e.get("/layman/newspaper",r=>r.html(Re("Newspaper Subscriptions",WC(t.dal)))),e.post("/layman/newspaper",r=>Ay(r,t.dal)),e.delete("/layman/newspaper/:id",r=>Ry(r,t.dal)),e.post("/layman/newspaper/:id/delete",r=>Ry(r,t.dal))}function kC(e){let t=jy(e);return`<section class="layman-home">
|
|
1874
1874
|
<h1>Welcome</h1>
|
|
1875
1875
|
<p class="muted">Choose a workflow and answer a few plain-language prompts.</p>
|
|
1876
|
-
<div class="grid">${
|
|
1876
|
+
<div class="grid">${$o.map(IC).join("")}</div>
|
|
1877
1877
|
<h2>Recent Activity</h2>
|
|
1878
1878
|
${NC(t.recent_runs)}
|
|
1879
1879
|
<section class="metric">
|
|
@@ -1914,7 +1914,7 @@ ${p.text}`,["approve","request_changes"],!0,s,t.writes_to_project_path===!0)));i
|
|
|
1914
1914
|
<button type="submit" name="done" value="false">Send response</button>
|
|
1915
1915
|
<button type="submit" name="done" value="true">Done with this stage</button>
|
|
1916
1916
|
</form>
|
|
1917
|
-
</section>`}async function CC(e,t){let r=
|
|
1917
|
+
</section>`}async function CC(e,t){let r=Oo(e,"id"),n=await e.req.parseBody(),s=Number(Ye(n.step_id)),i=Ye(n.input),o=Ye(n.done)==="true";if(!Number.isInteger(s))return e.html(Re("Interactive response",'<p class="error">Missing interactive step.</p>'),400);let a=t.resumeInteractive(s,i,o);return a.resumed?(MC(t,a.run.id),await jr({dal:t,worker_id:`layman-respond-${Date.now()}`}),e.redirect(`/layman/run/${r}`,302)):e.html(Re("Interactive response",`<p class="error">Could not submit response: ${b(a.reason)}</p>`),400)}function MC(e,t){let r=e.getRun(t);if(r===null||r.current_state===null)return;let n=e.getWorkflow(r.workflow_id);if(n!==null)try{let s=JSON.parse(n.definition);if(!bd(s)||s.definition_schema_version!==3||!Array.isArray(s.steps))return;let i=s.steps.find(o=>bd(o)&&o.name===r.current_state&&typeof o.id=="string");bd(i)&&typeof i.id=="string"&&e.setRunCurrentState(r.id,i.id)}catch{return}}function jC(e,t,r){let n=GC(t.terminal_state);return`<section class="metric terminal-run">
|
|
1918
1918
|
<h2>${n?"Complete":"Stopped"}</h2>
|
|
1919
1919
|
<p>Status: <strong>${b(t.terminal_state)}</strong></p>
|
|
1920
1920
|
${n?DC(e,t,r):FC(t)}
|
|
@@ -1937,7 +1937,7 @@ ${p.text}`,["approve","request_changes"],!0,s,t.writes_to_project_path===!0)));i
|
|
|
1937
1937
|
<label>Custom cron<input name="cron" placeholder="0 6 * * *"></label>
|
|
1938
1938
|
<label>Output directory<input name="output_dir" value="digests"></label>
|
|
1939
1939
|
<button type="submit">Create subscription</button>
|
|
1940
|
-
</form>`}async function Ay(e,t){let r=await e.req.parseBody(),n=Fy(t,r);if(n===null)return e.html(Re("Newspaper",'<p class="error">Choose a valid project.</p>'),400);let s=t.getWorkflowByName("newspaper");if(s===null)return e.html(Re("Newspaper",'<p class="error">The newspaper workflow is not loaded.</p>'),400);let i=Ye(r.topics).split(/[\n,]/).map(a=>a.trim()).filter(a=>a.length>0);if(i.length===0)return e.html(Re("Newspaper",'<p class="error">Enter at least one topic.</p>'),400);let o={topics:i,output_dir:Ye(r.output_dir).trim()||"digests",schedule:JC(r)};return t.insertProjectWorkflow({project_id:n.id,workflow_id:s.id,condition:null,parameters_override:JSON.stringify(o),priority:100,enabled:!0}),e.redirect("/layman/newspaper?created=1",302)}function Ry(e,t){let r=
|
|
1940
|
+
</form>`}async function Ay(e,t){let r=await e.req.parseBody(),n=Fy(t,r);if(n===null)return e.html(Re("Newspaper",'<p class="error">Choose a valid project.</p>'),400);let s=t.getWorkflowByName("newspaper");if(s===null)return e.html(Re("Newspaper",'<p class="error">The newspaper workflow is not loaded.</p>'),400);let i=Ye(r.topics).split(/[\n,]/).map(a=>a.trim()).filter(a=>a.length>0);if(i.length===0)return e.html(Re("Newspaper",'<p class="error">Enter at least one topic.</p>'),400);let o={topics:i,output_dir:Ye(r.output_dir).trim()||"digests",schedule:JC(r)};return t.insertProjectWorkflow({project_id:n.id,workflow_id:s.id,condition:null,parameters_override:JSON.stringify(o),priority:100,enabled:!0}),e.redirect("/layman/newspaper?created=1",302)}function Ry(e,t){let r=Oo(e,"id");return t.removeProjectWorkflow(r)?e.redirect("/layman/newspaper?removed=1",302):e.notFound()}function BC(e){return me(["id","project","topics","status","action"],e.map(t=>{let r=zC(t.parameters_override),n=Array.isArray(r.topics)?r.topics.join(", "):"";return[b(t.id),b(t.project_name),b(n),t.enabled===1?"enabled":"disabled",`<form method="post" action="/layman/newspaper/${t.id}/delete"><button type="submit">Remove</button></form>`]}))}function jy(e){let t=Dy(e);return{workflows:$o,recent_runs:HC(e),newspaper_subscriptions:t.length}}function qC(e,t){let r=Py(e,t);return{id:t.id,workflow:t.workflow?.name??null,current_state:t.current_state,terminal_state:t.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:t.steps.map(n=>({id:n.id,state_name:n.state_name,outcome:n.outcome,status_detail:n.status_detail}))}}function HC(e){return e.query(`SELECT r.*, w.name AS workflow_name
|
|
1941
1941
|
FROM run r
|
|
1942
1942
|
JOIN workflow w ON w.id = r.workflow_id
|
|
1943
1943
|
WHERE w.name IN (${Sd.map(()=>"?").join(",")})
|
|
@@ -1947,21 +1947,21 @@ ${p.text}`,["approve","request_changes"],!0,s,t.writes_to_project_path===!0)));i
|
|
|
1947
1947
|
JOIN workflow w ON w.id = pw.workflow_id
|
|
1948
1948
|
JOIN project p ON p.id = pw.project_id
|
|
1949
1949
|
WHERE w.name = ?
|
|
1950
|
-
ORDER BY pw.id DESC`,"newspaper")}function Py(e,t){for(let r of[...t.steps].reverse()){let n=e.getInteractiveSessionByStepId(r.id);if(n!==null)return n}return null}function Fy(e,t){let r=Number(Ye(t.project_id));return Number.isInteger(r)?e.getProject(r):null}function JC(e){let t=Ye(e.schedule)||"daily";return t==="weekly"?{preset:t,cron:"0 6 * * 1"}:t==="custom"?{preset:t,cron:Ye(e.cron).trim()||"0 6 * * *"}:{preset:"daily",cron:"0 6 * * *"}}function Ly(e){let t=e.req.param("workflow");return Sd.includes(t)?t:null}function hn(e){return
|
|
1950
|
+
ORDER BY pw.id DESC`,"newspaper")}function Py(e,t){for(let r of[...t.steps].reverse()){let n=e.getInteractiveSessionByStepId(r.id);if(n!==null)return n}return null}function Fy(e,t){let r=Number(Ye(t.project_id));return Number.isInteger(r)?e.getProject(r):null}function JC(e){let t=Ye(e.schedule)||"daily";return t==="weekly"?{preset:t,cron:"0 6 * * 1"}:t==="custom"?{preset:t,cron:Ye(e.cron).trim()||"0 6 * * *"}:{preset:"daily",cron:"0 6 * * *"}}function Ly(e){let t=e.req.param("workflow");return Sd.includes(t)?t:null}function hn(e){return $o.find(t=>t.name===e)?.title??e}function XC(e){return e.split(/[_:-]/).filter(Boolean).map(t=>`${t[0]?.toUpperCase()??""}${t.slice(1)}`).join(" ")}function kd(e){return vC.parse(e,{async:!1})}function GC(e){return e==="done"||e==="pr_ready"||e==="merged"}function VC(e){return e.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}function KC(e,t){return e.split(`
|
|
1951
1951
|
`).slice(0,t).join(`
|
|
1952
|
-
`)}function YC(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function Ye(e){return typeof e=="string"?e:""}function zC(e){if(e===null)return{};try{let t=JSON.parse(e);if(t!==null&&typeof t=="object"&&!Array.isArray(t))return t}catch{return{}}return{}}function bd(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Lo(e,t){return Number(e.req.param(t))}var Oo,Sd,Uy=T(()=>{"use strict";Ro();Ht();Qc();Oo=[{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."}],Sd=Oo.map(e=>e.name)});function QC(e){return e.replace(/^\/+/,"")}function Wy(e){return typeof e=="string"&&e!==""&&!e.includes("/")&&!e.includes("\\")}function gn(e){if(e.mailboxKey!==void 0&&e.mailboxKey!==null&&e.mailboxKey!==""){let t=QC(e.mailboxKey),r=t.lastIndexOf("/");return(r>=0?t.slice(r+1):t).includes(".")&&(t=r>=0?t.slice(0,r+1):""),t!==""&&!t.endsWith("/")&&(t+="/"),t}return Wy(e.userId)&&Wy(e.deviceId)?`${e.userId}/${e.deviceId}/`:`${ZC}/${e.identityId}/`}function tM(e){return String(Math.max(0,Math.floor(e))).padStart(eM,"0")}function Id(e,t,r){return`${e}${t}${tM(r)}.json`}function $o(e,t){return`${e}${t}`}function Co(e,t,r){let n=`${t}${r}`;if(!e.startsWith(n))return;let s=e.slice(n.length).match(/^(\d+)\.json$/);if(s===null)return;let i=Number(s[1]);return Number.isSafeInteger(i)?i:void 0}var ZC,eM,Mo=T(()=>{"use strict";ZC="mailbox";eM=12});function Kt(e,t){let r=Math.floor(e),n="",s=r;for(let d=0;d<12;d++)n=jo[s&15]+n,s=Math.floor(s/16);let i=Math.floor(t()*4096)&4095,o="",a=i;for(let d=0;d<3;d++)o=jo[a&15]+o,a=a>>4;let l=jo[8|Math.floor(t()*4)&3],c="";for(let d=0;d<15;d++)c+=jo[Math.floor(t()*16)&15];return n.slice(0,8)+"-"+n.slice(8,12)+"-7"+o+"-"+l+c.slice(0,3)+"-"+c.slice(3,15)}var jo,Do=T(()=>{"use strict";jo="0123456789abcdef"});function xd(e,t){return!Number.isFinite(e)||e<=0?t:e}function Ad(e){if(e===null||typeof e!="object")return!1;let t=e;return t.name==="NoSuchKey"||t.name==="NotFound"||t.Code==="NoSuchKey"||t.code==="NoSuchKey"||t.$metadata!==void 0&&t.$metadata.httpStatusCode===404}function Xy(e){return e.conversation_id===Jy&&sM(e.payload)}function sM(e){return typeof e=="object"&&e!==null&&e.kind==="heartbeat"}function iM(e){let t=typeof e.hb=="string"&&e.hb!==""?e.hb:Xy(e)?e.timestamp:void 0;if(t===void 0)return;let r=Date.parse(t);return Number.isFinite(r)?r:void 0}var By,qy,Hy,rM,Jy,nM,Nd,Dr,Po=T(()=>{"use strict";Mo();Do();By=3e3,qy=1e4,Hy=12e3,rM=1e3,Jy="__lmctl_heartbeat__",nM={kind:"heartbeat"},Nd={setTimeout:(e,t)=>setTimeout(e,t),clearTimeout:e=>clearTimeout(e)},Dr=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(t){this.opts=t,this.basePrefix=gn({identityId:t.identityId,userId:t.userId,deviceId:t.deviceId,mailboxKey:t.mailboxKey}),this.ownStream=t.selfRole==="agent"?"local":"web",this.peerStream=t.selfRole==="agent"?"web":"local",this.cursor=t.cursor,this.readIntervalMs=xd(t.readIntervalMs??t.pollIntervalMs??By,By),this.heartbeatIdleMs=xd(t.heartbeatIdleMs??qy,qy),this.backoffReadIntervalMs=xd(t.backoffReadIntervalMs??t.pollIntervalMs??Hy,Hy)}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 t=this.opts.timers??Nd;if(this.timerHandle!==null&&(t.clearTimeout(this.timerHandle),this.timerHandle=null),this.heartbeatTimerHandle!==null&&(t.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(t){return this.putEnvelope(t.conversation_id,t.payload)}getCursor(){return this.cursor}getMailboxBasePrefix(){return this.basePrefix}setPollIntervalMs(t){if(!Number.isFinite(t)||t<=0)throw new Error(`SequentialMailboxClient.setPollIntervalMs: invalid ms=${t}`);this.readIntervalMs=t}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 t=await this.maxSeq(this.ownStream);this.ownSeq=t,this.cursor===void 0&&(this.cursor=await this.maxSeq(this.peerStream)),this.bootstrapped=!0}catch(t){throw this.bootstrapPromise=null,this.emitError(t,"list"),t}}async maxSeq(t){let r=$o(this.basePrefix,t),n=0,s;do{let i=await this.opts.s3.send(new this.opts.commands.ListObjectsV2Command({Bucket:this.opts.bucket,Prefix:r,MaxKeys:rM,...s!==void 0&&{ContinuationToken:s}}));this.opts.onS3Op?.("list");for(let o of i.Contents??[]){let a=Co(o.Key??"",this.basePrefix,t);a!==void 0&&a>n&&(n=a)}s=i.IsTruncated===!0?i.NextContinuationToken:void 0}while(s!==void 0);return n}async putEnvelope(t,r){let n=this.writeChain.then(()=>this.doPut(t,r));return this.writeChain=n.catch(()=>{}),n}async doPut(t,r){await this.ensureBootstrapped();let n=(this.opts.now??Date.now)(),s=new Date(n).toISOString(),i={message_id:Kt(n,this.opts.random??Math.random),from:this.opts.selfRole,timestamp:s,hb:s,conversation_id:t,payload:r},o=(this.ownSeq??0)+1,a=Id(this.basePrefix,this.ownStream,o);return await this.opts.s3.send(new this.opts.commands.PutObjectCommand({Bucket:this.opts.bucket,Key:a,Body:JSON.stringify(i),ContentType:"application/json"})),this.opts.onS3Op?.("put"),this.ownSeq=o,this.recordWrite(n),a}scheduleNextTick(t){if(this.stopRequested)return;let r=this.opts.timers??Nd;this.timerHandle=r.setTimeout(()=>{this.timerHandle=null,this.runTick()},t)}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 t=(this.cursor??0)+1,r=Id(this.basePrefix,this.peerStream,t),n;try{let i=await this.opts.s3.send(new this.opts.commands.GetObjectCommand({Bucket:this.opts.bucket,Key:r}));if(this.opts.onS3Op?.("get"),i.Body===void 0){this.emitError(new Error(`GetObject ${r}: empty body`),"get"),this.advanceCursor(t);continue}n=await i.Body.transformToString("utf-8")}catch(i){if(Ad(i)){this.opts.onS3Op?.("get");return}this.emitError(i,"get");return}let s;try{s=JSON.parse(n)}catch(i){this.emitError(i,"get"),this.advanceCursor(t);continue}if(this.recordPeerHeartbeat(s),Xy(s)){this.advanceCursor(t);continue}try{await this.opts.onMessage(s)}catch(i){this.emitError(i,"handle");return}this.advanceCursor(t)}}advanceCursor(t){this.cursor=t,this.notifyCursorAdvance(t)}nextReadDelayMs(){return this.peerIsOn((this.opts.now??Date.now)())?this.readIntervalMs:this.backoffReadIntervalMs}peerIsOn(t){return this.lastPeerHeartbeatMs!==void 0&&t-this.lastPeerHeartbeatMs<=this.heartbeatIdleMs}recordPeerHeartbeat(t){let r=iM(t);r!==void 0&&(this.lastPeerHeartbeatMs=r)}recordWrite(t){this.lastWriteMs=t,this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}scheduleHeartbeatCheck(t){if(this.stopRequested)return;let r=this.opts.timers??Nd;this.heartbeatTimerHandle!==null&&r.clearTimeout(this.heartbeatTimerHandle),this.heartbeatTimerHandle=r.setTimeout(()=>{this.heartbeatTimerHandle=null,this.maybeWriteHeartbeat()},t)}async maybeWriteHeartbeat(){if(this.stopRequested)return;let t=(this.opts.now??Date.now)();if(this.lastWriteMs!==void 0){let r=t-this.lastWriteMs;if(r<this.heartbeatIdleMs){this.scheduleHeartbeatCheck(this.heartbeatIdleMs-r);return}}await this.writeHeartbeat()}async writeHeartbeat(){try{await this.putEnvelope(Jy,nM)}catch(t){this.emitError(t,"put"),this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}}notifyCursorAdvance(t){if(this.opts.onCursorAdvance!==void 0)try{this.opts.onCursorAdvance(t)}catch(r){this.emitError(r,"handle")}}emitError(t,r){if(this.opts.onError!==void 0)try{this.opts.onError(t,r)}catch{}else console.error(`SequentialMailboxClient[${r}]`,t)}}});import{getConnInfo as oM}from"@hono/node-server/conninfo";function Gy(e,t){let r=t.bucket??aM,n=t.remoteAddressOf??(i=>cM(i)),s=i=>{let o=n(i);return dM(o)?null:i.json({error:"forbidden",message:"local-mailbox is loopback-only"},403)};e.get("/local-mailbox/object",async i=>{let o=s(i);if(o!==null)return o;let a=Rd(i.req.query("key"));if(typeof a!="string")return i.json({error:"bad_request",message:a.error},400);try{let l=await t.s3.send(new t.commands.GetObjectCommand({Bucket:r,Key:a}));if(l.Body===void 0)return i.json({error:"empty_body"},404);let c=await l.Body.transformToString("utf-8");return i.body(c,200,{"Content-Type":"application/octet-stream"})}catch(l){return Ad(l)?i.json({error:"not_found"},404):i.json({error:"internal",message:Ld(l)},500)}}),e.put("/local-mailbox/object",async i=>{let o=s(i);if(o!==null)return o;let a=Rd(i.req.query("key"));if(typeof a!="string")return i.json({error:"bad_request",message:a.error},400);let l=new Uint8Array(await i.req.arrayBuffer());try{return await t.s3.send(new t.commands.PutObjectCommand({Bucket:r,Key:a,Body:l})),i.json({ok:!0})}catch(c){return i.json({error:"internal",message:Ld(c)},500)}}),e.get("/local-mailbox/list",async i=>{let o=s(i);if(o!==null)return o;let a=i.req.query("prefix")??"",l=Rd(a,{allowEmpty:!0});if(typeof l!="string")return i.json({error:"bad_request",message:l.error},400);let c=lM(i.req.query("maxKeys")),d=i.req.query("token");try{let u=await t.s3.send(new t.commands.ListObjectsV2Command({Bucket:r,Prefix:l,...c!==void 0?{MaxKeys:c}:{},...d!==void 0&&d!==""?{ContinuationToken:d}:{}}));return i.json({Contents:(u.Contents??[]).map(f=>({Key:f.Key,LastModified:f.LastModified instanceof Date?f.LastModified.toISOString():f.LastModified})),IsTruncated:u.IsTruncated??!1,...u.NextContinuationToken!==void 0?{NextContinuationToken:u.NextContinuationToken}:{}})}catch(u){return i.json({error:"internal",message:Ld(u)},500)}})}function Rd(e,t={}){if(e===void 0||e==="")return t.allowEmpty===!0?"":{error:"key required"};let r=e.replace(/^\/+/,"");return r.split("/").includes("..")?{error:"key must not contain '..'"}:r}function lM(e){if(e===void 0||e==="")return;let t=Number(e);return Number.isInteger(t)&&t>0?t:void 0}function cM(e){try{return oM(e).remote.address}catch{return}}function dM(e){return e===void 0||e===""?!1:!!(e==="127.0.0.1"||e==="::1"||e.startsWith("::ffff:127.")||e.startsWith("127."))}function Ld(e){return e instanceof Error?e.message:String(e)}var aM,Vy=T(()=>{"use strict";Po();aM="local"});function Ky(e,t){e.get("/mailbox/workspace",r=>mM(r,t)),e.get("/mailbox/projects",r=>pM(r,t)),e.get("/mailbox/projects/:id",r=>_M(r,t)),e.post("/mailbox/projects",r=>hM(r,t)),e.patch("/mailbox/projects/:id",r=>gM(r,t)),e.delete("/mailbox/projects/:id",r=>yM(r,t)),e.post("/mailbox/projects/:project_id/prompts",r=>wM(r,t)),e.get("/mailbox/prompts/:id",r=>EM(r,t))}function mM(e,t){t.dal.ensureWorkspace({id:wn,name:Od});let r=Yy(t.dal),n={id:wn,name:Od,created_at:fM,projects:r};return e.json({workspace:n})}function pM(e,t){return e.json({projects:Yy(t.dal)})}function _M(e,t){let r=e.req.param("id");if(r===void 0||r==="")return e.json({error:"bad_request",message:"project id required"},400);if(r.startsWith(yn)){let s=$d(t.dal,r);return s===null||s.deleted_at!==null?e.json({project:null},404):e.json({project:Wo(s)})}let n=Zy(t.dal,r);return n===null?e.json({project:null},404):e.json({project:zy(n)})}async function hM(e,t){let r;try{r=await e.req.json()}catch{return e.json({error:"bad_request",message:"invalid JSON body"},400)}let n=r.input;if(n===void 0||typeof n!="object")return e.json({error:"bad_request",message:"input is required"},400);if(typeof n.name!="string"||n.name==="")return e.json({error:"bad_request",message:"input.name is required"},400);if(typeof n.repo_path!="string"||n.repo_path==="")return e.json({error:"bad_request",message:"input.repo_path is required"},400);t.dal.ensureWorkspace({id:wn,name:Od});let s=t.dal.insertWebProject({workspace_id:wn,name:n.name,repo_path:n.repo_path,config_json:n.config_json===void 0?null:JSON.stringify(n.config_json)});return e.json({project:Wo(s)},201)}async function gM(e,t){let r=e.req.param("id");if(r===void 0||r==="")return e.json({error:"bad_request",message:"project id required"},400);let n;try{n=await e.req.json()}catch{return e.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.input??{};if(r.startsWith(yn)){let i=$d(t.dal,r);if(i===null||i.deleted_at!==null)return e.json({error:"project_not_found",message:`project not found: ${r}`},404);let o=t.dal.updateWebProject({id:i.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 o===null?e.json({error:"project_not_found",message:`project not found: ${r}`},404):e.json({project:Wo(o)})}return e.json({error:"project_not_found",message:`project not found: ${r}`},404)}function yM(e,t){let r=e.req.param("id");if(r===void 0||r==="")return e.json({error:"bad_request",message:"project id required"},400);if(r.startsWith(yn)){let n=$d(t.dal,r);if(n===null)return e.json({deleted:!1});let s=t.dal.softDeleteWebProject(n.id);return e.json({deleted:s})}return e.json({deleted:!1})}async function wM(e,t){let r=e.req.param("project_id");if(r===void 0||r==="")return e.json({error:"bad_request",message:"project_id required in path"},400);let n;try{n=await e.req.json()}catch{return e.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.input;if(s===void 0||typeof s!="object")return e.json({error:"bad_request",message:"input is required"},400);let i=s.project_id??r;if(typeof s.text!="string"||s.text==="")return e.json({error:"bad_request",message:"input.text is required"},400);let o=Zy(t.dal,i);if(o===null)return e.json({error:"project_not_found",message:`project not found: ${i}`},404);if(t.dal.getWorkflowByName(o.workflow_name)===null)return e.json({error:"workflow_not_registered",message:`project ${o.name} has no registered workflow "${o.workflow_name}"`},400);let l=`${uM}${crypto.randomUUID()}`,c={text:s.text,context_json:s.context_json??null},d;t.enqueueProjectJob!==void 0?d=t.enqueueProjectJob({dal:t.dal,project_id:o.id,source_ref:l,payload:c}):d=await TM({dal:t.dal,project_id:o.id,source_ref:l,payload:c}),t.dal.insertPromptDispatch({prompt_id:l,project_id:o.id,job_id:d.id,text:s.text,context_json:s.context_json===void 0?null:JSON.stringify(s.context_json)});let u={id:l,project_id:`${Uo}${o.id}`,text:s.text,status:"pending",created_at:new Date().toISOString(),completed_at:null};return e.json({prompt:u},201)}function EM(e,t){let r=e.req.param("id");if(r===void 0||r==="")return e.json({error:"bad_request",message:"prompt id required"},400);let n=bM(t.dal,r);return e.json({result:n})}function Yy(e){let t=e.listProjects().map(zy),r=e.listWebProjectsActive(wn).map(Wo);return[...t,...r].sort(OM)}function zy(e){return{id:`${Uo}${e.id}`,workspace_id:wn,name:e.name,repo_path:e.local_path,config_json:{workflow_name:e.workflow_name,team_id:e.team_id,durable_memory_mode:e.durable_memory_mode},last_active_at:null,created_at:e.created_at}}function Wo(e){let t={};if(e.config_json!==null)try{let r=JSON.parse(e.config_json);r!==null&&typeof r=="object"&&(t=r)}catch{}return e.linked_v4_project_id!==null&&(t={...t,linked_v4_project_id:e.linked_v4_project_id}),{id:`${yn}${e.id}`,workspace_id:e.workspace_id,name:e.name,repo_path:e.repo_path,config_json:t,last_active_at:e.last_active_at,created_at:e.created_at}}function $d(e,t){if(!t.startsWith(yn))return null;let r=t.slice(yn.length),n=Number.parseInt(r,10);return!Number.isFinite(n)||String(n)!==r?null:e.getWebProject(n)}function Zy(e,t){if(t.startsWith(Uo)){let n=t.slice(Uo.length),s=Number.parseInt(n,10);if(Number.isFinite(s)&&String(s)===n)return e.getProject(s)}let r=Number.parseInt(t,10);return Number.isFinite(r)&&String(r)===t?e.getProject(r):null}async function TM(e){let{enqueueManual:t}=await Promise.resolve().then(()=>(Wc(),hh));return{id:t(e.dal,{project_id:e.project_id,source_ref:e.source_ref,payload:e.payload}).id}}function bM(e,t){let r=e.getPromptDispatch(t);if(r===null)return{prompt_id:t,data:{status:"unknown"},errors_json:{error:"prompt_not_found"},duration_ms:null};let n=e.getJob(r.job_id);if(n===null)return{prompt_id:t,data:null,errors_json:{error:"job_missing",job_id:r.job_id},duration_ms:null};let s=n.run_id===null?null:e.getRun(n.run_id),i=e.getProject(r.project_id),o=AM(e,i?.team_id??null),a=xM(s),l=RM(n,a,o.length>0),c=LM(r.created_at,s),d=i===null?{totalEstimatedMs:void 0,perStep:new Map}:SM(e,i.workflow_name),u=d.totalEstimatedMs,f=Qy(r.created_at),m=i?.workflow_name,p=d.perStep.size>0?d.perStep.size:void 0,_=s===null?[]:vM(e,s.id),g=kM(s,a,_,d.perStep,o),h=IM(_,d.perStep),S=NM(g,h,u,f,m,p);return l==="error"?{prompt_id:t,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,...Fo(u,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&&e.setPromptDispatchCompleted(t),{prompt_id:t,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,...Fo(u,f),...S},errors_json:null,duration_ms:c}):l==="paused"?{prompt_id:t,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:o,...Fo(u,f),...S},errors_json:null,duration_ms:c}:{prompt_id:t,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,attempt_count:n.attempt_count,...Fo(u,f),...S},errors_json:null,duration_ms:c}}function SM(e,t){let r={totalEstimatedMs:void 0,perStep:new Map},n=e.getWorkflowByName(t);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 i=s,o=typeof i.estimated_duration_ms=="number"&&Number.isFinite(i.estimated_duration_ms)&&i.estimated_duration_ms>=0?i.estimated_duration_ms:void 0,a=new Map;if(Array.isArray(i.steps))for(let l of i.steps){if(l===null||typeof l!="object")continue;let c=l;if(typeof c.id!="string"||c.id.length===0)continue;let d=typeof c.name=="string"&&c.name.length>0?c.name:c.id,u=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,u===void 0?{name:d}:{name:d,estimated_duration_ms:u})}if(i.steps===void 0&&i.states!==null&&typeof i.states=="object")for(let[l,c]of Object.entries(i.states)){if(c===null||typeof c!="object")continue;let d=c,u=typeof d.estimated_duration_ms=="number"&&Number.isFinite(d.estimated_duration_ms)&&d.estimated_duration_ms>=0?d.estimated_duration_ms:void 0;a.set(l,u===void 0?{name:l}:{name:l,estimated_duration_ms:u})}return{totalEstimatedMs:o,perStep:a}}function vM(e,t){try{return e.listStepsForRun(t)}catch{return[]}}function kM(e,t,r,n,s){if(e===null||e.terminal_state!==null)return;let i=t!==null?t:e.current_state;if(i===null||i.length===0)return;let a=[...r].reverse().find(f=>f.state_name===i&&f.ended_at===null)?.started_at??e.paused_at??e.started_at,l=n.get(i),c=l?.name??i,d=Qy(a),u={id:i,name:c,started_at:a,elapsed_ms:d};return l?.estimated_duration_ms!==void 0&&(u.estimated_duration_ms=l.estimated_duration_ms),s.length>0&&(u.attention_needed=s),u}function IM(e,t){let r=[];for(let n of e){if(n.ended_at===null)continue;let s=Date.parse(n.started_at),i=Date.parse(n.ended_at),o=Number.isFinite(s)&&Number.isFinite(i)?Math.max(0,i-s):0,a=t.get(n.state_name)?.name??n.state_name,l=n.outcome==="failed"?"failed":"done";r.push({id:n.state_name,name:a,duration_ms:o,status:l})}return r}function NM(e,t,r,n,s,i){let o={completed_steps:t,total_elapsed_ms:n};return e!==void 0&&(o.current_step=e),r!==void 0&&(o.total_estimated_ms=r),s!==void 0&&s.length>0&&(o.workflow_name=s),i!==void 0&&(o.total_steps=i),o}function Qy(e){let t=Date.parse(e);return Number.isNaN(t)?0:Math.max(0,Date.now()-t)}function Fo(e,t){return e===void 0?{elapsed_ms:t}:{elapsed_ms:t,estimated_duration_ms:e}}function xM(e){if(e===null)return null;let t=e.current_state;if(t===null)return null;let r="__paused__:";return t.startsWith(r)?t.slice(r.length):null}function AM(e,t){if(t===null)return[];let r;try{r=e.listTeamMembers(t)}catch{return[]}return r.filter(n=>n.state==="attention_needed").map(n=>({alias:n.alias,reason:n.state_reason}))}function RM(e,t,r){return e.status==="queued"?"pending":e.status==="done"?"done":e.status==="failed"?"error":t!==null||r||e.status==="paused"?"paused":e.status==="running"?"running":"error"}function LM(e,t){let r=Date.parse(e);if(Number.isNaN(r))return null;let n=t?.ended_at??null,s=n===null?Date.now():Date.parse(n);return Number.isNaN(s)?null:Math.max(0,s-r)}function OM(e,t){let r=Date.parse(e.last_active_at??""),n=Date.parse(t.last_active_at??""),s=(Number.isNaN(n)?0:n)-(Number.isNaN(r)?0:r);return s===0?e.name.localeCompare(t.name):s}var Uo,yn,uM,wn,Od,fM,ew=T(()=>{"use strict";Uo="project:",yn="web_project:",uM="prompt:",wn="default",Od="Default workspace",fM=new Date(0).toISOString()});import{Buffer as tw}from"node:buffer";function rw(e,t,r){if(typeof e=="number"&&Number.isFinite(e)&&e>0)return e;if(t!==void 0&&t!==""){let n=Number(t);if(Number.isFinite(n)&&n>0)return n}return r}function nw(e){return MM[e]}function sw(e){let t=e.trim();if(t==="")return;let r=t.split(/\s+/),n=r.shift();if(!(n===void 0||n===""))return{cmd:n,args:r}}var $M,CM,Bo,MM,Cd=T(()=>{"use strict";$M=1e4,CM=256*1024,Bo=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(t){this.opts=t,this.pushWindowMs=rw(t.pushWindowMs,process.env.LMCTL_TERMINAL_PUSH_WINDOW_MS,$M),this.pushByteCap=rw(t.pushByteCap,process.env.LMCTL_TERMINAL_PUSH_BYTE_CAP,CM),this.timers=t.timers??{setTimeout:(r,n)=>globalThis.setTimeout(r,n),clearTimeout:r=>globalThis.clearTimeout(r)}}startSession(t){if(this.sessions.has(t.session_id))throw new Error(`terminal_session_already_exists: ${t.session_id}`);let r=this.opts.pty.spawn(t.command,t.args,{name:"xterm-256color",cols:t.cols??120,rows:t.rows??30,cwd:t.cwd??process.cwd(),env:t.env??process.env}),n={session_id:t.session_id,pty:r,pendingOutput:[],pendingBytes:0,pushTimer:void 0,closed:!1};return this.sessions.set(t.session_id,n),r.onData(s=>{this.onPtyData(n,s)}),r.onExit(s=>{this.onPtyExit(n,s)}),this.opts.log?.(`[dt-2] terminal session ${t.session_id} started pid=${r.pid} cmd=${t.command}`),{pid:r.pid}}endSession(t){let r=this.sessions.get(t);if(r!==void 0)try{r.pty.kill()}catch{}}onInbound(t){if(t.direction!=="user_to_agent")return;let r=this.sessions.get(t.session_id);if(r===void 0){this.opts.log?.(`[dt-2] inbound terminal data for unknown session ${t.session_id}; dropping`);return}if(r.closed){this.opts.log?.(`[dt-2] inbound terminal data for closed session ${t.session_id}; dropping`);return}try{r.pty.write(t.data)}catch(n){this.opts.log?.(`[dt-2] pty.write failed for session ${t.session_id}: ${n instanceof Error?n.message:String(n)}`)}}setPublish(t){this.opts={...this.opts,publish:t}}listSessions(){return Array.from(this.sessions.values()).map(t=>({session_id:t.session_id,pid:t.pty.pid}))}pendingBytesFor(t){return this.sessions.get(t)?.pendingBytes}async stop(){for(let t of Array.from(this.sessions.values()))try{t.pty.kill()}catch{}for(let t of Array.from(this.sessions.values()))t.pushTimer!==void 0&&(this.timers.clearTimeout(t.pushTimer),t.pushTimer=void 0)}onPtyData(t,r){if(!t.closed){if(t.pendingOutput.push(r),t.pendingBytes+=tw.byteLength(r,"utf8"),t.pendingBytes>=this.pushByteCap){this.flush(t,"byte_cap");return}t.pushTimer===void 0&&(t.pushTimer=this.timers.setTimeout(()=>{this.flush(t,"window_idle")},this.pushWindowMs))}}async flush(t,r){if(t.pushTimer!==void 0&&(this.timers.clearTimeout(t.pushTimer),t.pushTimer=void 0),t.pendingOutput.length===0)return;let n=t.pendingOutput.join("");t.pendingOutput=[],t.pendingBytes=0;let s={kind:"terminal",session_id:t.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=${t.session_id} reason=${r} bytes=${tw.byteLength(n,"utf8")}`)}catch(i){this.opts.log?.(`[dt-2] publish failed session=${t.session_id} reason=${r}: ${i instanceof Error?i.message:String(i)}`)}}async onPtyExit(t,r){if(t.closed)return;await this.flush(t,"pty_exit");let n=`\r
|
|
1952
|
+
`)}function YC(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function Ye(e){return typeof e=="string"?e:""}function zC(e){if(e===null)return{};try{let t=JSON.parse(e);if(t!==null&&typeof t=="object"&&!Array.isArray(t))return t}catch{return{}}return{}}function bd(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Oo(e,t){return Number(e.req.param(t))}var $o,Sd,Uy=T(()=>{"use strict";Lo();Ht();Qc();$o=[{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."}],Sd=$o.map(e=>e.name)});function QC(e){return e.replace(/^\/+/,"")}function Wy(e){return typeof e=="string"&&e!==""&&!e.includes("/")&&!e.includes("\\")}function gn(e){if(e.mailboxKey!==void 0&&e.mailboxKey!==null&&e.mailboxKey!==""){let t=QC(e.mailboxKey),r=t.lastIndexOf("/");return(r>=0?t.slice(r+1):t).includes(".")&&(t=r>=0?t.slice(0,r+1):""),t!==""&&!t.endsWith("/")&&(t+="/"),t}return Wy(e.userId)&&Wy(e.deviceId)?`${e.userId}/${e.deviceId}/`:`${ZC}/${e.identityId}/`}function tM(e){return String(Math.max(0,Math.floor(e))).padStart(eM,"0")}function Id(e,t,r){return`${e}${t}${tM(r)}.json`}function Co(e,t){return`${e}${t}`}function Mo(e,t,r){let n=`${t}${r}`;if(!e.startsWith(n))return;let s=e.slice(n.length).match(/^(\d+)\.json$/);if(s===null)return;let i=Number(s[1]);return Number.isSafeInteger(i)?i:void 0}var ZC,eM,jo=T(()=>{"use strict";ZC="mailbox";eM=12});function Kt(e,t){let r=Math.floor(e),n="",s=r;for(let d=0;d<12;d++)n=Do[s&15]+n,s=Math.floor(s/16);let i=Math.floor(t()*4096)&4095,o="",a=i;for(let d=0;d<3;d++)o=Do[a&15]+o,a=a>>4;let l=Do[8|Math.floor(t()*4)&3],c="";for(let d=0;d<15;d++)c+=Do[Math.floor(t()*16)&15];return n.slice(0,8)+"-"+n.slice(8,12)+"-7"+o+"-"+l+c.slice(0,3)+"-"+c.slice(3,15)}var Do,Po=T(()=>{"use strict";Do="0123456789abcdef"});function xd(e,t){return!Number.isFinite(e)||e<=0?t:e}function Ad(e){if(e===null||typeof e!="object")return!1;let t=e;return t.name==="NoSuchKey"||t.name==="NotFound"||t.Code==="NoSuchKey"||t.code==="NoSuchKey"||t.$metadata!==void 0&&t.$metadata.httpStatusCode===404}function Xy(e){return e.conversation_id===Jy&&sM(e.payload)}function sM(e){return typeof e=="object"&&e!==null&&e.kind==="heartbeat"}function iM(e){let t=typeof e.hb=="string"&&e.hb!==""?e.hb:Xy(e)?e.timestamp:void 0;if(t===void 0)return;let r=Date.parse(t);return Number.isFinite(r)?r:void 0}var By,qy,Hy,rM,Jy,nM,Nd,Dr,Fo=T(()=>{"use strict";jo();Po();By=3e3,qy=1e4,Hy=12e3,rM=1e3,Jy="__lmctl_heartbeat__",nM={kind:"heartbeat"},Nd={setTimeout:(e,t)=>setTimeout(e,t),clearTimeout:e=>clearTimeout(e)},Dr=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(t){this.opts=t,this.basePrefix=gn({identityId:t.identityId,userId:t.userId,deviceId:t.deviceId,mailboxKey:t.mailboxKey}),this.ownStream=t.selfRole==="agent"?"local":"web",this.peerStream=t.selfRole==="agent"?"web":"local",this.cursor=t.cursor,this.readIntervalMs=xd(t.readIntervalMs??t.pollIntervalMs??By,By),this.heartbeatIdleMs=xd(t.heartbeatIdleMs??qy,qy),this.backoffReadIntervalMs=xd(t.backoffReadIntervalMs??t.pollIntervalMs??Hy,Hy)}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 t=this.opts.timers??Nd;if(this.timerHandle!==null&&(t.clearTimeout(this.timerHandle),this.timerHandle=null),this.heartbeatTimerHandle!==null&&(t.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(t){return this.putEnvelope(t.conversation_id,t.payload)}getCursor(){return this.cursor}getMailboxBasePrefix(){return this.basePrefix}setPollIntervalMs(t){if(!Number.isFinite(t)||t<=0)throw new Error(`SequentialMailboxClient.setPollIntervalMs: invalid ms=${t}`);this.readIntervalMs=t}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 t=await this.maxSeq(this.ownStream);this.ownSeq=t,this.cursor===void 0&&(this.cursor=await this.maxSeq(this.peerStream)),this.bootstrapped=!0}catch(t){throw this.bootstrapPromise=null,this.emitError(t,"list"),t}}async maxSeq(t){let r=Co(this.basePrefix,t),n=0,s;do{let i=await this.opts.s3.send(new this.opts.commands.ListObjectsV2Command({Bucket:this.opts.bucket,Prefix:r,MaxKeys:rM,...s!==void 0&&{ContinuationToken:s}}));this.opts.onS3Op?.("list");for(let o of i.Contents??[]){let a=Mo(o.Key??"",this.basePrefix,t);a!==void 0&&a>n&&(n=a)}s=i.IsTruncated===!0?i.NextContinuationToken:void 0}while(s!==void 0);return n}async putEnvelope(t,r){let n=this.writeChain.then(()=>this.doPut(t,r));return this.writeChain=n.catch(()=>{}),n}async doPut(t,r){await this.ensureBootstrapped();let n=(this.opts.now??Date.now)(),s=new Date(n).toISOString(),i={message_id:Kt(n,this.opts.random??Math.random),from:this.opts.selfRole,timestamp:s,hb:s,conversation_id:t,payload:r},o=(this.ownSeq??0)+1,a=Id(this.basePrefix,this.ownStream,o);return await this.opts.s3.send(new this.opts.commands.PutObjectCommand({Bucket:this.opts.bucket,Key:a,Body:JSON.stringify(i),ContentType:"application/json"})),this.opts.onS3Op?.("put"),this.ownSeq=o,this.recordWrite(n),a}scheduleNextTick(t){if(this.stopRequested)return;let r=this.opts.timers??Nd;this.timerHandle=r.setTimeout(()=>{this.timerHandle=null,this.runTick()},t)}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 t=(this.cursor??0)+1,r=Id(this.basePrefix,this.peerStream,t),n;try{let i=await this.opts.s3.send(new this.opts.commands.GetObjectCommand({Bucket:this.opts.bucket,Key:r}));if(this.opts.onS3Op?.("get"),i.Body===void 0){this.emitError(new Error(`GetObject ${r}: empty body`),"get"),this.advanceCursor(t);continue}n=await i.Body.transformToString("utf-8")}catch(i){if(Ad(i)){this.opts.onS3Op?.("get");return}this.emitError(i,"get");return}let s;try{s=JSON.parse(n)}catch(i){this.emitError(i,"get"),this.advanceCursor(t);continue}if(this.recordPeerHeartbeat(s),Xy(s)){this.advanceCursor(t);continue}try{await this.opts.onMessage(s)}catch(i){this.emitError(i,"handle");return}this.advanceCursor(t)}}advanceCursor(t){this.cursor=t,this.notifyCursorAdvance(t)}nextReadDelayMs(){return this.peerIsOn((this.opts.now??Date.now)())?this.readIntervalMs:this.backoffReadIntervalMs}peerIsOn(t){return this.lastPeerHeartbeatMs!==void 0&&t-this.lastPeerHeartbeatMs<=this.heartbeatIdleMs}recordPeerHeartbeat(t){let r=iM(t);r!==void 0&&(this.lastPeerHeartbeatMs=r)}recordWrite(t){this.lastWriteMs=t,this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}scheduleHeartbeatCheck(t){if(this.stopRequested)return;let r=this.opts.timers??Nd;this.heartbeatTimerHandle!==null&&r.clearTimeout(this.heartbeatTimerHandle),this.heartbeatTimerHandle=r.setTimeout(()=>{this.heartbeatTimerHandle=null,this.maybeWriteHeartbeat()},t)}async maybeWriteHeartbeat(){if(this.stopRequested)return;let t=(this.opts.now??Date.now)();if(this.lastWriteMs!==void 0){let r=t-this.lastWriteMs;if(r<this.heartbeatIdleMs){this.scheduleHeartbeatCheck(this.heartbeatIdleMs-r);return}}await this.writeHeartbeat()}async writeHeartbeat(){try{await this.putEnvelope(Jy,nM)}catch(t){this.emitError(t,"put"),this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}}notifyCursorAdvance(t){if(this.opts.onCursorAdvance!==void 0)try{this.opts.onCursorAdvance(t)}catch(r){this.emitError(r,"handle")}}emitError(t,r){if(this.opts.onError!==void 0)try{this.opts.onError(t,r)}catch{}else console.error(`SequentialMailboxClient[${r}]`,t)}}});import{getConnInfo as oM}from"@hono/node-server/conninfo";function Gy(e,t){let r=t.bucket??aM,n=t.remoteAddressOf??(i=>cM(i)),s=i=>{let o=n(i);return dM(o)?null:i.json({error:"forbidden",message:"local-mailbox is loopback-only"},403)};e.get("/local-mailbox/object",async i=>{let o=s(i);if(o!==null)return o;let a=Rd(i.req.query("key"));if(typeof a!="string")return i.json({error:"bad_request",message:a.error},400);try{let l=await t.s3.send(new t.commands.GetObjectCommand({Bucket:r,Key:a}));if(l.Body===void 0)return i.json({error:"empty_body"},404);let c=await l.Body.transformToString("utf-8");return i.body(c,200,{"Content-Type":"application/octet-stream"})}catch(l){return Ad(l)?i.json({error:"not_found"},404):i.json({error:"internal",message:Ld(l)},500)}}),e.put("/local-mailbox/object",async i=>{let o=s(i);if(o!==null)return o;let a=Rd(i.req.query("key"));if(typeof a!="string")return i.json({error:"bad_request",message:a.error},400);let l=new Uint8Array(await i.req.arrayBuffer());try{return await t.s3.send(new t.commands.PutObjectCommand({Bucket:r,Key:a,Body:l})),i.json({ok:!0})}catch(c){return i.json({error:"internal",message:Ld(c)},500)}}),e.get("/local-mailbox/list",async i=>{let o=s(i);if(o!==null)return o;let a=i.req.query("prefix")??"",l=Rd(a,{allowEmpty:!0});if(typeof l!="string")return i.json({error:"bad_request",message:l.error},400);let c=lM(i.req.query("maxKeys")),d=i.req.query("token");try{let u=await t.s3.send(new t.commands.ListObjectsV2Command({Bucket:r,Prefix:l,...c!==void 0?{MaxKeys:c}:{},...d!==void 0&&d!==""?{ContinuationToken:d}:{}}));return i.json({Contents:(u.Contents??[]).map(f=>({Key:f.Key,LastModified:f.LastModified instanceof Date?f.LastModified.toISOString():f.LastModified})),IsTruncated:u.IsTruncated??!1,...u.NextContinuationToken!==void 0?{NextContinuationToken:u.NextContinuationToken}:{}})}catch(u){return i.json({error:"internal",message:Ld(u)},500)}})}function Rd(e,t={}){if(e===void 0||e==="")return t.allowEmpty===!0?"":{error:"key required"};let r=e.replace(/^\/+/,"");return r.split("/").includes("..")?{error:"key must not contain '..'"}:r}function lM(e){if(e===void 0||e==="")return;let t=Number(e);return Number.isInteger(t)&&t>0?t:void 0}function cM(e){try{return oM(e).remote.address}catch{return}}function dM(e){return e===void 0||e===""?!1:!!(e==="127.0.0.1"||e==="::1"||e.startsWith("::ffff:127.")||e.startsWith("127."))}function Ld(e){return e instanceof Error?e.message:String(e)}var aM,Vy=T(()=>{"use strict";Fo();aM="local"});function Ky(e,t){e.get("/mailbox/workspace",r=>mM(r,t)),e.get("/mailbox/projects",r=>pM(r,t)),e.get("/mailbox/projects/:id",r=>_M(r,t)),e.post("/mailbox/projects",r=>hM(r,t)),e.patch("/mailbox/projects/:id",r=>gM(r,t)),e.delete("/mailbox/projects/:id",r=>yM(r,t)),e.post("/mailbox/projects/:project_id/prompts",r=>wM(r,t)),e.get("/mailbox/prompts/:id",r=>EM(r,t))}function mM(e,t){t.dal.ensureWorkspace({id:wn,name:Od});let r=Yy(t.dal),n={id:wn,name:Od,created_at:fM,projects:r};return e.json({workspace:n})}function pM(e,t){return e.json({projects:Yy(t.dal)})}function _M(e,t){let r=e.req.param("id");if(r===void 0||r==="")return e.json({error:"bad_request",message:"project id required"},400);if(r.startsWith(yn)){let s=$d(t.dal,r);return s===null||s.deleted_at!==null?e.json({project:null},404):e.json({project:Bo(s)})}let n=Zy(t.dal,r);return n===null?e.json({project:null},404):e.json({project:zy(n)})}async function hM(e,t){let r;try{r=await e.req.json()}catch{return e.json({error:"bad_request",message:"invalid JSON body"},400)}let n=r.input;if(n===void 0||typeof n!="object")return e.json({error:"bad_request",message:"input is required"},400);if(typeof n.name!="string"||n.name==="")return e.json({error:"bad_request",message:"input.name is required"},400);if(typeof n.repo_path!="string"||n.repo_path==="")return e.json({error:"bad_request",message:"input.repo_path is required"},400);t.dal.ensureWorkspace({id:wn,name:Od});let s=t.dal.insertWebProject({workspace_id:wn,name:n.name,repo_path:n.repo_path,config_json:n.config_json===void 0?null:JSON.stringify(n.config_json)});return e.json({project:Bo(s)},201)}async function gM(e,t){let r=e.req.param("id");if(r===void 0||r==="")return e.json({error:"bad_request",message:"project id required"},400);let n;try{n=await e.req.json()}catch{return e.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.input??{};if(r.startsWith(yn)){let i=$d(t.dal,r);if(i===null||i.deleted_at!==null)return e.json({error:"project_not_found",message:`project not found: ${r}`},404);let o=t.dal.updateWebProject({id:i.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 o===null?e.json({error:"project_not_found",message:`project not found: ${r}`},404):e.json({project:Bo(o)})}return e.json({error:"project_not_found",message:`project not found: ${r}`},404)}function yM(e,t){let r=e.req.param("id");if(r===void 0||r==="")return e.json({error:"bad_request",message:"project id required"},400);if(r.startsWith(yn)){let n=$d(t.dal,r);if(n===null)return e.json({deleted:!1});let s=t.dal.softDeleteWebProject(n.id);return e.json({deleted:s})}return e.json({deleted:!1})}async function wM(e,t){let r=e.req.param("project_id");if(r===void 0||r==="")return e.json({error:"bad_request",message:"project_id required in path"},400);let n;try{n=await e.req.json()}catch{return e.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.input;if(s===void 0||typeof s!="object")return e.json({error:"bad_request",message:"input is required"},400);let i=s.project_id??r;if(typeof s.text!="string"||s.text==="")return e.json({error:"bad_request",message:"input.text is required"},400);let o=Zy(t.dal,i);if(o===null)return e.json({error:"project_not_found",message:`project not found: ${i}`},404);if(t.dal.getWorkflowByName(o.workflow_name)===null)return e.json({error:"workflow_not_registered",message:`project ${o.name} has no registered workflow "${o.workflow_name}"`},400);let l=`${uM}${crypto.randomUUID()}`,c={text:s.text,context_json:s.context_json??null},d;t.enqueueProjectJob!==void 0?d=t.enqueueProjectJob({dal:t.dal,project_id:o.id,source_ref:l,payload:c}):d=await TM({dal:t.dal,project_id:o.id,source_ref:l,payload:c}),t.dal.insertPromptDispatch({prompt_id:l,project_id:o.id,job_id:d.id,text:s.text,context_json:s.context_json===void 0?null:JSON.stringify(s.context_json)});let u={id:l,project_id:`${Wo}${o.id}`,text:s.text,status:"pending",created_at:new Date().toISOString(),completed_at:null};return e.json({prompt:u},201)}function EM(e,t){let r=e.req.param("id");if(r===void 0||r==="")return e.json({error:"bad_request",message:"prompt id required"},400);let n=bM(t.dal,r);return e.json({result:n})}function Yy(e){let t=e.listProjects().map(zy),r=e.listWebProjectsActive(wn).map(Bo);return[...t,...r].sort(OM)}function zy(e){return{id:`${Wo}${e.id}`,workspace_id:wn,name:e.name,repo_path:e.local_path,config_json:{workflow_name:e.workflow_name,team_id:e.team_id,durable_memory_mode:e.durable_memory_mode},last_active_at:null,created_at:e.created_at}}function Bo(e){let t={};if(e.config_json!==null)try{let r=JSON.parse(e.config_json);r!==null&&typeof r=="object"&&(t=r)}catch{}return e.linked_v4_project_id!==null&&(t={...t,linked_v4_project_id:e.linked_v4_project_id}),{id:`${yn}${e.id}`,workspace_id:e.workspace_id,name:e.name,repo_path:e.repo_path,config_json:t,last_active_at:e.last_active_at,created_at:e.created_at}}function $d(e,t){if(!t.startsWith(yn))return null;let r=t.slice(yn.length),n=Number.parseInt(r,10);return!Number.isFinite(n)||String(n)!==r?null:e.getWebProject(n)}function Zy(e,t){if(t.startsWith(Wo)){let n=t.slice(Wo.length),s=Number.parseInt(n,10);if(Number.isFinite(s)&&String(s)===n)return e.getProject(s)}let r=Number.parseInt(t,10);return Number.isFinite(r)&&String(r)===t?e.getProject(r):null}async function TM(e){let{enqueueManual:t}=await Promise.resolve().then(()=>(Wc(),hh));return{id:t(e.dal,{project_id:e.project_id,source_ref:e.source_ref,payload:e.payload}).id}}function bM(e,t){let r=e.getPromptDispatch(t);if(r===null)return{prompt_id:t,data:{status:"unknown"},errors_json:{error:"prompt_not_found"},duration_ms:null};let n=e.getJob(r.job_id);if(n===null)return{prompt_id:t,data:null,errors_json:{error:"job_missing",job_id:r.job_id},duration_ms:null};let s=n.run_id===null?null:e.getRun(n.run_id),i=e.getProject(r.project_id),o=AM(e,i?.team_id??null),a=xM(s),l=RM(n,a,o.length>0),c=LM(r.created_at,s),d=i===null?{totalEstimatedMs:void 0,perStep:new Map}:SM(e,i.workflow_name),u=d.totalEstimatedMs,f=Qy(r.created_at),m=i?.workflow_name,p=d.perStep.size>0?d.perStep.size:void 0,_=s===null?[]:vM(e,s.id),g=kM(s,a,_,d.perStep,o),h=IM(_,d.perStep),S=NM(g,h,u,f,m,p);return l==="error"?{prompt_id:t,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,...Uo(u,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&&e.setPromptDispatchCompleted(t),{prompt_id:t,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,...Uo(u,f),...S},errors_json:null,duration_ms:c}):l==="paused"?{prompt_id:t,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:o,...Uo(u,f),...S},errors_json:null,duration_ms:c}:{prompt_id:t,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,attempt_count:n.attempt_count,...Uo(u,f),...S},errors_json:null,duration_ms:c}}function SM(e,t){let r={totalEstimatedMs:void 0,perStep:new Map},n=e.getWorkflowByName(t);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 i=s,o=typeof i.estimated_duration_ms=="number"&&Number.isFinite(i.estimated_duration_ms)&&i.estimated_duration_ms>=0?i.estimated_duration_ms:void 0,a=new Map;if(Array.isArray(i.steps))for(let l of i.steps){if(l===null||typeof l!="object")continue;let c=l;if(typeof c.id!="string"||c.id.length===0)continue;let d=typeof c.name=="string"&&c.name.length>0?c.name:c.id,u=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,u===void 0?{name:d}:{name:d,estimated_duration_ms:u})}if(i.steps===void 0&&i.states!==null&&typeof i.states=="object")for(let[l,c]of Object.entries(i.states)){if(c===null||typeof c!="object")continue;let d=c,u=typeof d.estimated_duration_ms=="number"&&Number.isFinite(d.estimated_duration_ms)&&d.estimated_duration_ms>=0?d.estimated_duration_ms:void 0;a.set(l,u===void 0?{name:l}:{name:l,estimated_duration_ms:u})}return{totalEstimatedMs:o,perStep:a}}function vM(e,t){try{return e.listStepsForRun(t)}catch{return[]}}function kM(e,t,r,n,s){if(e===null||e.terminal_state!==null)return;let i=t!==null?t:e.current_state;if(i===null||i.length===0)return;let a=[...r].reverse().find(f=>f.state_name===i&&f.ended_at===null)?.started_at??e.paused_at??e.started_at,l=n.get(i),c=l?.name??i,d=Qy(a),u={id:i,name:c,started_at:a,elapsed_ms:d};return l?.estimated_duration_ms!==void 0&&(u.estimated_duration_ms=l.estimated_duration_ms),s.length>0&&(u.attention_needed=s),u}function IM(e,t){let r=[];for(let n of e){if(n.ended_at===null)continue;let s=Date.parse(n.started_at),i=Date.parse(n.ended_at),o=Number.isFinite(s)&&Number.isFinite(i)?Math.max(0,i-s):0,a=t.get(n.state_name)?.name??n.state_name,l=n.outcome==="failed"?"failed":"done";r.push({id:n.state_name,name:a,duration_ms:o,status:l})}return r}function NM(e,t,r,n,s,i){let o={completed_steps:t,total_elapsed_ms:n};return e!==void 0&&(o.current_step=e),r!==void 0&&(o.total_estimated_ms=r),s!==void 0&&s.length>0&&(o.workflow_name=s),i!==void 0&&(o.total_steps=i),o}function Qy(e){let t=Date.parse(e);return Number.isNaN(t)?0:Math.max(0,Date.now()-t)}function Uo(e,t){return e===void 0?{elapsed_ms:t}:{elapsed_ms:t,estimated_duration_ms:e}}function xM(e){if(e===null)return null;let t=e.current_state;if(t===null)return null;let r="__paused__:";return t.startsWith(r)?t.slice(r.length):null}function AM(e,t){if(t===null)return[];let r;try{r=e.listTeamMembers(t)}catch{return[]}return r.filter(n=>n.state==="attention_needed").map(n=>({alias:n.alias,reason:n.state_reason}))}function RM(e,t,r){return e.status==="queued"?"pending":e.status==="done"?"done":e.status==="failed"?"error":t!==null||r||e.status==="paused"?"paused":e.status==="running"?"running":"error"}function LM(e,t){let r=Date.parse(e);if(Number.isNaN(r))return null;let n=t?.ended_at??null,s=n===null?Date.now():Date.parse(n);return Number.isNaN(s)?null:Math.max(0,s-r)}function OM(e,t){let r=Date.parse(e.last_active_at??""),n=Date.parse(t.last_active_at??""),s=(Number.isNaN(n)?0:n)-(Number.isNaN(r)?0:r);return s===0?e.name.localeCompare(t.name):s}var Wo,yn,uM,wn,Od,fM,ew=T(()=>{"use strict";Wo="project:",yn="web_project:",uM="prompt:",wn="default",Od="Default workspace",fM=new Date(0).toISOString()});import{Buffer as tw}from"node:buffer";function rw(e,t,r){if(typeof e=="number"&&Number.isFinite(e)&&e>0)return e;if(t!==void 0&&t!==""){let n=Number(t);if(Number.isFinite(n)&&n>0)return n}return r}function nw(e){return MM[e]}function sw(e){let t=e.trim();if(t==="")return;let r=t.split(/\s+/),n=r.shift();if(!(n===void 0||n===""))return{cmd:n,args:r}}var $M,CM,qo,MM,Cd=T(()=>{"use strict";$M=1e4,CM=256*1024,qo=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(t){this.opts=t,this.pushWindowMs=rw(t.pushWindowMs,process.env.LMCTL_TERMINAL_PUSH_WINDOW_MS,$M),this.pushByteCap=rw(t.pushByteCap,process.env.LMCTL_TERMINAL_PUSH_BYTE_CAP,CM),this.timers=t.timers??{setTimeout:(r,n)=>globalThis.setTimeout(r,n),clearTimeout:r=>globalThis.clearTimeout(r)}}startSession(t){if(this.sessions.has(t.session_id))throw new Error(`terminal_session_already_exists: ${t.session_id}`);let r=this.opts.pty.spawn(t.command,t.args,{name:"xterm-256color",cols:t.cols??120,rows:t.rows??30,cwd:t.cwd??process.cwd(),env:t.env??process.env}),n={session_id:t.session_id,pty:r,pendingOutput:[],pendingBytes:0,pushTimer:void 0,closed:!1};return this.sessions.set(t.session_id,n),r.onData(s=>{this.onPtyData(n,s)}),r.onExit(s=>{this.onPtyExit(n,s)}),this.opts.log?.(`[dt-2] terminal session ${t.session_id} started pid=${r.pid} cmd=${t.command}`),{pid:r.pid}}endSession(t){let r=this.sessions.get(t);if(r!==void 0)try{r.pty.kill()}catch{}}onInbound(t){if(t.direction!=="user_to_agent")return;let r=this.sessions.get(t.session_id);if(r===void 0){this.opts.log?.(`[dt-2] inbound terminal data for unknown session ${t.session_id}; dropping`);return}if(r.closed){this.opts.log?.(`[dt-2] inbound terminal data for closed session ${t.session_id}; dropping`);return}try{r.pty.write(t.data)}catch(n){this.opts.log?.(`[dt-2] pty.write failed for session ${t.session_id}: ${n instanceof Error?n.message:String(n)}`)}}setPublish(t){this.opts={...this.opts,publish:t}}listSessions(){return Array.from(this.sessions.values()).map(t=>({session_id:t.session_id,pid:t.pty.pid}))}pendingBytesFor(t){return this.sessions.get(t)?.pendingBytes}async stop(){for(let t of Array.from(this.sessions.values()))try{t.pty.kill()}catch{}for(let t of Array.from(this.sessions.values()))t.pushTimer!==void 0&&(this.timers.clearTimeout(t.pushTimer),t.pushTimer=void 0)}onPtyData(t,r){if(!t.closed){if(t.pendingOutput.push(r),t.pendingBytes+=tw.byteLength(r,"utf8"),t.pendingBytes>=this.pushByteCap){this.flush(t,"byte_cap");return}t.pushTimer===void 0&&(t.pushTimer=this.timers.setTimeout(()=>{this.flush(t,"window_idle")},this.pushWindowMs))}}async flush(t,r){if(t.pushTimer!==void 0&&(this.timers.clearTimeout(t.pushTimer),t.pushTimer=void 0),t.pendingOutput.length===0)return;let n=t.pendingOutput.join("");t.pendingOutput=[],t.pendingBytes=0;let s={kind:"terminal",session_id:t.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=${t.session_id} reason=${r} bytes=${tw.byteLength(n,"utf8")}`)}catch(i){this.opts.log?.(`[dt-2] publish failed session=${t.session_id} reason=${r}: ${i instanceof Error?i.message:String(i)}`)}}async onPtyExit(t,r){if(t.closed)return;await this.flush(t,"pty_exit");let n=`\r
|
|
1953
1953
|
[process exited with code ${r.exitCode}${r.signal!==void 0?` signal ${r.signal}`:""}]\r
|
|
1954
|
-
`,s={kind:"terminal",session_id:t.session_id,direction:"agent_to_user",data:n,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s)}catch(i){this.opts.log?.(`[dt-2] publish (exit) failed session=${t.session_id}: ${i instanceof Error?i.message:String(i)}`)}t.closed=!0,this.sessions.delete(t.session_id)}};MM={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 ow(e,t){e.post("/mailbox/terminal/launch",r=>jM(r,t)),e.post("/mailbox/terminal/end/:session_id",r=>DM(r,t)),e.get("/mailbox/terminal/sessions",r=>PM(r,t))}async function jM(e,t){let r=t.terminalSessionManager;if(r===void 0)return e.json({error:"terminal_unavailable",message:"terminal session manager not configured (mailbox runtime missing)"},503);let n;try{n=await e.req.json()}catch{return e.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.session_id;if(typeof s!="string"||!iw.test(s))return e.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let i=n.provider;if(typeof i!="string"||i==="")return e.json({error:"bad_request",message:"provider is required"},400);let o;if(typeof n.command_line=="string"&&n.command_line.trim()!==""){if(o=sw(n.command_line),o===void 0)return e.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=nw(i);if(a===void 0)return e.json({error:"no_default_for_provider",message:`no TERMINAL_LAUNCH_DEFAULTS entry for provider "${i}"`},400);o={cmd:a.cmd,args:[...a.args]}}try{let{pid:a}=r.startSession({session_id:s,command:o.cmd,args:o.args,...typeof n.cwd=="string"&&n.cwd!==""?{cwd:n.cwd}:{}});return e.json({session_id:s,pid:a,command:o.cmd,args:o.args},201)}catch(a){let l=a instanceof Error?a.message:String(a);return l.startsWith("terminal_session_already_exists")?e.json({error:"session_exists",message:l},409):e.json({error:"spawn_failed",message:l},500)}}function DM(e,t){let r=t.terminalSessionManager;if(r===void 0)return e.json({error:"terminal_unavailable",message:"terminal session manager not configured"},503);let n=e.req.param("session_id");return n===void 0||!iw.test(n)?e.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400):(r.endSession(n),e.json({session_id:n,ended:!0}))}function PM(e,t){let r=t.terminalSessionManager;return r===void 0?e.json({sessions:[],note:"terminal session manager not configured"}):e.json({sessions:r.listSessions()})}var iw,aw=T(()=>{"use strict";Cd();iw=/^[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 FM}from"node:buffer";function BM(e){try{return FM.byteLength(JSON.stringify(e),"utf8")}catch{return 256}}function lw(e,t,r){if(typeof e=="number"&&Number.isFinite(e)&&e>0)return e;if(t!==void 0&&t!==""){let n=Number(t);if(Number.isFinite(n)&&n>0)return n}return r}function cw(e){return qM[e]}function dw(e){let t=e.trim();if(t==="")return;let r=[],n=0;for(;n<t.length;){let i=t[n];if(i===" "||i===" "){n+=1;continue}if(i==='"'){let a=n+1,l="";for(;a<t.length&&t[a]!=='"';)l+=t[a],a+=1;r.push(l),n=a+1;continue}let o=n;for(;o<t.length&&t[o]!==" "&&t[o]!==" ";)o+=1;r.push(t.slice(n,o)),n=o}if(r.length===0)return;let s=r.shift();if(!(s===void 0||s===""))return{cmd:s,args:r}}var UM,WM,qo,qM,Md=T(()=>{"use strict";UM=2e3,WM=64*1024,qo=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(t){this.opts=t,this.pushWindowMs=lw(t.pushWindowMs,process.env.LMCTL_PROVIDER_PUSH_WINDOW_MS,UM),this.pushByteCap=lw(t.pushByteCap,process.env.LMCTL_PROVIDER_PUSH_BYTE_CAP,WM),this.timers=t.timers??{setTimeout:(r,n)=>globalThis.setTimeout(r,n),clearTimeout:r=>globalThis.clearTimeout(r)}}async startSession(t){if(this.sessions.has(t.session_id))throw new Error(`persistent_session_already_exists: ${t.session_id}`);let r=this.opts.adapterFactory(t.provider),n={session_id:t.session_id,provider:t.provider,adapter:r,child:void 0,pendingEvents:[],pendingBytes:0,pushTimer:void 0,generation:1,turnMap:new Map,closed:!1};this.sessions.set(t.session_id,n);let s=this.makeAdapterContext(n);try{let i=await r.start(t,s);return n.child=i,this.wireChildExit(n,i),this.opts.log?.(`[dt-3] persistent session ${t.session_id} started provider=${t.provider} pid=${i.pid??"?"}`),{pid:i.pid}}catch(i){throw this.sessions.delete(t.session_id),i}}async endSession(t){let r=this.sessions.get(t);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(t)}}async onInbound(t){if(t.direction!=="user_to_agent")return;let r=this.sessions.get(t.session_id);if(r===void 0){this.opts.log?.(`[dt-3] inbound provider data for unknown session ${t.session_id}; dropping`);return}if(r.closed){this.opts.log?.(`[dt-3] inbound provider data for closed session ${t.session_id}; dropping`);return}let n=t.user_input??"";if(n!=="")try{await r.adapter.sendTurn(n)}catch(s){let i=s instanceof Error?s.message:String(s);this.opts.log?.(`[dt-3] adapter.sendTurn failed session=${t.session_id}: ${i}`),this.appendEvent(r,{event_type:"error",payload:{message:`sendTurn failed: ${i}`}})}}setPublish(t){this.opts={...this.opts,publish:t}}listSessions(){return Array.from(this.sessions.values()).map(t=>({session_id:t.session_id,provider:t.provider,pid:t.child?.pid}))}pendingEventCountFor(t){return this.sessions.get(t)?.pendingEvents.length}generationFor(t){return this.sessions.get(t)?.generation}_testBumpGeneration(t){let r=this.sessions.get(t);r!==void 0&&(r.generation+=1)}async stop(){for(let t of Array.from(this.sessions.values())){t.generation+=1;try{await t.adapter.stop()}catch{}if(t.child!==void 0)try{t.child.kill("SIGTERM")}catch{}}for(let t of Array.from(this.sessions.values()))t.pushTimer!==void 0&&(this.timers.clearTimeout(t.pushTimer),t.pushTimer=void 0)}makeAdapterContext(t){let r=t.generation,n=this;return{generation:r,currentGeneration(){return t.generation},emit(s){r===t.generation&&(t.closed||n.appendEvent(t,s))},...n.opts.log!==void 0?{log:n.opts.log}:{},turnMap:t.turnMap}}appendEvent(t,r){t.pendingEvents.push(r);let n=BM(r);if(t.pendingBytes+=n,t.pendingBytes>=this.pushByteCap){this.flush(t,"byte_cap");return}t.pushTimer===void 0&&(t.pushTimer=this.timers.setTimeout(()=>{this.flush(t,"window_idle")},this.pushWindowMs))}async flush(t,r){if(t.pushTimer!==void 0&&(this.timers.clearTimeout(t.pushTimer),t.pushTimer=void 0),t.pendingEvents.length===0)return;let n=t.pendingEvents;t.pendingEvents=[],t.pendingBytes=0;let s={kind:"provider",session_id:t.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=${t.session_id} reason=${r} events=${n.length}`)}catch(i){this.opts.log?.(`[dt-3] publish failed session=${t.session_id} reason=${r}: ${i instanceof Error?i.message:String(i)}`)}}wireChildExit(t,r){let n=t.generation;r.on("exit",(s,i)=>{n===t.generation&&(t.closed||(this.appendEvent(t,{event_type:"error",payload:{message:`provider child exited code=${s??"?"} signal=${i??""}; session ended. Click Reset to start a new chat.`}}),this.flush(t,"child_exit"),t.closed=!0))}),r.on("error",s=>{n===t.generation&&(t.closed||(this.appendEvent(t,{event_type:"error",payload:{message:`provider child error: ${s.message}`}}),this.flush(t,"child_exit")))})}};qM={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 fw(e,t){e.post("/mailbox/chat/launch",r=>HM(r,t)),e.post("/mailbox/chat/end/:session_id",r=>JM(r,t)),e.get("/mailbox/chat/sessions",r=>XM(r,t))}async function HM(e,t){let r=t.persistentSessionManager;if(r===void 0)return e.json({error:"chat_unavailable",message:"persistent session manager not configured (mailbox runtime missing)"},503);let n;try{n=await e.req.json()}catch{return e.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.session_id;if(typeof s!="string"||!uw.test(s))return e.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let i=n.provider;if(typeof i!="string"||i==="")return e.json({error:"bad_request",message:"provider is required"},400);let o;if(typeof n.command_line=="string"&&n.command_line.trim()!==""){if(o=dw(n.command_line),o===void 0)return e.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=cw(i);if(a===void 0)return e.json({error:"no_default_for_provider",message:`no PERSISTENT_LAUNCH_DEFAULTS entry for provider "${i}"`},400);o={cmd:a.cmd,args:[...a.args]}}try{let{pid:a}=await r.startSession({session_id:s,provider:i,command:o.cmd,args:o.args,...typeof n.cwd=="string"&&n.cwd!==""?{cwd:n.cwd}:{}});return e.json({session_id:s,provider:i,pid:a,command:o.cmd,args:o.args},201)}catch(a){let l=a instanceof Error?a.message:String(a);return l.startsWith("persistent_session_already_exists")?e.json({error:"session_exists",message:l},409):l.startsWith("no_persistent_adapter_for_provider")?e.json({error:"no_adapter",message:l},400):e.json({error:"spawn_failed",message:l},500)}}async function JM(e,t){let r=t.persistentSessionManager;if(r===void 0)return e.json({error:"chat_unavailable",message:"persistent session manager not configured"},503);let n=e.req.param("session_id");return n===void 0||!uw.test(n)?e.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400):(await r.endSession(n),e.json({session_id:n,ended:!0}))}function XM(e,t){let r=t.persistentSessionManager;return r===void 0?e.json({sessions:[],note:"persistent session manager not configured"}):e.json({sessions:r.listSessions()})}var uw,mw=T(()=>{"use strict";Md();uw=/^[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 GM}from"node:fs";function _w(e){let t=e.artifacts.find(r=>r.kind===`${e.state_name}_transcript`);if(t?.content!==void 0&&t.content!==null)return pw(t.content);if(t?.path===void 0||t.path===null)return[];try{let r=GM(t.path,{encoding:"utf8"});return pw(r)}catch{return[]}}function pw(e){let t=e.split(/\r?\n/).filter(r=>r.trim().length>0);return t.length===0?[]:t.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 hw=T(()=>{"use strict"});function gw(e,t,r){let n=e.getRun(t);if(n===null)return{err:`run ${t}: not found`};if(r!==void 0){let l=e.findTeamMemberByAlias(n.team_id,r);return l===null?{err:`run ${t}: team has no member alias "${r}"`}:l.sessionid===null||l.sessionid.length===0?{err:`run ${t}: 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=e.latestAgentCall(t);if(s!==null){let l=e.findTeamMemberByAlias(n.team_id,s.alias);return l===null?{err:`run ${t}: 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 ${t}: 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 o=e.listTeamMembers(n.team_id).filter(l=>l.state!=="retired"&&l.sessionid!==null&&l.sessionid.length>0);if(o.length===0)return{err:`run ${t}: cannot resolve an agent session (no agent_call yet, no seeded member)`};if(o.length>1){let l=o.map(c=>c.alias).join(", ");return{err:`run ${t}: cannot resolve an agent session (no agent_call yet; team has multiple members [${l}] \u2014 pass --alias)`}}let a=o[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 Ho(e,t){let r=e.query(`SELECT id, kind FROM attention
|
|
1954
|
+
`,s={kind:"terminal",session_id:t.session_id,direction:"agent_to_user",data:n,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s)}catch(i){this.opts.log?.(`[dt-2] publish (exit) failed session=${t.session_id}: ${i instanceof Error?i.message:String(i)}`)}t.closed=!0,this.sessions.delete(t.session_id)}};MM={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 ow(e,t){e.post("/mailbox/terminal/launch",r=>jM(r,t)),e.post("/mailbox/terminal/end/:session_id",r=>DM(r,t)),e.get("/mailbox/terminal/sessions",r=>PM(r,t))}async function jM(e,t){let r=t.terminalSessionManager;if(r===void 0)return e.json({error:"terminal_unavailable",message:"terminal session manager not configured (mailbox runtime missing)"},503);let n;try{n=await e.req.json()}catch{return e.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.session_id;if(typeof s!="string"||!iw.test(s))return e.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let i=n.provider;if(typeof i!="string"||i==="")return e.json({error:"bad_request",message:"provider is required"},400);let o;if(typeof n.command_line=="string"&&n.command_line.trim()!==""){if(o=sw(n.command_line),o===void 0)return e.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=nw(i);if(a===void 0)return e.json({error:"no_default_for_provider",message:`no TERMINAL_LAUNCH_DEFAULTS entry for provider "${i}"`},400);o={cmd:a.cmd,args:[...a.args]}}try{let{pid:a}=r.startSession({session_id:s,command:o.cmd,args:o.args,...typeof n.cwd=="string"&&n.cwd!==""?{cwd:n.cwd}:{}});return e.json({session_id:s,pid:a,command:o.cmd,args:o.args},201)}catch(a){let l=a instanceof Error?a.message:String(a);return l.startsWith("terminal_session_already_exists")?e.json({error:"session_exists",message:l},409):e.json({error:"spawn_failed",message:l},500)}}function DM(e,t){let r=t.terminalSessionManager;if(r===void 0)return e.json({error:"terminal_unavailable",message:"terminal session manager not configured"},503);let n=e.req.param("session_id");return n===void 0||!iw.test(n)?e.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400):(r.endSession(n),e.json({session_id:n,ended:!0}))}function PM(e,t){let r=t.terminalSessionManager;return r===void 0?e.json({sessions:[],note:"terminal session manager not configured"}):e.json({sessions:r.listSessions()})}var iw,aw=T(()=>{"use strict";Cd();iw=/^[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 FM}from"node:buffer";function BM(e){try{return FM.byteLength(JSON.stringify(e),"utf8")}catch{return 256}}function lw(e,t,r){if(typeof e=="number"&&Number.isFinite(e)&&e>0)return e;if(t!==void 0&&t!==""){let n=Number(t);if(Number.isFinite(n)&&n>0)return n}return r}function cw(e){return qM[e]}function dw(e){let t=e.trim();if(t==="")return;let r=[],n=0;for(;n<t.length;){let i=t[n];if(i===" "||i===" "){n+=1;continue}if(i==='"'){let a=n+1,l="";for(;a<t.length&&t[a]!=='"';)l+=t[a],a+=1;r.push(l),n=a+1;continue}let o=n;for(;o<t.length&&t[o]!==" "&&t[o]!==" ";)o+=1;r.push(t.slice(n,o)),n=o}if(r.length===0)return;let s=r.shift();if(!(s===void 0||s===""))return{cmd:s,args:r}}var UM,WM,Ho,qM,Md=T(()=>{"use strict";UM=2e3,WM=64*1024,Ho=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(t){this.opts=t,this.pushWindowMs=lw(t.pushWindowMs,process.env.LMCTL_PROVIDER_PUSH_WINDOW_MS,UM),this.pushByteCap=lw(t.pushByteCap,process.env.LMCTL_PROVIDER_PUSH_BYTE_CAP,WM),this.timers=t.timers??{setTimeout:(r,n)=>globalThis.setTimeout(r,n),clearTimeout:r=>globalThis.clearTimeout(r)}}async startSession(t){if(this.sessions.has(t.session_id))throw new Error(`persistent_session_already_exists: ${t.session_id}`);let r=this.opts.adapterFactory(t.provider),n={session_id:t.session_id,provider:t.provider,adapter:r,child:void 0,pendingEvents:[],pendingBytes:0,pushTimer:void 0,generation:1,turnMap:new Map,closed:!1};this.sessions.set(t.session_id,n);let s=this.makeAdapterContext(n);try{let i=await r.start(t,s);return n.child=i,this.wireChildExit(n,i),this.opts.log?.(`[dt-3] persistent session ${t.session_id} started provider=${t.provider} pid=${i.pid??"?"}`),{pid:i.pid}}catch(i){throw this.sessions.delete(t.session_id),i}}async endSession(t){let r=this.sessions.get(t);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(t)}}async onInbound(t){if(t.direction!=="user_to_agent")return;let r=this.sessions.get(t.session_id);if(r===void 0){this.opts.log?.(`[dt-3] inbound provider data for unknown session ${t.session_id}; dropping`);return}if(r.closed){this.opts.log?.(`[dt-3] inbound provider data for closed session ${t.session_id}; dropping`);return}let n=t.user_input??"";if(n!=="")try{await r.adapter.sendTurn(n)}catch(s){let i=s instanceof Error?s.message:String(s);this.opts.log?.(`[dt-3] adapter.sendTurn failed session=${t.session_id}: ${i}`),this.appendEvent(r,{event_type:"error",payload:{message:`sendTurn failed: ${i}`}})}}setPublish(t){this.opts={...this.opts,publish:t}}listSessions(){return Array.from(this.sessions.values()).map(t=>({session_id:t.session_id,provider:t.provider,pid:t.child?.pid}))}pendingEventCountFor(t){return this.sessions.get(t)?.pendingEvents.length}generationFor(t){return this.sessions.get(t)?.generation}_testBumpGeneration(t){let r=this.sessions.get(t);r!==void 0&&(r.generation+=1)}async stop(){for(let t of Array.from(this.sessions.values())){t.generation+=1;try{await t.adapter.stop()}catch{}if(t.child!==void 0)try{t.child.kill("SIGTERM")}catch{}}for(let t of Array.from(this.sessions.values()))t.pushTimer!==void 0&&(this.timers.clearTimeout(t.pushTimer),t.pushTimer=void 0)}makeAdapterContext(t){let r=t.generation,n=this;return{generation:r,currentGeneration(){return t.generation},emit(s){r===t.generation&&(t.closed||n.appendEvent(t,s))},...n.opts.log!==void 0?{log:n.opts.log}:{},turnMap:t.turnMap}}appendEvent(t,r){t.pendingEvents.push(r);let n=BM(r);if(t.pendingBytes+=n,t.pendingBytes>=this.pushByteCap){this.flush(t,"byte_cap");return}t.pushTimer===void 0&&(t.pushTimer=this.timers.setTimeout(()=>{this.flush(t,"window_idle")},this.pushWindowMs))}async flush(t,r){if(t.pushTimer!==void 0&&(this.timers.clearTimeout(t.pushTimer),t.pushTimer=void 0),t.pendingEvents.length===0)return;let n=t.pendingEvents;t.pendingEvents=[],t.pendingBytes=0;let s={kind:"provider",session_id:t.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=${t.session_id} reason=${r} events=${n.length}`)}catch(i){this.opts.log?.(`[dt-3] publish failed session=${t.session_id} reason=${r}: ${i instanceof Error?i.message:String(i)}`)}}wireChildExit(t,r){let n=t.generation;r.on("exit",(s,i)=>{n===t.generation&&(t.closed||(this.appendEvent(t,{event_type:"error",payload:{message:`provider child exited code=${s??"?"} signal=${i??""}; session ended. Click Reset to start a new chat.`}}),this.flush(t,"child_exit"),t.closed=!0))}),r.on("error",s=>{n===t.generation&&(t.closed||(this.appendEvent(t,{event_type:"error",payload:{message:`provider child error: ${s.message}`}}),this.flush(t,"child_exit")))})}};qM={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 fw(e,t){e.post("/mailbox/chat/launch",r=>HM(r,t)),e.post("/mailbox/chat/end/:session_id",r=>JM(r,t)),e.get("/mailbox/chat/sessions",r=>XM(r,t))}async function HM(e,t){let r=t.persistentSessionManager;if(r===void 0)return e.json({error:"chat_unavailable",message:"persistent session manager not configured (mailbox runtime missing)"},503);let n;try{n=await e.req.json()}catch{return e.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.session_id;if(typeof s!="string"||!uw.test(s))return e.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let i=n.provider;if(typeof i!="string"||i==="")return e.json({error:"bad_request",message:"provider is required"},400);let o;if(typeof n.command_line=="string"&&n.command_line.trim()!==""){if(o=dw(n.command_line),o===void 0)return e.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=cw(i);if(a===void 0)return e.json({error:"no_default_for_provider",message:`no PERSISTENT_LAUNCH_DEFAULTS entry for provider "${i}"`},400);o={cmd:a.cmd,args:[...a.args]}}try{let{pid:a}=await r.startSession({session_id:s,provider:i,command:o.cmd,args:o.args,...typeof n.cwd=="string"&&n.cwd!==""?{cwd:n.cwd}:{}});return e.json({session_id:s,provider:i,pid:a,command:o.cmd,args:o.args},201)}catch(a){let l=a instanceof Error?a.message:String(a);return l.startsWith("persistent_session_already_exists")?e.json({error:"session_exists",message:l},409):l.startsWith("no_persistent_adapter_for_provider")?e.json({error:"no_adapter",message:l},400):e.json({error:"spawn_failed",message:l},500)}}async function JM(e,t){let r=t.persistentSessionManager;if(r===void 0)return e.json({error:"chat_unavailable",message:"persistent session manager not configured"},503);let n=e.req.param("session_id");return n===void 0||!uw.test(n)?e.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400):(await r.endSession(n),e.json({session_id:n,ended:!0}))}function XM(e,t){let r=t.persistentSessionManager;return r===void 0?e.json({sessions:[],note:"persistent session manager not configured"}):e.json({sessions:r.listSessions()})}var uw,mw=T(()=>{"use strict";Md();uw=/^[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 GM}from"node:fs";function _w(e){let t=e.artifacts.find(r=>r.kind===`${e.state_name}_transcript`);if(t?.content!==void 0&&t.content!==null)return pw(t.content);if(t?.path===void 0||t.path===null)return[];try{let r=GM(t.path,{encoding:"utf8"});return pw(r)}catch{return[]}}function pw(e){let t=e.split(/\r?\n/).filter(r=>r.trim().length>0);return t.length===0?[]:t.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 hw=T(()=>{"use strict"});function gw(e,t,r){let n=e.getRun(t);if(n===null)return{err:`run ${t}: not found`};if(r!==void 0){let l=e.findTeamMemberByAlias(n.team_id,r);return l===null?{err:`run ${t}: team has no member alias "${r}"`}:l.sessionid===null||l.sessionid.length===0?{err:`run ${t}: 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=e.latestAgentCall(t);if(s!==null){let l=e.findTeamMemberByAlias(n.team_id,s.alias);return l===null?{err:`run ${t}: 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 ${t}: 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 o=e.listTeamMembers(n.team_id).filter(l=>l.state!=="retired"&&l.sessionid!==null&&l.sessionid.length>0);if(o.length===0)return{err:`run ${t}: cannot resolve an agent session (no agent_call yet, no seeded member)`};if(o.length>1){let l=o.map(c=>c.alias).join(", ");return{err:`run ${t}: cannot resolve an agent session (no agent_call yet; team has multiple members [${l}] \u2014 pass --alias)`}}let a=o[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 Jo(e,t){let r=e.query(`SELECT id, kind FROM attention
|
|
1955
1955
|
WHERE run_id = ?
|
|
1956
1956
|
AND acknowledged_at IS NULL
|
|
1957
1957
|
AND requires_user = 1
|
|
1958
|
-
ORDER BY id DESC LIMIT 1`,t);return r.length===0?null:{kind:r[0].kind,attention_id:r[0].id}}var Jo=T(()=>{"use strict"});function Nw(e,t){e.all("/runtime/*",r=>VM(r.req.raw,t))}async function VM(e,t){try{return Response.json(await KM(e,t))}catch(r){if(r instanceof se)return Response.json({error:r.message},{status:r.status});let n=r instanceof Error?r.message:String(r);return Response.json({error:n},{status:500})}}async function KM(e,t){let r=new URL(e.url),n=rj(t),s=r.pathname.split("/").filter(Boolean).map(decodeURIComponent);if(e.method==="GET"&&r.pathname==="/runtime/workspaces")return jd(e),[{id:n.id,name:n.name}];if(e.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="workspaces")return Xo(e,n.id,s[2]),YM(t.dal,n);if(e.method==="GET"&&s.length===5&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"){Xo(e,n.id,s[2]);let i=ww(t.dal,s[4]);return yw(t.dal,n,i)}if(e.method==="GET"&&r.pathname==="/runtime/lead-teams")return jd(e),t.dal.listTeams().map(i=>tj(i));if(e.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="chat"){let i=Ew(t.dal,Tw(s[2])),o=await e.json();if(o.teamId!==`team:${i.name}`)throw new se(400,"runtime lead chat body does not match route team");return Sw(e,n.id,o.context),bw(i,o.context)}if(e.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="messages"){let i=Ew(t.dal,Tw(s[2])),o=await e.json();if(o.teamId!==`team:${i.name}`)throw new se(400,"runtime lead message body does not match route team");Sw(e,n.id,o.context);let a=o.draft?.body;if(typeof a!="string"||a.length===0)throw new se(400,"runtime lead message requires draft.body");return bw(i,o.context,a)}if(e.method==="POST"&&s.length===6&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"&&s[5]==="workflow-message"){Xo(e,n.id,s[2]);let i=ww(t.dal,s[4]),o=await e.json();if(o.workspaceId!==n.id||o.projectId!==i.name)throw new se(400,"runtime request body does not match route workspace/project");let a=o.draft?.body;if(typeof a!="string"||a.length===0)throw new se(400,"runtime workflow message requires draft.body");return QM(t.dal,i,a),yw(t.dal,n,i)}if(e.method==="GET"&&r.pathname==="/runtime/templates")return Ss(e,n.id),t.dal.listWorkflows().map(i=>nj(i));if(e.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="templates"){Ss(e,n.id);let i=ij(t.dal,s[2]);return sj(i)}if(e.method==="GET"&&r.pathname==="/runtime/runs"){Ss(e,n.id);let i=r.searchParams.get("project"),o=r.searchParams.get("template");if(i!==null&&o!==null)throw new se(400,"conflicting_filters: ?project= and ?template= are mutually exclusive");return oj(t.dal,i,o).map(l=>kw(t.dal,l))}if(e.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="runs"){Ss(e,n.id);let i=vw(t.dal,s[2]);return kw(t.dal,i)}if(e.method==="GET"&&s.length===4&&s[0]==="runtime"&&s[1]==="runs"&&s[3]==="events"){Ss(e,n.id);let i=vw(t.dal,s[2]),o=lj(t.dal,i);return{runId:Wd(i),events:o,...o.length>0?{cursor:o[o.length-1].id}:{}}}throw new se(404,`unknown runtime request: ${e.method} ${r.pathname}`)}function YM(e,t){return{id:t.id,name:t.name,projects:e.listProjects().map(r=>xw(e,t,r))}}function yw(e,t,r){let n=xw(e,t,r);return{...n,managedWorkflow:{...n.managedWorkflow,instance:zM(e,r),composerTarget:{kind:"workflow-initial",label:`Project Workflow: ${r.workflow_name}`,templateId:`template:${r.workflow_name}`,runId:n.managedWorkflow.runId}},workflowMessages:ZM(e,r)}}function xw(e,t,r){let n=Aw(e,r.id),s=Pd(n);return{id:r.name,workspaceId:t.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 zM(e,t){let r=Aw(e,t.id),n=r?.current_state??null;return{id:r===null?`project:${t.id}:no-run`:`run:${r.id}`,templateId:`template:${t.workflow_name}`,label:t.workflow_name,status:Pd(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 ZM(e,t){return e.query("SELECT * FROM attention WHERE project_id = ? ORDER BY id ASC LIMIT 50",t.id).map(n=>({id:`attention:${n.id}`,role:"event",author:"lmctl",timestamp:n.created_at,body:n.kind}))}function QM(e,t,r){let n=ej(e,t.id);if(n!==null){let s=Ho(e,n.id);if(s?.kind==="workflow_escalation"){let i=e.resumeEscalation(s.attention_id,r);if(!i.resumed)throw new se(409,`workflow escalation resume failed: ${i.reason}`);return}if(s?.kind==="interactive_waiting_operator"){let i=kt(e,s.attention_id);if(i?.step_id===null||i?.step_id===void 0)throw new se(409,"interactive resume failed: missing step");let o=e.resumeInteractive(i.step_id,r,!0);if(!o.resumed)throw new se(409,`interactive resume failed: ${o.reason}`);return}}e.enqueueJob({project_id:t.id,source:"runtime-workflow-message",payload:JSON.stringify({prompt:r}),priority:0})}function Aw(e,t){return e.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",t)[0]??null}function ej(e,t){return e.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",t)[0]??null}function Pd(e){return e===null?"queued":e.terminal_state===null?"running":e.terminal_state==="done"||e.terminal_state==="success"?"succeeded":e.terminal_state==="cancelled"||e.terminal_state==="aborted"?"cancelled":"failed"}function ww(e,t){let r=e.findProjectByName(t);if(r===null)throw new se(404,`project not found: ${t}`);return r}function Ew(e,t){let r=e.listTeams().find(n=>n.name===t);if(r===void 0)throw new se(404,`team not found: ${t}`);return r}function Tw(e){return e.startsWith("team:")?e.slice(5):e}function tj(e){return{id:`team:${e.name}`,name:e.name,teamfile:"",hasLead:!0,kind:e.name.toLowerCase().includes("manager")?"global-manager":"custom-ai-led"}}function bw(e,t,r){let n=new Date().toISOString(),s=r===void 0?[]:[{id:`lead:${e.id}:user:${Date.now()}`,role:"user",author:"operator",timestamp:n,body:r},{id:`lead:${e.id}:event:${Date.now()}`,role:"event",author:"lmctl",timestamp:n,body:"Lead-team mailbox request accepted by the runtime dispatcher."}];return{id:`lead-chat:${e.name}:${t?.scope??"global-admin"}:${t?.workspaceId??Iw}`,teamId:`team:${e.name}`,title:`${e.name} Lead`,messages:s,...t===void 0?{}:{context:t}}}function rj(e){let t=e.workspaceName??Dt()??Sr.default;return{id:t,name:t}}function jd(e){if(e.headers.get("x-lmctl-workspace-id")!==Iw)throw new se(400,"runtime request requires global-admin workspace identity")}function Xo(e,t,r){let n=e.headers.get("x-lmctl-workspace-id");if(n===null)throw new se(400,"runtime request requires workspace identity");if(r!==t||n!==t)throw new se(400,"runtime workspace identity does not match route")}function Ss(e,t){let r=e.headers.get("x-lmctl-workspace-id");if(r===null)throw new se(400,"runtime request requires workspace identity");if(r!==t)throw new se(400,"runtime workspace identity does not match server workspace")}function Sw(e,t,r){if(r?.scope==="workspace"){if(r.workspaceId===void 0)throw new se(400,"workspace manager context requires workspace identity");Xo(e,t,r.workspaceId);return}jd(e)}function Fd(e){return`${En}${Ud(e.name)}`}function Ud(e){return e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"item"}function Wd(e){return`${Dd}${e.id}`}function nj(e){let t=Go(e.definition);return{id:Fd(e),name:e.name,...t.description===null?{}:{description:t.description}}}function sj(e){let t=Go(e.definition);return{id:Fd(e),name:e.name,...t.description===null?{}:{description:t.description},graph:t.graph}}function Go(e){let t;try{t=JSON.parse(e)}catch{return{description:null,graph:null,stepIds:[],nameToId:new Map}}if(t===null||typeof t!="object")return{description:null,graph:t,stepIds:[],nameToId:new Map};let r=t,n=typeof r.description=="string"?r.description:null,s=[],i=new Map;if(r.schema_version==="lmctl/v3"&&Array.isArray(r.steps)){let o=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&&i.set(a.name,l))}o!==null&&s.includes(o)&&s.sort((a,l)=>a===o?-1:l===o?1:0)}return{description:n,graph:t,stepIds:s,nameToId:i}}function ij(e,t){if(!t.startsWith(En))throw new se(404,`template not found: ${t}`);let r=t.slice(En.length),n=e.listWorkflows().filter(s=>Ud(s.name)===r);if(n.length===0)throw new se(404,`template not found: ${t}`);if(n.length>1){let s=n.map(i=>i.name).join(", ");throw new se(409,`template_id_ambiguous: ${t} matches multiple workflow names [${s}]; rename to ensure unique slugs`)}return n[0]}function vw(e,t){if(!t.startsWith(Dd))throw new se(404,`run not found: ${t}`);let r=t.slice(Dd.length);if(!/^[1-9]\d*$/.test(r))throw new se(404,`run not found: ${t}`);let n=Number.parseInt(r,10);if(!Number.isFinite(n)||n<=0||String(n)!==r)throw new se(404,`run not found: ${t}`);let s=e.getRun(n);if(s===null)throw new se(404,`run not found: ${t}`);return s}function oj(e,t,r){if(r!==null){if(!r.startsWith(En))return[];let s=r.slice(En.length),i=e.listWorkflows().filter(a=>Ud(a.name)===s).map(a=>a.id);if(i.length===0)return[];let o=i.map(()=>"?").join(", ");return e.query(`SELECT * FROM run WHERE workflow_id IN (${o}) ORDER BY id DESC LIMIT 200`,...i)}if(t===null)return e.query("SELECT * FROM run ORDER BY id DESC LIMIT 200");let n=e.findProjectByName(t);return n===null?[]:e.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 kw(e,t){let r=e.getWorkflow(t.workflow_id),n=Pd(t),s=aj(r,t);return{id:Wd(t),templateId:r===null?`${En}unknown`:Fd(r),label:r===null?`run ${t.id}`:`${r.name} #${t.id}`,status:n,createdAt:t.started_at,...t.ended_at===null?{}:{updatedAt:t.ended_at},currentStepIds:s}}function aj(e,t){if(t.current_state===null)return[];let r=t.current_state.startsWith("__paused__:")?t.current_state.slice(11):t.current_state;return e===null?[r]:[Go(e.definition).nameToId.get(r)??r]}function lj(e,t){let r=e.getWorkflow(t.workflow_id),n=r===null?{stepIds:[],nameToId:new Map}:Go(r.definition),s=c=>n.nameToId.get(c)??c,i=Wd(t),o=[];o.push({timestamp:t.started_at,type:"run.started",message:"Run started"});let a=e.listStepsForRun(t.id);for(let c of a){let d=s(c.state_name);if(o.push({timestamp:c.started_at,type:"step.started",stepId:d,message:`step ${c.state_name} started`}),c.ended_at!==null){let u=cj(c);o.push({timestamp:c.ended_at,type:u,stepId:d,...c.outcome===null?{}:{message:c.outcome},...c.status_detail===null?{}:{payload:{status_detail:c.status_detail}}})}else t.paused_at!==null&&c.id===a[a.length-1]?.id&&o.push({timestamp:t.paused_at,type:"step.paused",stepId:d})}let l=e.listSessionEvents(t.id);for(let c of l){let d=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)})(),u=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{}o.push({timestamp:u,type:"message",...d===void 0?{}:{stepId:d},payload:f})}if(t.terminal_state!==null){let c=t.terminal_state==="done"||t.terminal_state==="success"?"run.completed":t.terminal_state==="cancelled"||t.terminal_state==="aborted"?"run.cancelled":"run.failed";o.push({timestamp:t.ended_at??t.started_at,type:c,message:t.terminal_state})}return o.sort((c,d)=>c.timestamp.localeCompare(d.timestamp)),o.map((c,d)=>({id:`${i}:evt:${d+1}`,runId:i,sequence:d+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 cj(e){if(e.outcome===null)return"step.failed";let t=e.status_detail;return t==="failed"||t==="error"||t==="aborted"?"step.failed":"step.completed"}var Iw,En,Dd,se,Rw=T(()=>{"use strict";Xe();Jo();Ht();Iw="global-admin";En="template:",Dd="run:";se=class extends Error{status;constructor(t,r){super(r),this.status=t}}});import{mkdirSync as dj,writeFileSync as uj}from"node:fs";import{randomUUID as Lw}from"node:crypto";import{dirname as fj,resolve as Vo,sep as Ow}from"node:path";async function Cw(e,t){let r;try{r=await e.req.parseBody({all:!1})}catch{return e.text("invalid multipart body",400)}let n=r.image;if(!gj(n))return e.text("missing image file",400);if(n.size>mj)return e.text("upload too large",413);let s=Buffer.from(await n.arrayBuffer()),i=yj(s);if(i===null||!(i in $w))return e.text("unsupported upload MIME type",415);if(n.type.length>0&&n.type!==i)return e.text("upload MIME type does not match file content",415);let o=pj(t,r.project);if(typeof o=="string")return e.text(o,404);let a=o===null?Vo(hj()):Vo(o.local_path),l=Vo(a,"uploads",Lw()),c=Vo(l,`${Lw()}${$w[i]}`);if(!_j(c,a))return e.text("invalid upload path",400);dj(l,{recursive:!0});let d=new Uint8Array(s.buffer,s.byteOffset,s.byteLength);uj(c,d);let u={path:c,size:s.byteLength,mime:i,project:o?.name??null};return e.json(u)}function pj(e,t){return t==null||t===""?null:typeof t!="string"?"invalid project":e.findProjectByName(t)??`project not found: ${t}`}function _j(e,t){let r=t.endsWith(Ow)?t:`${t}${Ow}`;return e.startsWith(r)}function hj(){return fj(le())}function gj(e){return typeof File<"u"&&e instanceof File}function yj(e){return e.length>=8&&e[0]===137&&e[1]===80&&e[2]===78&&e[3]===71&&e[4]===13&&e[5]===10&&e[6]===26&&e[7]===10?"image/png":e.length>=3&&e[0]===255&&e[1]===216&&e[2]===255?"image/jpeg":e.length>=12&&e.subarray(0,4).toString("ascii")==="RIFF"&&e.subarray(8,12).toString("ascii")==="WEBP"?"image/webp":e.length>=12&&e.subarray(4,8).toString("ascii")==="ftyp"&&["heic","heix","hevc","hevx","mif1","msf1"].includes(e.subarray(8,12).toString("ascii"))?"image/heic":e.length>=5&&e.subarray(0,5).toString("ascii")==="%PDF-"?"application/pdf":null}var mj,$w,Mw=T(()=>{"use strict";Xe();mj=10*1024*1024,$w={"image/png":".png","image/jpeg":".jpg","image/webp":".webp","image/heic":".heic","application/pdf":".pdf"}});import{existsSync as Ko}from"node:fs";import{basename as wj,dirname as Ej,extname as Tj,isAbsolute as bj,join as Sj,relative as vj}from"node:path";import{fileURLToPath as kj}from"node:url";import{Hono as Ij}from"hono";import{serveStatic as Nt}from"@hono/node-server/serve-static";function Bw(e){let t=new Ij,r=[],n=e.localWebui!==void 0?qd(e.localWebui.webuiDir):Nj();if(e.localWebui!==void 0&&Gy(t,{s3:e.localWebui.localMailbox.s3,commands:e.localWebui.localMailbox.commands}),n!==null){let s=xj();e.localWebui!==void 0?t.get("/config.json",s,i=>i.json({workspaceFetchMode:"local-mailbox",localMailbox:{base:"/local-mailbox",userId:"local",deviceId:"local"},mailboxPolling:{readIntervalSeconds:1,heartbeatIdleSeconds:1,backoffReadIntervalSeconds:1}})):e.webuiRuntimeConfig!==void 0&&t.get("/config.json",s,i=>i.json(e.webuiRuntimeConfig)),t.use("/dist/*",s,Nt({root:n})),t.use("/vendor/*",s,Nt({root:n})),t.use("/src/*",s,Nt({root:n})),t.get("/",s,Nt({root:n,path:"index.html"})),t.get("/admin",s,Nt({root:n,path:"index.html"})),t.get("/admin/*",s,Nt({root:n,path:"index.html"})),t.get("/terminal",s,Nt({root:n,path:"index.html"})),t.get("/terminal/*",s,Nt({root:n,path:"index.html"})),t.get("/chat",s,Nt({root:n,path:"index.html"})),t.get("/chat/*",s,Nt({root:n,path:"index.html"}))}else t.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 t.use("*",Sh()),t.get("/login",s=>s.html(Re("Login",`
|
|
1958
|
+
ORDER BY id DESC LIMIT 1`,t);return r.length===0?null:{kind:r[0].kind,attention_id:r[0].id}}var Xo=T(()=>{"use strict"});function Nw(e,t){e.all("/runtime/*",r=>VM(r.req.raw,t))}async function VM(e,t){try{return Response.json(await KM(e,t))}catch(r){if(r instanceof se)return Response.json({error:r.message},{status:r.status});let n=r instanceof Error?r.message:String(r);return Response.json({error:n},{status:500})}}async function KM(e,t){let r=new URL(e.url),n=rj(t),s=r.pathname.split("/").filter(Boolean).map(decodeURIComponent);if(e.method==="GET"&&r.pathname==="/runtime/workspaces")return jd(e),[{id:n.id,name:n.name}];if(e.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="workspaces")return Go(e,n.id,s[2]),YM(t.dal,n);if(e.method==="GET"&&s.length===5&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"){Go(e,n.id,s[2]);let i=ww(t.dal,s[4]);return yw(t.dal,n,i)}if(e.method==="GET"&&r.pathname==="/runtime/lead-teams")return jd(e),t.dal.listTeams().map(i=>tj(i));if(e.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="chat"){let i=Ew(t.dal,Tw(s[2])),o=await e.json();if(o.teamId!==`team:${i.name}`)throw new se(400,"runtime lead chat body does not match route team");return Sw(e,n.id,o.context),bw(i,o.context)}if(e.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="messages"){let i=Ew(t.dal,Tw(s[2])),o=await e.json();if(o.teamId!==`team:${i.name}`)throw new se(400,"runtime lead message body does not match route team");Sw(e,n.id,o.context);let a=o.draft?.body;if(typeof a!="string"||a.length===0)throw new se(400,"runtime lead message requires draft.body");return bw(i,o.context,a)}if(e.method==="POST"&&s.length===6&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"&&s[5]==="workflow-message"){Go(e,n.id,s[2]);let i=ww(t.dal,s[4]),o=await e.json();if(o.workspaceId!==n.id||o.projectId!==i.name)throw new se(400,"runtime request body does not match route workspace/project");let a=o.draft?.body;if(typeof a!="string"||a.length===0)throw new se(400,"runtime workflow message requires draft.body");return QM(t.dal,i,a),yw(t.dal,n,i)}if(e.method==="GET"&&r.pathname==="/runtime/templates")return Ss(e,n.id),t.dal.listWorkflows().map(i=>nj(i));if(e.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="templates"){Ss(e,n.id);let i=ij(t.dal,s[2]);return sj(i)}if(e.method==="GET"&&r.pathname==="/runtime/runs"){Ss(e,n.id);let i=r.searchParams.get("project"),o=r.searchParams.get("template");if(i!==null&&o!==null)throw new se(400,"conflicting_filters: ?project= and ?template= are mutually exclusive");return oj(t.dal,i,o).map(l=>kw(t.dal,l))}if(e.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="runs"){Ss(e,n.id);let i=vw(t.dal,s[2]);return kw(t.dal,i)}if(e.method==="GET"&&s.length===4&&s[0]==="runtime"&&s[1]==="runs"&&s[3]==="events"){Ss(e,n.id);let i=vw(t.dal,s[2]),o=lj(t.dal,i);return{runId:Wd(i),events:o,...o.length>0?{cursor:o[o.length-1].id}:{}}}throw new se(404,`unknown runtime request: ${e.method} ${r.pathname}`)}function YM(e,t){return{id:t.id,name:t.name,projects:e.listProjects().map(r=>xw(e,t,r))}}function yw(e,t,r){let n=xw(e,t,r);return{...n,managedWorkflow:{...n.managedWorkflow,instance:zM(e,r),composerTarget:{kind:"workflow-initial",label:`Project Workflow: ${r.workflow_name}`,templateId:`template:${r.workflow_name}`,runId:n.managedWorkflow.runId}},workflowMessages:ZM(e,r)}}function xw(e,t,r){let n=Aw(e,r.id),s=Pd(n);return{id:r.name,workspaceId:t.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 zM(e,t){let r=Aw(e,t.id),n=r?.current_state??null;return{id:r===null?`project:${t.id}:no-run`:`run:${r.id}`,templateId:`template:${t.workflow_name}`,label:t.workflow_name,status:Pd(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 ZM(e,t){return e.query("SELECT * FROM attention WHERE project_id = ? ORDER BY id ASC LIMIT 50",t.id).map(n=>({id:`attention:${n.id}`,role:"event",author:"lmctl",timestamp:n.created_at,body:n.kind}))}function QM(e,t,r){let n=ej(e,t.id);if(n!==null){let s=Jo(e,n.id);if(s?.kind==="workflow_escalation"){let i=e.resumeEscalation(s.attention_id,r);if(!i.resumed)throw new se(409,`workflow escalation resume failed: ${i.reason}`);return}if(s?.kind==="interactive_waiting_operator"){let i=kt(e,s.attention_id);if(i?.step_id===null||i?.step_id===void 0)throw new se(409,"interactive resume failed: missing step");let o=e.resumeInteractive(i.step_id,r,!0);if(!o.resumed)throw new se(409,`interactive resume failed: ${o.reason}`);return}}e.enqueueJob({project_id:t.id,source:"runtime-workflow-message",payload:JSON.stringify({prompt:r}),priority:0})}function Aw(e,t){return e.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",t)[0]??null}function ej(e,t){return e.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",t)[0]??null}function Pd(e){return e===null?"queued":e.terminal_state===null?"running":e.terminal_state==="done"||e.terminal_state==="success"?"succeeded":e.terminal_state==="cancelled"||e.terminal_state==="aborted"?"cancelled":"failed"}function ww(e,t){let r=e.findProjectByName(t);if(r===null)throw new se(404,`project not found: ${t}`);return r}function Ew(e,t){let r=e.listTeams().find(n=>n.name===t);if(r===void 0)throw new se(404,`team not found: ${t}`);return r}function Tw(e){return e.startsWith("team:")?e.slice(5):e}function tj(e){return{id:`team:${e.name}`,name:e.name,teamfile:"",hasLead:!0,kind:e.name.toLowerCase().includes("manager")?"global-manager":"custom-ai-led"}}function bw(e,t,r){let n=new Date().toISOString(),s=r===void 0?[]:[{id:`lead:${e.id}:user:${Date.now()}`,role:"user",author:"operator",timestamp:n,body:r},{id:`lead:${e.id}:event:${Date.now()}`,role:"event",author:"lmctl",timestamp:n,body:"Lead-team mailbox request accepted by the runtime dispatcher."}];return{id:`lead-chat:${e.name}:${t?.scope??"global-admin"}:${t?.workspaceId??Iw}`,teamId:`team:${e.name}`,title:`${e.name} Lead`,messages:s,...t===void 0?{}:{context:t}}}function rj(e){let t=e.workspaceName??Dt()??Sr.default;return{id:t,name:t}}function jd(e){if(e.headers.get("x-lmctl-workspace-id")!==Iw)throw new se(400,"runtime request requires global-admin workspace identity")}function Go(e,t,r){let n=e.headers.get("x-lmctl-workspace-id");if(n===null)throw new se(400,"runtime request requires workspace identity");if(r!==t||n!==t)throw new se(400,"runtime workspace identity does not match route")}function Ss(e,t){let r=e.headers.get("x-lmctl-workspace-id");if(r===null)throw new se(400,"runtime request requires workspace identity");if(r!==t)throw new se(400,"runtime workspace identity does not match server workspace")}function Sw(e,t,r){if(r?.scope==="workspace"){if(r.workspaceId===void 0)throw new se(400,"workspace manager context requires workspace identity");Go(e,t,r.workspaceId);return}jd(e)}function Fd(e){return`${En}${Ud(e.name)}`}function Ud(e){return e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"item"}function Wd(e){return`${Dd}${e.id}`}function nj(e){let t=Vo(e.definition);return{id:Fd(e),name:e.name,...t.description===null?{}:{description:t.description}}}function sj(e){let t=Vo(e.definition);return{id:Fd(e),name:e.name,...t.description===null?{}:{description:t.description},graph:t.graph}}function Vo(e){let t;try{t=JSON.parse(e)}catch{return{description:null,graph:null,stepIds:[],nameToId:new Map}}if(t===null||typeof t!="object")return{description:null,graph:t,stepIds:[],nameToId:new Map};let r=t,n=typeof r.description=="string"?r.description:null,s=[],i=new Map;if(r.schema_version==="lmctl/v3"&&Array.isArray(r.steps)){let o=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&&i.set(a.name,l))}o!==null&&s.includes(o)&&s.sort((a,l)=>a===o?-1:l===o?1:0)}return{description:n,graph:t,stepIds:s,nameToId:i}}function ij(e,t){if(!t.startsWith(En))throw new se(404,`template not found: ${t}`);let r=t.slice(En.length),n=e.listWorkflows().filter(s=>Ud(s.name)===r);if(n.length===0)throw new se(404,`template not found: ${t}`);if(n.length>1){let s=n.map(i=>i.name).join(", ");throw new se(409,`template_id_ambiguous: ${t} matches multiple workflow names [${s}]; rename to ensure unique slugs`)}return n[0]}function vw(e,t){if(!t.startsWith(Dd))throw new se(404,`run not found: ${t}`);let r=t.slice(Dd.length);if(!/^[1-9]\d*$/.test(r))throw new se(404,`run not found: ${t}`);let n=Number.parseInt(r,10);if(!Number.isFinite(n)||n<=0||String(n)!==r)throw new se(404,`run not found: ${t}`);let s=e.getRun(n);if(s===null)throw new se(404,`run not found: ${t}`);return s}function oj(e,t,r){if(r!==null){if(!r.startsWith(En))return[];let s=r.slice(En.length),i=e.listWorkflows().filter(a=>Ud(a.name)===s).map(a=>a.id);if(i.length===0)return[];let o=i.map(()=>"?").join(", ");return e.query(`SELECT * FROM run WHERE workflow_id IN (${o}) ORDER BY id DESC LIMIT 200`,...i)}if(t===null)return e.query("SELECT * FROM run ORDER BY id DESC LIMIT 200");let n=e.findProjectByName(t);return n===null?[]:e.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 kw(e,t){let r=e.getWorkflow(t.workflow_id),n=Pd(t),s=aj(r,t);return{id:Wd(t),templateId:r===null?`${En}unknown`:Fd(r),label:r===null?`run ${t.id}`:`${r.name} #${t.id}`,status:n,createdAt:t.started_at,...t.ended_at===null?{}:{updatedAt:t.ended_at},currentStepIds:s}}function aj(e,t){if(t.current_state===null)return[];let r=t.current_state.startsWith("__paused__:")?t.current_state.slice(11):t.current_state;return e===null?[r]:[Vo(e.definition).nameToId.get(r)??r]}function lj(e,t){let r=e.getWorkflow(t.workflow_id),n=r===null?{stepIds:[],nameToId:new Map}:Vo(r.definition),s=c=>n.nameToId.get(c)??c,i=Wd(t),o=[];o.push({timestamp:t.started_at,type:"run.started",message:"Run started"});let a=e.listStepsForRun(t.id);for(let c of a){let d=s(c.state_name);if(o.push({timestamp:c.started_at,type:"step.started",stepId:d,message:`step ${c.state_name} started`}),c.ended_at!==null){let u=cj(c);o.push({timestamp:c.ended_at,type:u,stepId:d,...c.outcome===null?{}:{message:c.outcome},...c.status_detail===null?{}:{payload:{status_detail:c.status_detail}}})}else t.paused_at!==null&&c.id===a[a.length-1]?.id&&o.push({timestamp:t.paused_at,type:"step.paused",stepId:d})}let l=e.listSessionEvents(t.id);for(let c of l){let d=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)})(),u=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{}o.push({timestamp:u,type:"message",...d===void 0?{}:{stepId:d},payload:f})}if(t.terminal_state!==null){let c=t.terminal_state==="done"||t.terminal_state==="success"?"run.completed":t.terminal_state==="cancelled"||t.terminal_state==="aborted"?"run.cancelled":"run.failed";o.push({timestamp:t.ended_at??t.started_at,type:c,message:t.terminal_state})}return o.sort((c,d)=>c.timestamp.localeCompare(d.timestamp)),o.map((c,d)=>({id:`${i}:evt:${d+1}`,runId:i,sequence:d+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 cj(e){if(e.outcome===null)return"step.failed";let t=e.status_detail;return t==="failed"||t==="error"||t==="aborted"?"step.failed":"step.completed"}var Iw,En,Dd,se,Rw=T(()=>{"use strict";Xe();Xo();Ht();Iw="global-admin";En="template:",Dd="run:";se=class extends Error{status;constructor(t,r){super(r),this.status=t}}});import{mkdirSync as dj,writeFileSync as uj}from"node:fs";import{randomUUID as Lw}from"node:crypto";import{dirname as fj,resolve as Ko,sep as Ow}from"node:path";async function Cw(e,t){let r;try{r=await e.req.parseBody({all:!1})}catch{return e.text("invalid multipart body",400)}let n=r.image;if(!gj(n))return e.text("missing image file",400);if(n.size>mj)return e.text("upload too large",413);let s=Buffer.from(await n.arrayBuffer()),i=yj(s);if(i===null||!(i in $w))return e.text("unsupported upload MIME type",415);if(n.type.length>0&&n.type!==i)return e.text("upload MIME type does not match file content",415);let o=pj(t,r.project);if(typeof o=="string")return e.text(o,404);let a=o===null?Ko(hj()):Ko(o.local_path),l=Ko(a,"uploads",Lw()),c=Ko(l,`${Lw()}${$w[i]}`);if(!_j(c,a))return e.text("invalid upload path",400);dj(l,{recursive:!0});let d=new Uint8Array(s.buffer,s.byteOffset,s.byteLength);uj(c,d);let u={path:c,size:s.byteLength,mime:i,project:o?.name??null};return e.json(u)}function pj(e,t){return t==null||t===""?null:typeof t!="string"?"invalid project":e.findProjectByName(t)??`project not found: ${t}`}function _j(e,t){let r=t.endsWith(Ow)?t:`${t}${Ow}`;return e.startsWith(r)}function hj(){return fj(le())}function gj(e){return typeof File<"u"&&e instanceof File}function yj(e){return e.length>=8&&e[0]===137&&e[1]===80&&e[2]===78&&e[3]===71&&e[4]===13&&e[5]===10&&e[6]===26&&e[7]===10?"image/png":e.length>=3&&e[0]===255&&e[1]===216&&e[2]===255?"image/jpeg":e.length>=12&&e.subarray(0,4).toString("ascii")==="RIFF"&&e.subarray(8,12).toString("ascii")==="WEBP"?"image/webp":e.length>=12&&e.subarray(4,8).toString("ascii")==="ftyp"&&["heic","heix","hevc","hevx","mif1","msf1"].includes(e.subarray(8,12).toString("ascii"))?"image/heic":e.length>=5&&e.subarray(0,5).toString("ascii")==="%PDF-"?"application/pdf":null}var mj,$w,Mw=T(()=>{"use strict";Xe();mj=10*1024*1024,$w={"image/png":".png","image/jpeg":".jpg","image/webp":".webp","image/heic":".heic","application/pdf":".pdf"}});import{existsSync as Yo}from"node:fs";import{basename as wj,dirname as Ej,extname as Tj,isAbsolute as bj,join as Sj,relative as vj}from"node:path";import{fileURLToPath as kj}from"node:url";import{Hono as Ij}from"hono";import{serveStatic as Nt}from"@hono/node-server/serve-static";function Bw(e){let t=new Ij,r=[],n=e.localWebui!==void 0?qd(e.localWebui.webuiDir):Nj();if(e.localWebui!==void 0&&Gy(t,{s3:e.localWebui.localMailbox.s3,commands:e.localWebui.localMailbox.commands}),n!==null){let s=xj();e.localWebui!==void 0?t.get("/config.json",s,i=>i.json({workspaceFetchMode:"local-mailbox",localMailbox:{base:"/local-mailbox",userId:"local",deviceId:"local"},mailboxPolling:{readIntervalSeconds:1,heartbeatIdleSeconds:1,backoffReadIntervalSeconds:1}})):e.webuiRuntimeConfig!==void 0&&t.get("/config.json",s,i=>i.json(e.webuiRuntimeConfig)),t.use("/dist/*",s,Nt({root:n})),t.use("/vendor/*",s,Nt({root:n})),t.use("/src/*",s,Nt({root:n})),t.get("/",s,Nt({root:n,path:"index.html"})),t.get("/admin",s,Nt({root:n,path:"index.html"})),t.get("/admin/*",s,Nt({root:n,path:"index.html"})),t.get("/terminal",s,Nt({root:n,path:"index.html"})),t.get("/terminal/*",s,Nt({root:n,path:"index.html"})),t.get("/chat",s,Nt({root:n,path:"index.html"})),t.get("/chat/*",s,Nt({root:n,path:"index.html"}))}else t.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 t.use("*",Sh()),t.get("/login",s=>s.html(Re("Login",`
|
|
1959
1959
|
<h1>Login</h1>
|
|
1960
1960
|
<form method="post" action="/login">
|
|
1961
1961
|
<label>Token <input name="token" type="password"></label>
|
|
1962
1962
|
<button type="submit">Login</button>
|
|
1963
1963
|
</form>
|
|
1964
|
-
`))),t.post("/login",async s=>{let i=await s.req.parseBody(),o=typeof i.token=="string"?i.token:"";return kh(o)?(Gc(s,o),s.redirect("/",302)):s.html(Re("Login","<p>Invalid token</p>"),401)}),t.post("/logout",s=>(Ih(s),s.redirect("/login",302))),Oy(t,{dal:e.dal}),Nw(t,{dal:e.dal}),Ky(t,{dal:e.dal}),ow(t,{terminalSessionManager:e.terminalSessionManager}),fw(t,{persistentSessionManager:e.persistentSessionManager}),t.post("/api/teams/:team_name/refresh",async s=>{let i=is(s.req.param("team_name")),o=e.dal.findTeamByName(i);if(o===null)return s.notFound();let a=[],c=e.dal.db.transaction(()=>{let f=e.dal.listTeamMembers(o.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)e.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 d=[],u=[];for(let f of a)try{await gc(e.dal,i,f.alias),e.dal.setMemberState(f.id,"idle",null),d.push(f.alias)}catch(m){let p=m instanceof Error?m.message:String(m);e.dal.setMemberState(f.id,"attention_needed",`refresh failed: ${p}`),u.push({alias:f.alias,error:p})}return D(s,{team:i,seeded:d,failed:u},f=>`<p>refreshed team ${b(f.team)}: seeded [${f.seeded.map(m=>b(m)).join(", ")}]${f.failed.length>0?` failed [${f.failed.map(m=>`${b(m.alias)}: ${b(m.error)}`).join(", ")}]`:""}</p>`)}),$h(t,{dal:e.dal}),Uh(t,{dal:e.dal}),t.get("/api/status",s=>D(s,Pi(e.dal),Mj)),t.get("/api/projects",s=>D(s,Fi(e.dal),jj)),t.get("/api/teams",s=>D(s,b_(e.dal),Fj)),t.get("/api/workflows",s=>D(s,Ui(e.dal),Uj)),t.get("/api/workflows/verify",s=>{let i=hy();return s.req.header("accept")?.includes("text/plain")?s.text(yy(i)):s.json(i)}),t.get("/api/jobs",s=>D(s,S_(e.dal,{status:s.req.query("status")}),Wj)),t.post("/api/uploads",s=>Cw(s,e.dal)),t.get("/api/jobs/:id",s=>{let i=Wi(e.dal,ee(s,"id"));return i===null?s.notFound():D(s,i,de)}),t.post("/api/jobs",async s=>{let i;try{i=await s.req.json()}catch{return s.text("invalid JSON body",400)}let o=null;if(typeof i.project_id=="number")o=i.project_id;else if(typeof i.project=="string"){let f=e.dal.findProjectByName(i.project);if(f===null)return s.text(`project not found: ${i.project}`,404);o=f.id}else{let f=e.dal.listProjects();f.length===1&&(o=f[0].id)}if(o===null)return s.text("missing project or project_id",400);let a=typeof i.workflow_id_override=="number"?i.workflow_id_override:null;if(a===null&&typeof i.workflow=="string"){let f=e.dal.getWorkflowByName(i.workflow);if(f===null)return s.text(`workflow not found: ${i.workflow}`,404);a=f.id}let l=typeof i.source=="string"?i.source:"manual",c=i.payload,d=c==null?null:typeof c=="string"?c:JSON.stringify(c),u=e.dal.enqueueJob({project_id:o,workflow_id_override:a,source:l,source_ref:typeof i.source_ref=="string"?i.source_ref:null,payload:d,priority:typeof i.priority=="number"?i.priority:0,dedupe_key:typeof i.dedupe_key=="string"?i.dedupe_key:null});return D(s,u,de)}),t.post("/api/jobs/:id/run",async s=>{let{runJobById:i}=await Promise.resolve().then(()=>(Ro(),xy)),o=Wi(e.dal,ee(s,"id"));if(o===null)return s.notFound();let a=await i({dal:e.dal,worker_id:`api-job-run-${process.pid}-${Date.now()}`,job_id:o.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)}),t.get("/api/workflows/:name",s=>{let i=e.dal.getWorkflowByName(s.req.param("name"));return i===null?s.notFound():D(s,i,de)}),t.get("/api/projects/:name/workflows",s=>{let i=e.dal.findProjectByName(s.req.param("name"));return i===null?s.notFound():D(s,e.dal.listProjectWorkflows(i.id),Dj)}),t.post("/api/projects/:name/workflows",async s=>{let i=e.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=await Tn(s);if(typeof o=="string")return s.text(o,400);let a=typeof o.workflow=="string"?o.workflow:null,l=typeof o.workflow_id=="number"?o.workflow_id:null,c=l!==null?e.dal.getWorkflow(l):a!==null?e.dal.getWorkflowByName(a):null;if(c===null)return s.text("workflow not found",404);let d=typeof o.condition=="string"&&o.condition.length>0?o.condition:null;if(d!==null)try{an(d)}catch{return s.text("invalid condition",400)}let u=Lj(o.parameters_override??o.params);if(typeof u=="string"&&u.startsWith("error:"))return s.text(u.slice(6),400);let f=typeof o.priority=="number"&&Number.isInteger(o.priority)?o.priority:100,m=e.dal.insertProjectWorkflow({project_id:i.id,workflow_id:c.id,condition:d,parameters_override:u,priority:f});return D(s,m,de)}),t.get("/api/projects/workflows/:id",s=>{let i=e.dal.getProjectWorkflow(ee(s,"id"));return i===null?s.notFound():D(s,i,de)}),t.delete("/api/projects/workflows/:id",s=>e.dal.removeProjectWorkflow(ee(s,"id"))?D(s,{removed:!0},de):s.notFound()),t.post("/api/projects/workflows/:id/enable",s=>{let i=e.dal.setProjectWorkflowEnabled(ee(s,"id"),!0);return i===null?s.notFound():D(s,i,de)}),t.post("/api/projects/workflows/:id/disable",s=>{let i=e.dal.setProjectWorkflowEnabled(ee(s,"id"),!1);return i===null?s.notFound():D(s,i,de)}),t.get("/api/projects/:name/issues",s=>{let i=e.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=Dw(s.req.query("status"),Oj);if(typeof o=="string")return s.text(o,400);let a=Dw(s.req.query("severity"),Hw);return typeof a=="string"?s.text(a,400):D(s,e.dal.listIssues(i.id,{...o!==void 0?{status:o}:{},...a!==void 0?{severity:a}:{},...s.req.query("ai_test_path")!==void 0?{ai_test_path:s.req.query("ai_test_path")}:{}}),Pj)}),t.post("/api/projects/:name/issues",async s=>{let i=e.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=await Tn(s);if(typeof o=="string")return s.text(o,400);let a=typeof o.title=="string"&&o.title.trim().length>0?o.title:null,l=typeof o.body=="string"?o.body:null;if(a===null||l===null)return s.text("missing title or body",400);let c=$j(o.severity);if(typeof c=="object")return s.text(c.error,400);let d=Cj(o.labels);if(typeof d=="string"&&d.startsWith("error:"))return s.text(d.slice(6),400);let u=e.dal.createIssue({project_id:i.id,title:a,body:l,...c!==void 0?{severity:c}:{},labels:d,ai_test_path:typeof o.ai_test_path=="string"?o.ai_test_path:null,source_run_id:typeof o.source_run_id=="number"?o.source_run_id:null});return D(s,u,de)}),t.get("/api/issues/:id",s=>{let i=e.dal.getIssue(ee(s,"id"));return i===null?s.notFound():D(s,i,de)}),t.post("/api/issues/:id/claim",async s=>{let i=ee(s,"id"),o=e.dal.getIssue(i);if(o===null)return s.notFound();let a=await Tn(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=e.dal.claimIssue(i,l);return c===null?s.json({error:`issue ${i} is not in a claimable state (status=${o.status})`},400):D(s,c,de)}),t.post("/api/projects/:name/issues/claim-next",async s=>{let i=e.dal.findProjectByName(s.req.param("name"));if(i===null)return s.json({error:"project_not_found"},404);let o=await Tn(s);if(typeof o=="string")return s.json({error:o},400);let a=typeof o.assigned_run_id=="number"?o.assigned_run_id:null;if(a===null)return s.json({error:"missing assigned_run_id"},400);let l=e.dal.claimNextIssue(i.id,a);return l===null?s.json({status:"queue_empty"},404):D(s,l,de)}),t.post("/api/issues/:id/close",async s=>{let i=e.dal.getIssue(ee(s,"id"));if(i===null)return s.notFound();let o=await Tn(s);if(typeof o=="string")return s.json({error:o},400);let a=typeof o.closed_run_id=="number"?o.closed_run_id:i.assigned_run_id;if(a===null)return s.json({error:"missing closed_run_id"},400);try{return D(s,e.dal.closeIssue(ee(s,"id"),a,typeof o.commit_hash=="string"?o.commit_hash:null),de)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),t.post("/api/issues/:id/reopen",async s=>{let i=e.dal.getIssue(ee(s,"id"));if(i===null)return s.notFound();let o=await Tn(s);if(typeof o=="string")return s.json({error:o},400);let a=typeof o.source_run_id=="number"?o.source_run_id:i.closed_run_id??i.source_run_id;if(a===null)return s.json({error:"missing source_run_id"},400);try{return D(s,e.dal.reopenIssue(ee(s,"id"),a),de)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),t.get("/api/projects/:name",s=>{let i=e.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=i.name.indexOf("/"),a=o>0?i.name.slice(0,o):null,l=o>0?i.name.slice(o+1):i.name;return D(s,{...i,owner:a,repo:l},de)}),t.get("/api/runs/:run_id/artifacts",s=>{let i=ee(s,"run_id"),o=s.req.query("kind"),a=Lr(e.dal,i,o);return D(s,a,de)}),t.get("/api/runs/:run_id/artifacts/:kind",async s=>{let i=ee(s,"run_id"),o=s.req.param("kind"),a=Lr(e.dal,i,o);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):D(s,l,de);if(l.path!==null&&l.path!==void 0){if(c)try{let{readFileSync:d}=await import("node:fs"),u=Aj(l.path);if(Rj(u)){let _=d(l.path,"utf8");return s.body(_,200,{"Content-Type":u})}let f=d(l.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength),p=wj(l.path);return s.body(m,200,{"Content-Type":u,"Content-Disposition":`attachment; filename="${p}"`})}catch(d){return s.text(`failed to read artifact path: ${d.message}`,500)}return D(s,l,de)}return D(s,l,de)}),t.get("/api/runs",s=>D(s,sn(e.dal,{limit:Bd(s,"limit")??100}),Bj)),t.get("/api/runs/:id",s=>{let i=Rr(e.dal,ee(s,"id"));return i===null?s.notFound():D(s,i,qj)}),t.get("/api/runs/:id/where",s=>{let i=on(e.dal,ee(s,"id"));return i===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(qi(i)):s.json(i)}),t.get("/api/runs/:id/timeline",s=>{let i=Hi(e.dal,ee(s,"id"));return i===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Ji(i)):s.json(i)}),t.post("/api/runs/:id/resume",async s=>{let i=s.req.query("outcome");if(i===void 0||i.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&&(i=c)}}if(i===void 0||i.length===0)return s.text("missing outcome",400);let o=e.dal.resumeRun(ee(s,"id"),i);return!o.resumed&&o.reason==="run_not_found"?s.notFound():o.resumed?(Yo(e.daemon),D(s,o,Pw)):D(s,o,Pw,400)}),t.post("/api/interactive/:step_id/respond",async s=>{let i=ee(s,"step_id"),o,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let d=await s.req.json();typeof d.input=="string"&&(o=d.input),d.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let d=await s.req.parseBody().catch(()=>({}));typeof d.input=="string"&&(o=d.input),(d.done==="true"||d.done===!0)&&(a=!0)}if(o===void 0)return s.text("missing input",400);let c=e.dal.resumeInteractive(i,o,a);return!c.resumed&&c.reason==="not_found"?s.notFound():c.resumed?(Yo(e.daemon),s.json({resumed:!0,session_status:c.session.status})):s.json({resumed:!1,reason:c.reason},400)}),t.get("/api/runs/:id/steps/:step_id",s=>jw(s,e.dal,i=>D(s,i,Jj))),t.get("/api/runs/:id/steps/:step_id/transcript",s=>{let i=N_(e.dal,ee(s,"id"),ee(s,"step_id"));return i===null?s.notFound():qw(s)?s.html(`<pre>${b(i)}</pre>`):s.req.header("accept")?.includes("text/plain")?s.text(i):s.json({transcript:i})}),t.get("/api/runs/:id/steps/:step_id/messages",s=>jw(s,e.dal,i=>{let o=_w(i);return D(s,o,a=>me(["role","text"],a.map(l=>[b(l.role),b(l.text)])))})),t.get("/api/external-objects",s=>D(s,x_(e.dal,{type:s.req.query("type")}),Xj)),t.get("/api/external-signals",s=>D(s,A_(e.dal,{unhandled:s.req.query("unhandled")==="true"}),Gj)),t.get("/api/attentions",s=>D(s,cr(e.dal,{unacked:s.req.query("unacked")==="true"}),Vj)),t.post("/api/attentions/:id/ack",s=>{let i=e.dal.acknowledgeAttention(ee(s,"id"));return i===null?s.notFound():D(s,i,o=>`<p>acknowledged attention ${b(o.id)}</p>`)}),t.get("/api/escalations",s=>{let i=s.req.query("project"),o=s.req.query("all")==="true",a=s.req.query("since"),l={all:o};i!==void 0&&(l.project=i),a!==void 0&&(l.since=a);let c=Bi(e.dal,l);return D(s,c,d=>`<h1>Escalations</h1>${me(["attention_id","project","run","workflow","state","prompt"],d.map(u=>[b(u.attention_id),b(u.project),b(u.run_id),b(u.workflow_name),b(u.state_name),b((u.prompt??"").slice(0,120))]))}`)}),t.get("/api/escalations/:id",s=>{let i=kt(e.dal,ee(s,"id"));return i===null?s.notFound():D(s,i,de)}),t.post("/api/escalations/:id/respond",async s=>{let i=ee(s,"id"),o,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let m=await s.req.json();typeof m.input=="string"&&(o=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"&&(o=m.input),(m.done==="true"||m.done===!0)&&(a=!0)}if(o===void 0)return s.text("missing input",400);let c=kt(e.dal,i);if(c===null)return s.notFound();let d=cr(e.dal).find(m=>m.id===i);if(d===void 0)return s.notFound();if(d.kind==="workflow_escalation"){let m=e.dal.resumeEscalation(i,o);if(!m.resumed)return s.json({ok:!1,reason:m.reason},400);Yo(e.daemon);let p=cr(e.dal).find(_=>_.id===i);return s.json({ok:!0,attention_id:i,run_id:m.run.id,decision:o,session_status:"escalation_resumed",acknowledged_at:p?.acknowledged_at??null})}if(d.kind!=="interactive_waiting_operator")return s.json({ok:!1,reason:"wrong_kind",kind:d.kind},400);if(d.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 u=e.dal.resumeInteractive(c.step_id,o,a);if(!u.resumed)return s.json({ok:!1,reason:u.reason,step_id:c.step_id},400);let f=e.dal.acknowledgeAttention(i);return Yo(e.daemon),s.json({ok:!0,attention_id:i,step_id:c.step_id,session_status:u.session.status,acknowledged_at:f?.acknowledged_at??null})}),t.get("/api/submitted-prs",s=>{let i=s.req.query("pr_url"),o=s.req.query("status"),a=v_(e.dal,{status:o,pr_url:i});return D(s,a,Kj)}),t.get("/api/submitted-prs/:id",s=>{let i=ee(s,"id"),o=k_(e.dal,i);return o===null?s.notFound():D(s,o,Yj)}),t.get("/api/sessions",s=>D(s,e.dal.latestSessionSizes(),Fw)),t.get("/api/sessions/:team_name/:alias/history",s=>{let i=is(s.req.param("team_name"));return D(s,e.dal.sessionSizeHistory(i,s.req.param("alias")),Fw)}),t.post("/api/sessions/:team_name/:alias/compact",async s=>{let i=is(s.req.param("team_name"));try{let o=await __(e.dal,i,s.req.param("alias"));return D(s,o,a=>Uw("compacted",a.row))}catch(o){if(o instanceof ss)return s.text(o.message,409);throw o}}),t.post("/api/sessions/:team_name/:alias/refresh",async s=>{let i=is(s.req.param("team_name")),o=await gc(e.dal,i,s.req.param("alias"));return D(s,o,a=>Uw(`refreshed ${a.sessionid}`,a.row))}),t.get("/api/intake/state",s=>D(s,r,Ww)),t.post("/api/intake/scan",async s=>(r=await ao(e.dal),D(s,r,Ww))),t.get("/api/stats/run-throughput",s=>D(s,O_(e.dal),zj)),t.get("/api/daemon/state",s=>D(s,e.daemon?.state??null,Zj)),t.post("/api/daemon/cycle",async s=>{if(e.daemon===void 0)return D(s,{disabled:!0},de);let i=await e.daemon.runCycle();return D(s,{state:e.daemon.state,result:i},de)}),t.get("/metrics/:project_id",s=>{let i=ee(s,"project_id"),o=e.dal.getProject(i);if(o===null)return s.notFound();let a=vc(e.dal,i),l=kc(e.dal,{project_id:i});return s.html(Re(`Metrics \u2014 ${o.name}`,Qj(o.name,a,l)))}),t.get("/api/metrics/reviewer/:project_id",s=>{let i=ee(s,"project_id");if(e.dal.getProject(i)===null)return s.notFound();let o=Bd(s,"since_days");return s.json(vc(e.dal,i,o))}),t.get("/api/metrics/tools/:project_id",s=>{let i=ee(s,"project_id");if(e.dal.getProject(i)===null)return s.notFound();let o=Bd(s,"since_days");return s.json(kc(e.dal,{project_id:i,since_days:o}))}),t.post("/api/drift/:id/ack",s=>{let i=e.dal.acknowledgeDriftSignal(ee(s,"id"));return i===null?s.notFound():s.json({id:i.id,acknowledged_at:i.acknowledged_at})}),t}function jw(e,t,r){let n=Sc(t,ee(e,"id"),ee(e,"step_id"));return n===null?e.notFound():r(n)}function Yo(e){e!==void 0&&e.runCycle().catch(()=>{})}function D(e,t,r,n=200){return qw(e)?n===200?e.html(r(t)):e.html(r(t),400):new Response(JSON.stringify(t),{status:n,headers:{"Content-Type":"application/json; charset=UTF-8"}})}function qw(e){let t=e.req.header("accept")??"";return t.includes("text/html")&&!t.includes("application/json")}function Nj(){let e=process.env.LMCTL_WEBUI_DIST;if(e!==void 0)return Ko(`${e}/index.html`)?qd(e):null;let t="src/serve/webui-dist";if(Ko(`${t}/index.html`))return t;let r="dist/serve/webui-dist";if(Ko(`${r}/index.html`))return r;let n=Sj(Ej(kj(import.meta.url)),"webui-dist");return Ko(`${n}/index.html`)?qd(n):null}function qd(e){if(!bj(e))return e;let t=vj(process.cwd(),e);return t.length===0?".":t}function xj(){return async(e,t)=>{await t(),e.header("Cache-Control","no-store")}}function ee(e,t){return Number(e.req.param(t))}function Bd(e,t){let r=e.req.query(t);if(r===void 0)return;let n=Number(r);return Number.isInteger(n)&&n>0?n:void 0}function Aj(e){switch(Tj(e).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 Rj(e){return!!(e.startsWith("text/")||e.startsWith("application/json")||e.startsWith("application/xml"))}async function Tn(e){try{let t=await e.req.json();return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:"invalid JSON body"}catch{return"invalid JSON body"}}function Lj(e){if(e==null)return null;if(typeof e=="string"){try{let t=JSON.parse(e);if(t!==null&&typeof t=="object"&&!Array.isArray(t))return JSON.stringify(t)}catch{return"error:invalid parameters_override JSON"}return"error:parameters_override must be a JSON object"}return typeof e=="object"&&!Array.isArray(e)?JSON.stringify(e):"error:parameters_override must be a JSON object"}function Dw(e,t){if(e===void 0||e.length===0)return;let r=e.split(",").map(n=>n.trim()).filter(n=>n.length>0);if(r.length!==0){for(let n of r)if(!t.includes(n))return`invalid value: ${n}`;return r}}function $j(e){if(e!=null)return typeof e=="string"&&Hw.includes(e)?e:{error:`invalid severity: ${String(e)}`}}function Cj(e){if(e==null)return null;if(typeof e=="string")try{let t=JSON.parse(e);return Array.isArray(t)&&t.every(r=>typeof r=="string")?JSON.stringify(t):"error:labels must be a JSON string array"}catch{return"error:invalid labels JSON"}return Array.isArray(e)&&e.every(t=>typeof t=="string")?JSON.stringify(e):"error:labels must be a JSON string array"}function Mj(e){return`<h1>Status</h1><div class="grid">
|
|
1964
|
+
`))),t.post("/login",async s=>{let i=await s.req.parseBody(),o=typeof i.token=="string"?i.token:"";return kh(o)?(Gc(s,o),s.redirect("/",302)):s.html(Re("Login","<p>Invalid token</p>"),401)}),t.post("/logout",s=>(Ih(s),s.redirect("/login",302))),Oy(t,{dal:e.dal}),Nw(t,{dal:e.dal}),Ky(t,{dal:e.dal}),ow(t,{terminalSessionManager:e.terminalSessionManager}),fw(t,{persistentSessionManager:e.persistentSessionManager}),t.post("/api/teams/:team_name/refresh",async s=>{let i=is(s.req.param("team_name")),o=e.dal.findTeamByName(i);if(o===null)return s.notFound();let a=[],c=e.dal.db.transaction(()=>{let f=e.dal.listTeamMembers(o.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)e.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 d=[],u=[];for(let f of a)try{await gc(e.dal,i,f.alias),e.dal.setMemberState(f.id,"idle",null),d.push(f.alias)}catch(m){let p=m instanceof Error?m.message:String(m);e.dal.setMemberState(f.id,"attention_needed",`refresh failed: ${p}`),u.push({alias:f.alias,error:p})}return D(s,{team:i,seeded:d,failed:u},f=>`<p>refreshed team ${b(f.team)}: seeded [${f.seeded.map(m=>b(m)).join(", ")}]${f.failed.length>0?` failed [${f.failed.map(m=>`${b(m.alias)}: ${b(m.error)}`).join(", ")}]`:""}</p>`)}),$h(t,{dal:e.dal}),Uh(t,{dal:e.dal}),t.get("/api/status",s=>D(s,Fi(e.dal),Mj)),t.get("/api/projects",s=>D(s,Ui(e.dal),jj)),t.get("/api/teams",s=>D(s,b_(e.dal),Fj)),t.get("/api/workflows",s=>D(s,Wi(e.dal),Uj)),t.get("/api/workflows/verify",s=>{let i=hy();return s.req.header("accept")?.includes("text/plain")?s.text(yy(i)):s.json(i)}),t.get("/api/jobs",s=>D(s,S_(e.dal,{status:s.req.query("status")}),Wj)),t.post("/api/uploads",s=>Cw(s,e.dal)),t.get("/api/jobs/:id",s=>{let i=Bi(e.dal,ee(s,"id"));return i===null?s.notFound():D(s,i,de)}),t.post("/api/jobs",async s=>{let i;try{i=await s.req.json()}catch{return s.text("invalid JSON body",400)}let o=null;if(typeof i.project_id=="number")o=i.project_id;else if(typeof i.project=="string"){let f=e.dal.findProjectByName(i.project);if(f===null)return s.text(`project not found: ${i.project}`,404);o=f.id}else{let f=e.dal.listProjects();f.length===1&&(o=f[0].id)}if(o===null)return s.text("missing project or project_id",400);let a=typeof i.workflow_id_override=="number"?i.workflow_id_override:null;if(a===null&&typeof i.workflow=="string"){let f=e.dal.getWorkflowByName(i.workflow);if(f===null)return s.text(`workflow not found: ${i.workflow}`,404);a=f.id}let l=typeof i.source=="string"?i.source:"manual",c=i.payload,d=c==null?null:typeof c=="string"?c:JSON.stringify(c),u=e.dal.enqueueJob({project_id:o,workflow_id_override:a,source:l,source_ref:typeof i.source_ref=="string"?i.source_ref:null,payload:d,priority:typeof i.priority=="number"?i.priority:0,dedupe_key:typeof i.dedupe_key=="string"?i.dedupe_key:null});return D(s,u,de)}),t.post("/api/jobs/:id/run",async s=>{let{runJobById:i}=await Promise.resolve().then(()=>(Lo(),xy)),o=Bi(e.dal,ee(s,"id"));if(o===null)return s.notFound();let a=await i({dal:e.dal,worker_id:`api-job-run-${process.pid}-${Date.now()}`,job_id:o.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)}),t.get("/api/workflows/:name",s=>{let i=e.dal.getWorkflowByName(s.req.param("name"));return i===null?s.notFound():D(s,i,de)}),t.get("/api/projects/:name/workflows",s=>{let i=e.dal.findProjectByName(s.req.param("name"));return i===null?s.notFound():D(s,e.dal.listProjectWorkflows(i.id),Dj)}),t.post("/api/projects/:name/workflows",async s=>{let i=e.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=await Tn(s);if(typeof o=="string")return s.text(o,400);let a=typeof o.workflow=="string"?o.workflow:null,l=typeof o.workflow_id=="number"?o.workflow_id:null,c=l!==null?e.dal.getWorkflow(l):a!==null?e.dal.getWorkflowByName(a):null;if(c===null)return s.text("workflow not found",404);let d=typeof o.condition=="string"&&o.condition.length>0?o.condition:null;if(d!==null)try{an(d)}catch{return s.text("invalid condition",400)}let u=Lj(o.parameters_override??o.params);if(typeof u=="string"&&u.startsWith("error:"))return s.text(u.slice(6),400);let f=typeof o.priority=="number"&&Number.isInteger(o.priority)?o.priority:100,m=e.dal.insertProjectWorkflow({project_id:i.id,workflow_id:c.id,condition:d,parameters_override:u,priority:f});return D(s,m,de)}),t.get("/api/projects/workflows/:id",s=>{let i=e.dal.getProjectWorkflow(ee(s,"id"));return i===null?s.notFound():D(s,i,de)}),t.delete("/api/projects/workflows/:id",s=>e.dal.removeProjectWorkflow(ee(s,"id"))?D(s,{removed:!0},de):s.notFound()),t.post("/api/projects/workflows/:id/enable",s=>{let i=e.dal.setProjectWorkflowEnabled(ee(s,"id"),!0);return i===null?s.notFound():D(s,i,de)}),t.post("/api/projects/workflows/:id/disable",s=>{let i=e.dal.setProjectWorkflowEnabled(ee(s,"id"),!1);return i===null?s.notFound():D(s,i,de)}),t.get("/api/projects/:name/issues",s=>{let i=e.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=Dw(s.req.query("status"),Oj);if(typeof o=="string")return s.text(o,400);let a=Dw(s.req.query("severity"),Hw);return typeof a=="string"?s.text(a,400):D(s,e.dal.listIssues(i.id,{...o!==void 0?{status:o}:{},...a!==void 0?{severity:a}:{},...s.req.query("ai_test_path")!==void 0?{ai_test_path:s.req.query("ai_test_path")}:{}}),Pj)}),t.post("/api/projects/:name/issues",async s=>{let i=e.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=await Tn(s);if(typeof o=="string")return s.text(o,400);let a=typeof o.title=="string"&&o.title.trim().length>0?o.title:null,l=typeof o.body=="string"?o.body:null;if(a===null||l===null)return s.text("missing title or body",400);let c=$j(o.severity);if(typeof c=="object")return s.text(c.error,400);let d=Cj(o.labels);if(typeof d=="string"&&d.startsWith("error:"))return s.text(d.slice(6),400);let u=e.dal.createIssue({project_id:i.id,title:a,body:l,...c!==void 0?{severity:c}:{},labels:d,ai_test_path:typeof o.ai_test_path=="string"?o.ai_test_path:null,source_run_id:typeof o.source_run_id=="number"?o.source_run_id:null});return D(s,u,de)}),t.get("/api/issues/:id",s=>{let i=e.dal.getIssue(ee(s,"id"));return i===null?s.notFound():D(s,i,de)}),t.post("/api/issues/:id/claim",async s=>{let i=ee(s,"id"),o=e.dal.getIssue(i);if(o===null)return s.notFound();let a=await Tn(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=e.dal.claimIssue(i,l);return c===null?s.json({error:`issue ${i} is not in a claimable state (status=${o.status})`},400):D(s,c,de)}),t.post("/api/projects/:name/issues/claim-next",async s=>{let i=e.dal.findProjectByName(s.req.param("name"));if(i===null)return s.json({error:"project_not_found"},404);let o=await Tn(s);if(typeof o=="string")return s.json({error:o},400);let a=typeof o.assigned_run_id=="number"?o.assigned_run_id:null;if(a===null)return s.json({error:"missing assigned_run_id"},400);let l=e.dal.claimNextIssue(i.id,a);return l===null?s.json({status:"queue_empty"},404):D(s,l,de)}),t.post("/api/issues/:id/close",async s=>{let i=e.dal.getIssue(ee(s,"id"));if(i===null)return s.notFound();let o=await Tn(s);if(typeof o=="string")return s.json({error:o},400);let a=typeof o.closed_run_id=="number"?o.closed_run_id:i.assigned_run_id;if(a===null)return s.json({error:"missing closed_run_id"},400);try{return D(s,e.dal.closeIssue(ee(s,"id"),a,typeof o.commit_hash=="string"?o.commit_hash:null),de)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),t.post("/api/issues/:id/reopen",async s=>{let i=e.dal.getIssue(ee(s,"id"));if(i===null)return s.notFound();let o=await Tn(s);if(typeof o=="string")return s.json({error:o},400);let a=typeof o.source_run_id=="number"?o.source_run_id:i.closed_run_id??i.source_run_id;if(a===null)return s.json({error:"missing source_run_id"},400);try{return D(s,e.dal.reopenIssue(ee(s,"id"),a),de)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),t.get("/api/projects/:name",s=>{let i=e.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=i.name.indexOf("/"),a=o>0?i.name.slice(0,o):null,l=o>0?i.name.slice(o+1):i.name;return D(s,{...i,owner:a,repo:l},de)}),t.get("/api/runs/:run_id/artifacts",s=>{let i=ee(s,"run_id"),o=s.req.query("kind"),a=Lr(e.dal,i,o);return D(s,a,de)}),t.get("/api/runs/:run_id/artifacts/:kind",async s=>{let i=ee(s,"run_id"),o=s.req.param("kind"),a=Lr(e.dal,i,o);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):D(s,l,de);if(l.path!==null&&l.path!==void 0){if(c)try{let{readFileSync:d}=await import("node:fs"),u=Aj(l.path);if(Rj(u)){let _=d(l.path,"utf8");return s.body(_,200,{"Content-Type":u})}let f=d(l.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength),p=wj(l.path);return s.body(m,200,{"Content-Type":u,"Content-Disposition":`attachment; filename="${p}"`})}catch(d){return s.text(`failed to read artifact path: ${d.message}`,500)}return D(s,l,de)}return D(s,l,de)}),t.get("/api/runs",s=>D(s,sn(e.dal,{limit:Bd(s,"limit")??100}),Bj)),t.get("/api/runs/:id",s=>{let i=Rr(e.dal,ee(s,"id"));return i===null?s.notFound():D(s,i,qj)}),t.get("/api/runs/:id/where",s=>{let i=on(e.dal,ee(s,"id"));return i===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Hi(i)):s.json(i)}),t.get("/api/runs/:id/timeline",s=>{let i=Ji(e.dal,ee(s,"id"));return i===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Xi(i)):s.json(i)}),t.post("/api/runs/:id/resume",async s=>{let i=s.req.query("outcome");if(i===void 0||i.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&&(i=c)}}if(i===void 0||i.length===0)return s.text("missing outcome",400);let o=e.dal.resumeRun(ee(s,"id"),i);return!o.resumed&&o.reason==="run_not_found"?s.notFound():o.resumed?(zo(e.daemon),D(s,o,Pw)):D(s,o,Pw,400)}),t.post("/api/interactive/:step_id/respond",async s=>{let i=ee(s,"step_id"),o,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let d=await s.req.json();typeof d.input=="string"&&(o=d.input),d.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let d=await s.req.parseBody().catch(()=>({}));typeof d.input=="string"&&(o=d.input),(d.done==="true"||d.done===!0)&&(a=!0)}if(o===void 0)return s.text("missing input",400);let c=e.dal.resumeInteractive(i,o,a);return!c.resumed&&c.reason==="not_found"?s.notFound():c.resumed?(zo(e.daemon),s.json({resumed:!0,session_status:c.session.status})):s.json({resumed:!1,reason:c.reason},400)}),t.get("/api/runs/:id/steps/:step_id",s=>jw(s,e.dal,i=>D(s,i,Jj))),t.get("/api/runs/:id/steps/:step_id/transcript",s=>{let i=N_(e.dal,ee(s,"id"),ee(s,"step_id"));return i===null?s.notFound():qw(s)?s.html(`<pre>${b(i)}</pre>`):s.req.header("accept")?.includes("text/plain")?s.text(i):s.json({transcript:i})}),t.get("/api/runs/:id/steps/:step_id/messages",s=>jw(s,e.dal,i=>{let o=_w(i);return D(s,o,a=>me(["role","text"],a.map(l=>[b(l.role),b(l.text)])))})),t.get("/api/external-objects",s=>D(s,x_(e.dal,{type:s.req.query("type")}),Xj)),t.get("/api/external-signals",s=>D(s,A_(e.dal,{unhandled:s.req.query("unhandled")==="true"}),Gj)),t.get("/api/attentions",s=>D(s,cr(e.dal,{unacked:s.req.query("unacked")==="true"}),Vj)),t.post("/api/attentions/:id/ack",s=>{let i=e.dal.acknowledgeAttention(ee(s,"id"));return i===null?s.notFound():D(s,i,o=>`<p>acknowledged attention ${b(o.id)}</p>`)}),t.get("/api/escalations",s=>{let i=s.req.query("project"),o=s.req.query("all")==="true",a=s.req.query("since"),l={all:o};i!==void 0&&(l.project=i),a!==void 0&&(l.since=a);let c=qi(e.dal,l);return D(s,c,d=>`<h1>Escalations</h1>${me(["attention_id","project","run","workflow","state","prompt"],d.map(u=>[b(u.attention_id),b(u.project),b(u.run_id),b(u.workflow_name),b(u.state_name),b((u.prompt??"").slice(0,120))]))}`)}),t.get("/api/escalations/:id",s=>{let i=kt(e.dal,ee(s,"id"));return i===null?s.notFound():D(s,i,de)}),t.post("/api/escalations/:id/respond",async s=>{let i=ee(s,"id"),o,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let m=await s.req.json();typeof m.input=="string"&&(o=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"&&(o=m.input),(m.done==="true"||m.done===!0)&&(a=!0)}if(o===void 0)return s.text("missing input",400);let c=kt(e.dal,i);if(c===null)return s.notFound();let d=cr(e.dal).find(m=>m.id===i);if(d===void 0)return s.notFound();if(d.kind==="workflow_escalation"){let m=e.dal.resumeEscalation(i,o);if(!m.resumed)return s.json({ok:!1,reason:m.reason},400);zo(e.daemon);let p=cr(e.dal).find(_=>_.id===i);return s.json({ok:!0,attention_id:i,run_id:m.run.id,decision:o,session_status:"escalation_resumed",acknowledged_at:p?.acknowledged_at??null})}if(d.kind!=="interactive_waiting_operator")return s.json({ok:!1,reason:"wrong_kind",kind:d.kind},400);if(d.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 u=e.dal.resumeInteractive(c.step_id,o,a);if(!u.resumed)return s.json({ok:!1,reason:u.reason,step_id:c.step_id},400);let f=e.dal.acknowledgeAttention(i);return zo(e.daemon),s.json({ok:!0,attention_id:i,step_id:c.step_id,session_status:u.session.status,acknowledged_at:f?.acknowledged_at??null})}),t.get("/api/submitted-prs",s=>{let i=s.req.query("pr_url"),o=s.req.query("status"),a=v_(e.dal,{status:o,pr_url:i});return D(s,a,Kj)}),t.get("/api/submitted-prs/:id",s=>{let i=ee(s,"id"),o=k_(e.dal,i);return o===null?s.notFound():D(s,o,Yj)}),t.get("/api/sessions",s=>D(s,e.dal.latestSessionSizes(),Fw)),t.get("/api/sessions/:team_name/:alias/history",s=>{let i=is(s.req.param("team_name"));return D(s,e.dal.sessionSizeHistory(i,s.req.param("alias")),Fw)}),t.post("/api/sessions/:team_name/:alias/compact",async s=>{let i=is(s.req.param("team_name"));try{let o=await __(e.dal,i,s.req.param("alias"));return D(s,o,a=>Uw("compacted",a.row))}catch(o){if(o instanceof ss)return s.text(o.message,409);throw o}}),t.post("/api/sessions/:team_name/:alias/refresh",async s=>{let i=is(s.req.param("team_name")),o=await gc(e.dal,i,s.req.param("alias"));return D(s,o,a=>Uw(`refreshed ${a.sessionid}`,a.row))}),t.get("/api/intake/state",s=>D(s,r,Ww)),t.post("/api/intake/scan",async s=>(r=await lo(e.dal),D(s,r,Ww))),t.get("/api/stats/run-throughput",s=>D(s,O_(e.dal),zj)),t.get("/api/daemon/state",s=>D(s,e.daemon?.state??null,Zj)),t.post("/api/daemon/cycle",async s=>{if(e.daemon===void 0)return D(s,{disabled:!0},de);let i=await e.daemon.runCycle();return D(s,{state:e.daemon.state,result:i},de)}),t.get("/metrics/:project_id",s=>{let i=ee(s,"project_id"),o=e.dal.getProject(i);if(o===null)return s.notFound();let a=vc(e.dal,i),l=kc(e.dal,{project_id:i});return s.html(Re(`Metrics \u2014 ${o.name}`,Qj(o.name,a,l)))}),t.get("/api/metrics/reviewer/:project_id",s=>{let i=ee(s,"project_id");if(e.dal.getProject(i)===null)return s.notFound();let o=Bd(s,"since_days");return s.json(vc(e.dal,i,o))}),t.get("/api/metrics/tools/:project_id",s=>{let i=ee(s,"project_id");if(e.dal.getProject(i)===null)return s.notFound();let o=Bd(s,"since_days");return s.json(kc(e.dal,{project_id:i,since_days:o}))}),t.post("/api/drift/:id/ack",s=>{let i=e.dal.acknowledgeDriftSignal(ee(s,"id"));return i===null?s.notFound():s.json({id:i.id,acknowledged_at:i.acknowledged_at})}),t}function jw(e,t,r){let n=Sc(t,ee(e,"id"),ee(e,"step_id"));return n===null?e.notFound():r(n)}function zo(e){e!==void 0&&e.runCycle().catch(()=>{})}function D(e,t,r,n=200){return qw(e)?n===200?e.html(r(t)):e.html(r(t),400):new Response(JSON.stringify(t),{status:n,headers:{"Content-Type":"application/json; charset=UTF-8"}})}function qw(e){let t=e.req.header("accept")??"";return t.includes("text/html")&&!t.includes("application/json")}function Nj(){let e=process.env.LMCTL_WEBUI_DIST;if(e!==void 0)return Yo(`${e}/index.html`)?qd(e):null;let t="src/serve/webui-dist";if(Yo(`${t}/index.html`))return t;let r="dist/serve/webui-dist";if(Yo(`${r}/index.html`))return r;let n=Sj(Ej(kj(import.meta.url)),"webui-dist");return Yo(`${n}/index.html`)?qd(n):null}function qd(e){if(!bj(e))return e;let t=vj(process.cwd(),e);return t.length===0?".":t}function xj(){return async(e,t)=>{await t(),e.header("Cache-Control","no-store")}}function ee(e,t){return Number(e.req.param(t))}function Bd(e,t){let r=e.req.query(t);if(r===void 0)return;let n=Number(r);return Number.isInteger(n)&&n>0?n:void 0}function Aj(e){switch(Tj(e).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 Rj(e){return!!(e.startsWith("text/")||e.startsWith("application/json")||e.startsWith("application/xml"))}async function Tn(e){try{let t=await e.req.json();return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:"invalid JSON body"}catch{return"invalid JSON body"}}function Lj(e){if(e==null)return null;if(typeof e=="string"){try{let t=JSON.parse(e);if(t!==null&&typeof t=="object"&&!Array.isArray(t))return JSON.stringify(t)}catch{return"error:invalid parameters_override JSON"}return"error:parameters_override must be a JSON object"}return typeof e=="object"&&!Array.isArray(e)?JSON.stringify(e):"error:parameters_override must be a JSON object"}function Dw(e,t){if(e===void 0||e.length===0)return;let r=e.split(",").map(n=>n.trim()).filter(n=>n.length>0);if(r.length!==0){for(let n of r)if(!t.includes(n))return`invalid value: ${n}`;return r}}function $j(e){if(e!=null)return typeof e=="string"&&Hw.includes(e)?e:{error:`invalid severity: ${String(e)}`}}function Cj(e){if(e==null)return null;if(typeof e=="string")try{let t=JSON.parse(e);return Array.isArray(t)&&t.every(r=>typeof r=="string")?JSON.stringify(t):"error:labels must be a JSON string array"}catch{return"error:invalid labels JSON"}return Array.isArray(e)&&e.every(t=>typeof t=="string")?JSON.stringify(e):"error:labels must be a JSON string array"}function Mj(e){return`<h1>Status</h1><div class="grid">
|
|
1965
1965
|
<div class="metric"><strong>${e.jobs.queued}</strong><br>queued jobs</div>
|
|
1966
1966
|
<div class="metric"><strong>${e.jobs.done}</strong><br>done jobs</div>
|
|
1967
1967
|
<div class="metric"><strong>${e.runs.active}</strong><br>active runs</div>
|
|
@@ -1995,7 +1995,7 @@ ${p.text}`,["approve","request_changes"],!0,s,t.writes_to_project_path===!0)));i
|
|
|
1995
1995
|
<dt>submitted_at</dt><dd>${b(e.submitted_at)}</dd>
|
|
1996
1996
|
<dt>last_scanned_at</dt><dd>${b(e.last_scanned_at??"\u2014")}</dd>
|
|
1997
1997
|
<dt>last_known_state</dt><dd>${b(e.last_known_state??"\u2014")}</dd>
|
|
1998
|
-
</dl>`}function Fw(e){return`<h1>Sessions</h1>${me(["team","alias","session","input","cache","output","total","observed","actions"],e.map(t=>{let r
|
|
1998
|
+
</dl>`}function Fw(e){return`<h1>Sessions</h1>${me(["team","alias","session","input","cache","output","total","observed","actions"],e.map(t=>{let r=Ci(t.team_name),n=encodeURIComponent(t.alias);return[b(t.team_name),b(t.alias),b(t.sessionid),b(t.input_tokens),b(t.cache_tokens),b(t.output_tokens),b(t.total_tokens),b(t.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 Uw(e,t){return t===null?`<span>${b(e)}</span>`:`<span>${b(e)} ${b(t.team_name)}/${b(t.alias)}</span>`}function zj(e){return`<h1>Run Throughput</h1>${me(["workflow","terminal","count"],e.map(t=>[b(t.workflow_name),b(t.terminal_state),b(t.count)]))}`}function Ww(e){return`<h1>Intake</h1><button hx-post="/api/intake/scan" hx-target="main" hx-swap="innerHTML">Scan now</button>${me(["project","scanned","new jobs","error"],e.map(t=>[b(t.project_name),b(t.scanned),b(t.new_jobs),b(t.error)]))}`}function Zj(e){return`<h1>Daemon</h1>${e===null?"<p>disabled</p>":`${de(e)}<button hx-post="/api/daemon/cycle" hx-target="main" hx-swap="beforeend">Run cycle now</button>`}`}function Qj(e,t,r){let n=t.request_changes_rate,s=n.by_state.map(l=>[b(l.state_name),b(l.total),b(l.request_changes),b(l.rate_pct)]),i=t.step_duration_histogram.map(l=>[b(l.state_name),b(l.lt_5min),b(l.btw_5_15min),b(l.btw_15_60min),b(l.gt_60min),b(l.no_end)]),o=t.retry_counts.map(l=>[b(l.state_name),b(l.retried_runs),b(l.avg_retries)]),a=r.map(l=>[b(l.tool_name),b(l.invocations),b(l.successes),b(l.hit_rate_pct),b(l.avg_latency_ms??"n/a"),b(l.p50_latency_ms??"n/a"),b(l.p95_latency_ms??"n/a")]);return`<h1>Metrics \u2014 ${b(e)}</h1>
|
|
1999
1999
|
<h2>Request-changes rate</h2>
|
|
2000
2000
|
<p>Total: ${b(n.request_changes)} of ${b(n.total)} steps (${b(n.rate_pct)})</p>
|
|
2001
2001
|
${me(["state","total steps","request_changes","rate"],s)}
|
|
@@ -2004,7 +2004,7 @@ ${p.text}`,["approve","request_changes"],!0,s,t.writes_to_project_path===!0)));i
|
|
|
2004
2004
|
<h2>Retry counts (runs with >1 attempt per state)</h2>
|
|
2005
2005
|
${me(["state","retried runs","avg attempts"],o)}
|
|
2006
2006
|
<h2>Tool efficacy</h2>
|
|
2007
|
-
${me(["tool","invocations","successes (status=ok)","hit rate","avg latency ms","p50 ms","p95 ms"],a)}`}var Oj,Hw,Jw=T(()=>{"use strict";qc();as();xh();Ch();Wh();Ht();Qc();Uy();Vy();ew();aw();mw();hw();Rw();
|
|
2007
|
+
${me(["tool","invocations","successes (status=ok)","hit rate","avg latency ms","p50 ms","p95 ms"],a)}`}var Oj,Hw,Jw=T(()=>{"use strict";qc();as();xh();Ch();Wh();Ht();Qc();Uy();Vy();ew();aw();mw();hw();Rw();Mi();Mw();xo();Oj=["open","assigned","closed","reopened"],Hw=["low","medium","high","critical"]});function eD(e){return Math.floor(e/6e4)*6e4}function tD(e){e.db.transaction(()=>{let t=e.getRollupCursor(),r=e.listSessionEventsSince(t);if(r.length!==0){for(let n of r)rD(e,n);e.setRollupCursor(r[r.length-1].id)}})()}function rD(e,t){let r=Date.now(),n=eD(t.timestamp_ms),s=n+6e4;if(t.kind==="tool_use"){e.addRollupValue({run_id:t.run_id,step_id:t.step_id,metric_kind:"tool_calls_count",value:1,bucket_start_ms:n,bucket_end_ms:s,updated_at:r});return}if(t.kind==="tool_result"){let i={};try{i=JSON.parse(t.payload)}catch{}let o=typeof i.elapsedMs=="number"&&i.elapsedMs>0?i.elapsedMs:0;o>0&&e.addRollupValue({run_id:t.run_id,step_id:t.step_id,metric_kind:"time_in_tool_use_ms",value:o,bucket_start_ms:n,bucket_end_ms:s,updated_at:r});return}if(t.kind==="text"){let i=Buffer.byteLength(t.payload,"utf8");e.addRollupValue({run_id:t.run_id,step_id:t.step_id,metric_kind:"message_delta_bytes",value:i,bucket_start_ms:n,bucket_end_ms:s,updated_at:r})}}function Xw(e,t=250){let r=setInterval(()=>{try{tD(e)}catch{}},t);return{stop(){clearInterval(r)}}}var Gw=T(()=>{"use strict"});function sD({dal:e}){let t=e.listProjects();for(let r of t){let n=e.query(`SELECT r.id, r.team_id
|
|
2008
2008
|
FROM run r
|
|
2009
2009
|
JOIN job j ON j.id = r.job_id
|
|
2010
2010
|
WHERE j.project_id = ?
|
|
@@ -2017,56 +2017,56 @@ ${p.text}`,["approve","request_changes"],!0,s,t.writes_to_project_path===!0)));i
|
|
|
2017
2017
|
AND status = 'running'
|
|
2018
2018
|
AND launch_source = 'terminal'
|
|
2019
2019
|
ORDER BY started_at DESC, id DESC
|
|
2020
|
-
LIMIT 1`,t,r)[0];return s===void 0?null:s.holder_pid!==null&&(s.holder_host===null||s.holder_host===Hd())?rr(s.holder_pid)?s:null:Qw(s)?s:null}function Qw(e){let t=Date.parse(e.last_heartbeat_at??e.started_at);return Number.isFinite(t)?Date.now()-t<=rE():!1}function tE(e,t){return e.holder_pid===null?e.started_at<t:!rr(e.holder_pid)}function rE(e=process.env){let t=e.LMCTL_INFLIGHT_TTL_MS;if(t===void 0||t.trim()==="")return zw;let r=Number(t);return!Number.isFinite(r)||r<=0?zw:r}function lD(e=process.env){let t=e.LMCTL_TERMINAL_LOCK_STALE_MS;if(t===void 0||t.trim()==="")return Zw;let r=Number(t);return!Number.isFinite(r)||r<=0?Zw:r}var zw,Zw,Fr=T(()=>{"use strict";sl();zw=8*60*60*1e3,Zw=12e4});async function $(e,t){if(e.dal!==void 0)return t(e.dal);let r=Ie({path:le()});try{return await t(r)}finally{r.close()}}function Z(e,t,r=["--json"]){let n=new Set(t),s=new Set(r),i=[],o={};for(let a=0;a<e.length;a+=1){let l=e[a];if(!l.startsWith("--")){i.push(l);continue}if(s.has(l)){o[l]=!0;continue}if(!n.has(l))return{positionals:i,flags:o,error:`unknown flag: ${l}`};let c=e[a+1];if(c===void 0||c.startsWith("--"))return{positionals:i,flags:o,error:`missing value for ${l}`};o[l]=c,a+=1}return{positionals:i,flags:o}}function P(e,t){let r=e.flags[t];return typeof r=="string"?r:void 0}function
|
|
2020
|
+
LIMIT 1`,t,r)[0];return s===void 0?null:s.holder_pid!==null&&(s.holder_host===null||s.holder_host===Hd())?rr(s.holder_pid)?s:null:Qw(s)?s:null}function Qw(e){let t=Date.parse(e.last_heartbeat_at??e.started_at);return Number.isFinite(t)?Date.now()-t<=rE():!1}function tE(e,t){return e.holder_pid===null?e.started_at<t:!rr(e.holder_pid)}function rE(e=process.env){let t=e.LMCTL_INFLIGHT_TTL_MS;if(t===void 0||t.trim()==="")return zw;let r=Number(t);return!Number.isFinite(r)||r<=0?zw:r}function lD(e=process.env){let t=e.LMCTL_TERMINAL_LOCK_STALE_MS;if(t===void 0||t.trim()==="")return Zw;let r=Number(t);return!Number.isFinite(r)||r<=0?Zw:r}var zw,Zw,Fr=T(()=>{"use strict";sl();zw=8*60*60*1e3,Zw=12e4});async function $(e,t){if(e.dal!==void 0)return t(e.dal);let r=Ie({path:le()});try{return await t(r)}finally{r.close()}}function Z(e,t,r=["--json"]){let n=new Set(t),s=new Set(r),i=[],o={};for(let a=0;a<e.length;a+=1){let l=e[a];if(!l.startsWith("--")){i.push(l);continue}if(s.has(l)){o[l]=!0;continue}if(!n.has(l))return{positionals:i,flags:o,error:`unknown flag: ${l}`};let c=e[a+1];if(c===void 0||c.startsWith("--"))return{positionals:i,flags:o,error:`missing value for ${l}`};o[l]=c,a+=1}return{positionals:i,flags:o}}function P(e,t){let r=e.flags[t];return typeof r=="string"?r:void 0}function V(e,t){return e.flags[t]===!0}function ae(e,t){e.stdout.write(`${JSON.stringify(t,null,2)}
|
|
2021
2021
|
`)}function v(e,t){return e.stderr.write(`error: ${t}
|
|
2022
2022
|
`),1}function je(e,t){let r=t instanceof Error?t.message:String(t);return e.stderr.write(`internal error: ${r}
|
|
2023
|
-
`),2}var Le=T(()=>{"use strict";Ze();Xe()});import{hostname as iE}from"node:os";async function
|
|
2024
|
-
${i.text}`;return await
|
|
2023
|
+
`),2}var Le=T(()=>{"use strict";Ze();Xe()});import{hostname as iE}from"node:os";async function Qo(e){let t=e.finalize??"auto";await cE(e.io,e.env);let r=await $(e.io,m=>m.listEnqueuedRequestMailFromSender(e.sender.teamfile,e.sender.alias,e.receiver.teamfile,e.receiver.alias)),n=r.length===0?[]:await $(e.io,m=>m.claimMailForDelivery(r.map(p=>p.id),new Date().toISOString(),process.pid,iE())),s=cD(n,e.newMessage,{newMessageFrom:e.newMessageFrom??lE(e.sender)});if(s.length===0)throw new Error(`no queued mail to deliver for ${e.sender.teamfile}:${e.sender.alias} -> ${e.receiver.teamfile}:${e.receiver.alias}`);await e.onPromptBuilt?.(s);let i=!1,o=ce(),a=0,l=0,c=0,d={provider:e.receiver.provider,sessionId:e.receiver.sessionId,cwd:e.receiver.cwd,prompt:s,permissionMode:e.permissionMode,env:e.env,onDelta:m=>{i=!0,o&&(a+=1,c=Buffer.byteLength(m,"utf8"),l+=c),e.onDelta?.(m)},onProgress:m=>e.onProgress?.(m)};e.receiver.model!==void 0&&(d.model=e.receiver.model),e.receiver.effort!==void 0&&(d.effort=e.receiver.effort),d.alias=e.receiver.alias,d.isLead=e.receiver.isLead,e.idleTimeoutMs!==void 0&&(d.timeoutMs=e.idleTimeoutMs);let u;try{u=await St(d)}catch(m){t==="auto"&&await sE(e.io,n.map(_=>_.id));let p=m instanceof Error?m.message:String(m);if(t==="caller")return{status:"error",receipt:p,prompt:s,queued:n,deliveredIds:[],wroteDelta:i,error:p};throw m}if(o&&Oe(JSON.stringify({event:"chat_return",alias:e.receiver.alias,provider:e.receiver.provider,streamed:i,blockCount:a,streamedBytes:l,resultTextBytes:Buffer.byteLength(u.text,"utf8"),lastChunkBytes:c,tailPreview:u.text.slice(-200)})),u.status==="stalled")return t==="auto"&&await sE(e.io,n.map(m=>m.id)),{status:"stalled",receipt:u.text,prompt:s,queued:n,deliveredIds:[],wroteDelta:i,durationMs:u.durationMs,stalledAfterMs:u.stalledAfterMs};let f=n.map(m=>m.id);return t==="auto"&&await Zo(e.io,f,u.text),{status:"ok",receipt:u.text,prompt:s,queued:n,deliveredIds:f,wroteDelta:i,durationMs:u.durationMs}}async function oE(e){await cE(e.io,e.env);let t=await $(e.io,i=>i.listEnqueuedResponseMailFromSender(e.sender.teamfile,e.sender.alias,e.receiver.teamfile,e.receiver.alias)),r=t.length===0?[]:await $(e.io,i=>i.claimMailForDelivery(t.map(o=>o.id),new Date().toISOString(),process.pid,iE())),n=dD(r);if(n.length===0)throw new Error(`no queued response mail to deliver for ${e.sender.teamfile}:${e.sender.alias} -> ${e.receiver.teamfile}:${e.receiver.alias}`);let s={provider:e.receiver.provider,sessionId:e.receiver.sessionId,cwd:e.receiver.cwd,prompt:n,permissionMode:e.permissionMode,env:e.env,alias:e.receiver.alias,isLead:e.receiver.isLead};e.receiver.model!==void 0&&(s.model=e.receiver.model),e.receiver.effort!==void 0&&(s.effort=e.receiver.effort),e.idleTimeoutMs!==void 0&&(s.timeoutMs=e.idleTimeoutMs);try{let i=await St(s);if(i.status==="stalled"){let a=`response delivery error: provider stalled${i.stalledAfterMs!==void 0?` after ${i.stalledAfterMs}ms`:""}
|
|
2024
|
+
${i.text}`;return await Zo(e.io,r.map(l=>l.id),a),{status:"stalled",receipt:a,prompt:n,queued:r,deliveredIds:r.map(l=>l.id),durationMs:i.durationMs,stalledAfterMs:i.stalledAfterMs}}let o="response delivered; recipient output discarded";return await Zo(e.io,r.map(a=>a.id),o),{status:"ok",receipt:o,prompt:n,queued:r,deliveredIds:r.map(a=>a.id),durationMs:i.durationMs}}catch(i){let o=i instanceof Error?i.message:String(i),a=`response delivery error: ${o}`;return await Zo(e.io,r.map(l=>l.id),a),{status:"error",receipt:a,prompt:n,queued:r,deliveredIds:r.map(l=>l.id),error:o}}}function cD(e,t,r={}){let n=e.map((s,i)=>[`--- queued message ${i+1} (mail #${s.id}, from ${aE(s)}, sent ${s.created_at}) ---`,s.payload].join(`
|
|
2025
2025
|
`));return t!==void 0&&n.push([`--- new message (from ${r.newMessageFrom??"operator"}) ---`,t].join(`
|
|
2026
2026
|
`)),n.join(`
|
|
2027
2027
|
|
|
2028
2028
|
`)}function dD(e){return e.map((r,n)=>[`--- queued response ${n+1} (mail #${r.id}, from ${aE(r)}, sent ${r.created_at}) ---`,r.payload,"","[lmctl] This is a response to your earlier message. Read it and update your context; no follow-up response will be sent."].join(`
|
|
2029
2029
|
`)).join(`
|
|
2030
2030
|
|
|
2031
|
-
`)}function aE(e){return e.sender_teamfile===null||e.sender_alias===null?"operator":lE({teamfile:e.sender_teamfile,alias:e.sender_alias})}function lE(e){return`${e.teamfile}:${e.alias}`}async function
|
|
2031
|
+
`)}function aE(e){return e.sender_teamfile===null||e.sender_alias===null?"operator":lE({teamfile:e.sender_teamfile,alias:e.sender_alias})}function lE(e){return`${e.teamfile}:${e.alias}`}async function Zo(e,t,r){if(t.length!==0)try{await $(e,n=>{n.markMailDelivered(t,r,new Date().toISOString())})}catch(n){e.stderr.write(`warning: failed to mark queued mailbox mail delivered: ${n instanceof Error?n.message:String(n)}
|
|
2032
2032
|
`)}}async function sE(e,t){if(t.length!==0)try{await $(e,r=>{r.clearMailDelivery(t)})}catch(r){e.stderr.write(`warning: failed to clear queued mailbox delivery marker: ${r instanceof Error?r.message:String(r)}
|
|
2033
|
-
`)}}async function cE(e,t){try{await $(e,r=>{r.reclaimStaleMailboxDeliveries(new Date(Date.now()-uD(t)).toISOString())})}catch{}}function uD(e){let t=e.LMCTL_MAILBOX_DELIVERY_STALE_MS;if(t===void 0||t.trim()==="")return nE;let r=Number(t);return!Number.isFinite(r)||r<=0?nE:r}var nE,Xd=T(()=>{"use strict";vt();
|
|
2034
|
-
`);if(t[0]!=="---")throw new xt("frontmatter must start at line 1 with `---` on its own line");let r={},n=-1;for(let o=1;o<t.length;o++){let a=t[o];if(a==="---"){n=o;break}if(a.trim()==="")continue;let l=a.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);if(!l)throw new xt(`malformed frontmatter line ${o+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],d=l[2].trim();if(!yD.has(c))throw new xt(`unknown frontmatter key "${c}" \u2014 allowed keys: ${
|
|
2033
|
+
`)}}async function cE(e,t){try{await $(e,r=>{r.reclaimStaleMailboxDeliveries(new Date(Date.now()-uD(t)).toISOString())})}catch{}}function uD(e){let t=e.LMCTL_MAILBOX_DELIVERY_STALE_MS;if(t===void 0||t.trim()==="")return nE;let r=Number(t);return!Number.isFinite(r)||r<=0?nE:r}var nE,Xd=T(()=>{"use strict";vt();he();Le();nE=8*60*60*1e3});import{basename as fD}from"node:path";function fE(e,t){let r=new Date(t.now.getTime()-gr()).toISOString(),n=_E(e,r).filter(f=>!f.sender.teamfile.startsWith("prompt:")),s=_D(t.sender,n),i=hD(t.sender,n);i!==null&&i.teamfile===t.root&&!uE(s[0],i)&&s.unshift({...i,at:null});let o={teamfile:t.receiverTeamfile,alias:t.receiverAlias,at:t.now.getTime()},a=[...s,o],l=s.filter(f=>uE(f,o)),c=l.map(f=>f.at).filter(f=>f!==null).sort((f,m)=>m-f)[0]??null,d=c!==null&&t.now.getTime()-c<mD;return{stop:l.length>=1&&d,chain:gD(a)}}function mE(e,t){let r=new Date(t.now.getTime()-gr()).toISOString(),n=_E(e,r),s=hE(t.sender,n);if(s.length===0)return null;let i=s[0];return i.sender.teamfile.startsWith("prompt:")?i.receiver.teamfile:i.sender.teamfile}function gr(e=process.env){let t=e.LMCTL_INFLIGHT_TTL_MS;if(t===void 0||t.trim()==="")return dE;let r=Number(t);return!Number.isFinite(r)||r<=0?dE:r}function pE(e){return`cross-team cycle detected (${e}); stopping to prevent a runaway loop.`}function pD(e){return{sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},at:Date.parse(e.started_at)}}function _E(e,t){return e.clearAgentInflightOlderThan(t),e.listAgentInflight().map(pD).filter(r=>Number.isFinite(r.at)&&new Date(r.at).toISOString()>=t).sort((r,n)=>r.at-n.at)}function _D(e,t,r={}){let n=new Map;for(let a of t)n.set(Ur(a.receiver),a);let s=[{...e,at:null}],i=e,o=new Set([Ur(e)]);for(let a=0;a<64;a+=1){let l=n.get(Ur(i));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 d=Ur(l.sender);if(o.has(d))break;s.unshift(c),o.add(d),i=l.sender}return s}function hE(e,t){let r=Ur(e),n=new Set([r]),s=[r],i=[];for(let o=0;s.length>0&&o<128;o+=1){let a=s.shift();for(let l of t){let c=Ur(l.sender),d=Ur(l.receiver);c!==a&&d!==a||(i.includes(l)||i.push(l),n.has(c)||(n.add(c),s.push(c)),n.has(d)||(n.add(d),s.push(d)))}}return i.sort((o,a)=>o.at-a.at)}function hD(e,t){let r=hE(e,t);if(r.length===0)return null;let n=r[0];return n.sender.teamfile.startsWith("prompt:")?n.receiver:n.sender}function uE(e,t){return e.teamfile===t.teamfile&&e.alias===t.alias}function Ur(e){return`${e.teamfile}\0${e.alias}`}function gD(e){return e.map(t=>`${fD(t.teamfile)}:${t.alias}`).join(" \u2192 ")}var mD,dE,ea=T(()=>{"use strict";mD=6e4,dE=8*60*60*1e3});function gE(e){if(e.length===0||!e.startsWith("---"))throw new xt("frontmatter must start at line 1 with `---` on its own line");let t=e.split(`
|
|
2034
|
+
`);if(t[0]!=="---")throw new xt("frontmatter must start at line 1 with `---` on its own line");let r={},n=-1;for(let o=1;o<t.length;o++){let a=t[o];if(a==="---"){n=o;break}if(a.trim()==="")continue;let l=a.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);if(!l)throw new xt(`malformed frontmatter line ${o+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],d=l[2].trim();if(!yD.has(c))throw new xt(`unknown frontmatter key "${c}" \u2014 allowed keys: ${ta.join(", ")}`);r[c]=d}if(n===-1)throw new xt("frontmatter not closed (missing trailing `---` on its own line)");for(let o of ta)if(r[o]===void 0)throw new xt(`missing required frontmatter key "${o}" \u2014 required: ${ta.join(", ")}`);let s=0;for(let o=0;o<=n;o++)s+=t[o].length+1;s>e.length&&(s=e.length);let i=r.members.split(",").map(o=>o.trim()).filter(Boolean);return{title:r.title,description:r.description,members:i,bodyOffset:s}}var ta,yD,xt,yE=T(()=>{"use strict";ta=["title","description","members"],yD=new Set(ta),xt=class extends Error{constructor(t){super(t),this.name="FrontmatterError"}}});import{readFileSync as wD,writeFileSync as Q8,renameSync as eY,existsSync as EE}from"node:fs";import{basename as ED,resolve as bn,dirname as Gd}from"node:path";function bD(e){let t={},r=/(\w+)=(?:"([^"]*)"|([\S]*))/g,n;for(;(n=r.exec(e))!==null;){let s=n[1],i=n[2]!==void 0?n[2]:n[3];t[s]=i}return t}function SD(e){return/^\s*_MEMBER_\s+\S/.test(e)}function vD(e){return/^\s*_SESSION_\s+\S/.test(e)}function kD(e){return/^\s*_SKILL_(?:\s|$)/.test(e)}function ra(e){let t=ED(e);return t.endsWith(".lmctl")?t.slice(0,-6):t}function De(e){let t=wD(e,"utf-8"),r=Gd(bn(e)),n=Kd(t,ra(e),{baseDir:r,sourcePath:bn(e)});for(let s of n.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=bn(r,s.sessiondir));return n}function Kd(e,t,r={}){let n=[],s=[];r.sourcePath,r.baseDir;let i=e;if(i.startsWith("#teamfile:")){let l=i.indexOf(`
|
|
2035
2035
|
`);i=l>=0?i.slice(l+1):""}let o=null;if(i.startsWith("---"))try{o=gE(i)}catch(l){if(l instanceof xt)s.push(`frontmatter: ${l.message}`);else throw l}let a=e.split(`
|
|
2036
2036
|
`);for(let l=0;l<a.length;l++){let c=a[l],d=l+1;if(vD(c))throw new Error(`line ${d}: _SESSION_ is the legacy prefix. Rename to _MEMBER_. (line: ${c.trim()})`);if(kD(c)||!SD(c))continue;let u=bD(c);for(let p of Object.keys(u))if(!wE.includes(p))throw new Error(`line ${d}: unknown key "${p}" on _MEMBER_ line: ${c.trim()}
|
|
2037
|
-
allowed keys: ${wE.join(", ")}`);if(!u.provider&&!u.teamfile){s.push(`line ${d}: member line missing provider (or teamfile): ${c.trim()}`);continue}let m={alias:u.alias||`member${n.length+1}`,provider:u.provider||"",extra:{}};u.sessionid&&(m.session=u.sessionid),Object.prototype.hasOwnProperty.call(u,"sessiondir")&&(m.sessiondir=u.sessiondir),u.teamfile&&(m.teamfile=u.teamfile),u.model&&(m.model=u.model),u.effort&&(m.effort=u.effort),n.push(m)}return{name:t,members:n,rawText:e,parseErrors:s,frontmatter:o}}function Yd(e,t){let r=[];for(let i of e.parseErrors)r.push({field:"session",message:i});let n=e.members.filter(i=>i.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 i of e.members){let o=i.alias.toLowerCase();if(s.has(o)&&r.push({field:i.alias,message:`Duplicate alias "${i.alias}" (case-insensitive)`}),s.add(o),i.teamfile){let a=t?bn(t,i.teamfile):bn(i.teamfile);if(!EE(a))r.push({field:i.alias,message:`Teamfile not found: ${a}`});else{let l=De(a),c=At(l);c?c.session||r.push({field:i.alias,message:`Team at ${i.teamfile} lead has no session ID. Run: lmctl seed`}):r.push({field:i.alias,message:`Team at ${i.teamfile} has no lead session`})}}else TD.has(i.provider)||r.push({field:i.alias,message:`Invalid provider "${i.provider}"`});i.sessiondir!==void 0&&i.sessiondir===""&&r.push({field:i.alias,message:"sessiondir is empty"})}return r}function At(e){return e.members.find(t=>t.alias.toLowerCase()===Vd.toLowerCase())}function zd(e,t,r,n={}){let s=n.requireSession??!0;if(!e.teamfile)throw new Error(`Member "${e.alias}" is not a team reference`);let i=bn(t,e.teamfile),o=r??new Set;if(o.has(i))throw new Error(`Circular team reference: ${e.alias} \u2192 ${i} (already visited: ${[...o].join(" \u2192 ")})`);if(o.add(i),!EE(i))throw new Error(`Teamfile not found: ${i} (referenced by alias "${e.alias}")`);let a=De(i),l=At(a);if(!l)throw new Error(`Team at ${i} has no lead session`);if(l.teamfile)return zd(l,Gd(i),o,n);if(s&&!l.session)throw new Error(`Team at ${i} lead has no session ID. Run: lmctl seed`);return{provider:l.provider,session:l.session??"",sessiondir:l.sessiondir||Gd(i),alias:e.alias,resolvedFrom:i,model:l.model,effort:l.effort}}function
|
|
2038
|
-
Known aliases: ${o}`)}if(i.teamfile!==void 0){let o=zd(i,NE(n));return{teamfile:n,alias:i.alias,provider:o.provider,sessionid:o.session,sessiondir:o.sessiondir,isLead:!0,...o.model??i.model?{model:o.model??i.model}:{},...o.effort??i.effort?{effort:o.effort??i.effort}:{}}}if(i.session===void 0)throw new
|
|
2039
|
-
Run: lmctl seed ${e}`);return{teamfile:n,alias:i.alias,provider:i.provider,sessionid:i.session,sessiondir:i.sessiondir??NE(n),isLead:At(s)?.alias===i.alias,...i.model!==void 0?{model:i.model}:{},...i.effort!==void 0?{effort:i.effort}:{}}}function yr(e,t){let{target:r,alias:n,flags:s}=t;if(s.run!==void 0||s.project!==void 0||s.workflow!==void 0){if(r!==void 0)return{mode:"error",message:`lmctl ${e.name}: --run/--project/--workflow (managed mode) are mutually exclusive with a positional target "${r}" \u2014 pick one form.`};let o={mode:"managed"};return s.run!==void 0&&(o.run=s.run),s.project!==void 0&&(o.project=s.project),s.workflow!==void 0&&(o.workflow=s.workflow),o}if(r!==void 0){let o=Wr(r);if(o!==null)return n!==void 0&&n!==o.alias?{mode:"error",message:`lmctl ${e.name}: got "${r}" AND second positional "${n}" \u2014 pick one form.`}:{mode:"ai-team",teamfile:o.teamfile,alias:o.alias};if(r.endsWith(".lmctl"))return n!==void 0?xE(n)?{mode:"ai-team",teamfile:r,alias:n}:{mode:"error",message:`lmctl ${e.name}: "${n}" is not a valid alias (must match ${
|
|
2037
|
+
allowed keys: ${wE.join(", ")}`);if(!u.provider&&!u.teamfile){s.push(`line ${d}: member line missing provider (or teamfile): ${c.trim()}`);continue}let m={alias:u.alias||`member${n.length+1}`,provider:u.provider||"",extra:{}};u.sessionid&&(m.session=u.sessionid),Object.prototype.hasOwnProperty.call(u,"sessiondir")&&(m.sessiondir=u.sessiondir),u.teamfile&&(m.teamfile=u.teamfile),u.model&&(m.model=u.model),u.effort&&(m.effort=u.effort),n.push(m)}return{name:t,members:n,rawText:e,parseErrors:s,frontmatter:o}}function Yd(e,t){let r=[];for(let i of e.parseErrors)r.push({field:"session",message:i});let n=e.members.filter(i=>i.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 i of e.members){let o=i.alias.toLowerCase();if(s.has(o)&&r.push({field:i.alias,message:`Duplicate alias "${i.alias}" (case-insensitive)`}),s.add(o),i.teamfile){let a=t?bn(t,i.teamfile):bn(i.teamfile);if(!EE(a))r.push({field:i.alias,message:`Teamfile not found: ${a}`});else{let l=De(a),c=At(l);c?c.session||r.push({field:i.alias,message:`Team at ${i.teamfile} lead has no session ID. Run: lmctl seed`}):r.push({field:i.alias,message:`Team at ${i.teamfile} has no lead session`})}}else TD.has(i.provider)||r.push({field:i.alias,message:`Invalid provider "${i.provider}"`});i.sessiondir!==void 0&&i.sessiondir===""&&r.push({field:i.alias,message:"sessiondir is empty"})}return r}function At(e){return e.members.find(t=>t.alias.toLowerCase()===Vd.toLowerCase())}function zd(e,t,r,n={}){let s=n.requireSession??!0;if(!e.teamfile)throw new Error(`Member "${e.alias}" is not a team reference`);let i=bn(t,e.teamfile),o=r??new Set;if(o.has(i))throw new Error(`Circular team reference: ${e.alias} \u2192 ${i} (already visited: ${[...o].join(" \u2192 ")})`);if(o.add(i),!EE(i))throw new Error(`Teamfile not found: ${i} (referenced by alias "${e.alias}")`);let a=De(i),l=At(a);if(!l)throw new Error(`Team at ${i} has no lead session`);if(l.teamfile)return zd(l,Gd(i),o,n);if(s&&!l.session)throw new Error(`Team at ${i} lead has no session ID. Run: lmctl seed`);return{provider:l.provider,session:l.session??"",sessiondir:l.sessiondir||Gd(i),alias:e.alias,resolvedFrom:i,model:l.model,effort:l.effort}}function na(e,t){return e.members.find(r=>r.alias===t)??e.members.find(r=>r.alias.toLowerCase()===t.toLowerCase())}var Vd,TD,wE,Yt=T(()=>{"use strict";yE();Vd="Lead",TD=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","ClaudeMock"]);wE=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});import{createHash as ID}from"node:crypto";import{existsSync as vs,mkdirSync as ND,readFileSync as SE,realpathSync as xD,writeFileSync as AD}from"node:fs";import{basename as TE,dirname as vE,resolve as kE}from"node:path";function Ee(e,t){let r=kE(e);if(vs(r))return xD(r);if(t!==void 0){let n=OD(e,r,t);if(n!==null)return n}return r}function bE(e,t){let r=vE(t),n=Kd(e,ra(t),{baseDir:r});for(let s of n.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=kE(r,s.sessiondir));return n}function Pe(e,t){let r=Ee(e,LD(t)?t:void 0);if(t!==void 0){let n=t.getRootTeam(r);if(n!==null)return!vs(r)&&"upsertRootTeam"in t&&(ND(vE(r),{recursive:!0}),AD(r,n.raw_text,"utf8")),bE(n.raw_text,r);if(vs(r)){let s=SE(r,"utf8"),i=bE(s,r);return"upsertRootTeam"in t&&$D(i)&&CD(t,r,i,s),i}throw new Error(`teamfile not found: ${e}`)}if(!vs(r))throw new Error(`teamfile not found: ${e}`);return De(r)}function IE(e,t,r){let n=Ee(e,t),s=t.getRootTeam(n);s===null||!vs(n)||SE(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 LD(e){return typeof e=="object"&&e!==null&&"getRootTeam"in e&&"listRootTeams"in e}function OD(e,t,r){let n=r.getRootTeam(e)??r.getRootTeam(t);if(n!==null)return n.teamfile_path;let s=TE(e),i=ra(e),o=r.listRootTeams().filter(l=>TE(l.teamfile_path)===s||l.name===i);if(o.length===0)return null;if(o.length===1)return o[0].teamfile_path;let a=o.map(l=>l.teamfile_path).join(", ");throw new Error(`ambiguous teamfile "${e}" in root-team registry: ${a}; pass an absolute path`)}function $D(e){return e.parseErrors.length>0?!1:e.members.every(t=>t.teamfile!==void 0?!0:t.session!==void 0&&t.session.length>=RD)}function CD(e,t,r,n){let s=new Date().toISOString(),i={teamfile_path:t,name:r.name,raw_text:n,raw_sha256:ID("sha256").update(n).digest("hex"),registered_at:s,last_seeded_at:s};e.upsertRootTeam(i)}var RD,Rt=T(()=>{"use strict";Yt();RD=5});import{existsSync as MD}from"node:fs";import{dirname as NE}from"node:path";function PD(e){return jD.test(e)||DD.test(e)}function xE(e){return sa.test(e)}function Wr(e){if(!e.includes(":"))return null;let t=e.lastIndexOf(":"),r=e.slice(0,t),n=e.slice(t+1);return!r.endsWith(".lmctl")||!sa.test(n)?null:{teamfile:r,alias:n}}function He(e,t,r){if(!e.endsWith(".lmctl"))throw new ye(`lmctl: "${e}" doesn't look like a teamfile (expected .lmctl extension).`);if(!xE(t))throw new ye(`lmctl: "${t}" is not a valid alias (must match ${sa.source}).`);let n=Ee(e,r);if(r===void 0&&!MD(n))throw new ye(`lmctl: teamfile not found: ${e}`);let s;try{s=Pe(n,r)}catch(o){throw new ye(`lmctl: ${e}: ${o instanceof Error?o.message:String(o)}`)}if(s.parseErrors.length>0)throw new ye(`lmctl: ${e}: ${s.parseErrors.join("; ")}`);let i=na(s,t);if(i===void 0){let o=s.members.map(a=>a.alias).join(", ")||"(none)";throw new ye(`lmctl: alias "${t}" not found in ${e}.
|
|
2038
|
+
Known aliases: ${o}`)}if(i.teamfile!==void 0){let o=zd(i,NE(n));return{teamfile:n,alias:i.alias,provider:o.provider,sessionid:o.session,sessiondir:o.sessiondir,isLead:!0,...o.model??i.model?{model:o.model??i.model}:{},...o.effort??i.effort?{effort:o.effort??i.effort}:{}}}if(i.session===void 0)throw new ye(`lmctl: alias "${i.alias}" in ${e} has no session ID yet.
|
|
2039
|
+
Run: lmctl seed ${e}`);return{teamfile:n,alias:i.alias,provider:i.provider,sessionid:i.session,sessiondir:i.sessiondir??NE(n),isLead:At(s)?.alias===i.alias,...i.model!==void 0?{model:i.model}:{},...i.effort!==void 0?{effort:i.effort}:{}}}function yr(e,t){let{target:r,alias:n,flags:s}=t;if(s.run!==void 0||s.project!==void 0||s.workflow!==void 0){if(r!==void 0)return{mode:"error",message:`lmctl ${e.name}: --run/--project/--workflow (managed mode) are mutually exclusive with a positional target "${r}" \u2014 pick one form.`};let o={mode:"managed"};return s.run!==void 0&&(o.run=s.run),s.project!==void 0&&(o.project=s.project),s.workflow!==void 0&&(o.workflow=s.workflow),o}if(r!==void 0){let o=Wr(r);if(o!==null)return n!==void 0&&n!==o.alias?{mode:"error",message:`lmctl ${e.name}: got "${r}" AND second positional "${n}" \u2014 pick one form.`}:{mode:"ai-team",teamfile:o.teamfile,alias:o.alias};if(r.endsWith(".lmctl"))return n!==void 0?xE(n)?{mode:"ai-team",teamfile:r,alias:n}:{mode:"error",message:`lmctl ${e.name}: "${n}" is not a valid alias (must match ${sa.source}).`}:e.allowsBareTeamfile?{mode:"ai-team",teamfile:r}:{mode:"error",message:`lmctl ${e.name}: alias required.
|
|
2040
2040
|
Use: lmctl ${e.name} ${r}:<alias> or lmctl ${e.name} ${r} <alias>`};if(PD(r)){if(n!==void 0)return{mode:"error",message:`lmctl ${e.name}: got a second positional "${n}" but "${r}" is not a teamfile path.`};if(!e.supportsRaw)return{mode:"error",message:`lmctl ${e.name}: "${r}" is a bare sessionid, but ${e.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 ${e.name}: got a second positional "${n}" but "${r}" is not a teamfile path.
|
|
2041
2041
|
Either drop the second arg, or pass <teamfile>.lmctl as the first arg.`}:{mode:"error",message:`lmctl ${e.name}: can't infer target type from "${r}".
|
|
2042
2042
|
Expected one of: <path>.lmctl, <path>.lmctl:<alias>, <sessionid>.`}}if(s.session!==void 0){if(!e.supportsRaw)return{mode:"error",message:`lmctl ${e.name}: --session (raw mode) is not supported by ${e.name}.`};let o={mode:"ai-team-raw",sessionid:s.session};return s.provider!==void 0&&(o.provider=s.provider),o}return{mode:"error",message:`lmctl ${e.name}: a target is required.
|
|
2043
|
-
Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var
|
|
2044
|
-
${e.receipt}`:`relay delivery error: ${e.error}`}function JD(e,t){let r=t.LMCTL_MAILBOX_DELIVERY_STALE_MS,n=r===void 0||r.trim()===""?NaN:Number(r),s=Number.isFinite(n)&&n>0?n:8*60*60*1e3;e.reclaimStaleMailboxDeliveries(new Date(Date.now()-s).toISOString())}function XD(e){return{stdout:{write:()=>{}},stderr:{write:()=>{}},dal:e}}var AE,OE=T(()=>{"use strict";Fr();Xd();Qo();Lt();AE=10});function ks(){let e=process.env.LMCTL_DAEMON_INTERVAL_MS;if(e===void 0||e.trim().length===0)return 5e3;let t=Number(e);return Number.isFinite(t)&&t>0?t:5e3}function VD(e=process.env){let t=e.LMCTL_DAEMON_FEATURES;if(t===void 0)return new Set(["mailbox-relay"]);if(t.trim()==="")return new Set;let r=new Set;for(let n of t.split(",")){let s=n.trim();if(s!==""){if(s==="all")return new Set($E);GD.has(s)&&r.add(s)}}return r}function CE(e){let t=e.intervalMs??ks(),r=e.runOnceFn??jr,n=new Set(e.features??VD()),s={running:e.autoStart!==!1,in_flight:!1,interval_ms:t,enabled_features:[...n].sort(),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,last_mailbox_relay_scanned:0,last_mailbox_relay_delivered:0,last_mailbox_relay_errors:0},i=null,o=null,a=null,l=null,c=null;n.has("rollup-updater")&&e.startRollupUpdaterFn!==!1&&(c=(e.startRollupUpdaterFn??Xw)(e.dal));let d=m=>{s.running&&(i=setTimeout(()=>{f.runCycle().finally(()=>d(t))},m))},u=m=>{s.running&&(o=setTimeout(()=>{l===null&&(l=ME(e.dal,n,e.monitorSessionActivityFn??yc,t,s).finally(()=>{l=null})),l.finally(()=>u(wc(e.dal,t)))},m))},f={state:s,runCycle:async()=>(a!==null||(a=KD(e.dal,r,e.collectSessionSizesFn??p_,e.scanIntakeFn??ao,e.monitorSessionActivityFn??yc,e.mailboxRelayFn??LE,e.worker_id??"daemon",t,n,s).finally(()=>{a=null})),a),stop:async()=>{s.running=!1,i!==null&&clearTimeout(i),o!==null&&clearTimeout(o),c?.stop(),a!==null&&await a.catch(()=>{}),l!==null&&await l.catch(()=>{})}};if(s.running){let m=e.firstDelayMs??5e3;d(m),n.has("session-monitor")&&u(m)}return f}async function KD(e,t,r,n,s,i,o,a,l,c){c.in_flight=!0,c.last_started_at=new Date().toISOString(),c.last_error=null;let d=[],u=0,f=0,m=[],p=null,_=YD();try{if(l.has("durable-memory-policies")&&by({dal:e}),l.has("drift-detectors")&&Kw({dal:e}),l.has("intake")&&(m=await n(e)),l.has("job-worker"))for(;;){let g=await t({dal:e,worker_id:o,lease_ms:6e5});if(g===null)break;d.push(g)}if(l.has("mailbox-relay")&&(_=await i({dal:e})),l.has("session-size")){let g=await r(e);u=g.recorded,f=g.failed}l.has("session-monitor")&&(p=await ME(e,l,s,a,c))}catch(g){c.last_error=g instanceof Error?g.message:String(g);try{e.raiseAttention({kind:"daemon_worker_failed",severity:"error",payload:JSON.stringify({error:c.last_error})})}catch{}}finally{c.in_flight=!1,c.cycles+=1,c.last_jobs_processed=d.length,c.last_session_sizes_recorded=u,c.last_session_size_failures=f,c.last_intake_scanned=m.reduce((g,h)=>g+h.scanned,0),c.last_intake_new_jobs=m.reduce((g,h)=>g+h.new_jobs,0),c.last_intake_failures=m.filter(g=>g.error!==void 0).length,c.last_session_hung_detected=p?.hung_detected??0,c.last_mailbox_relay_scanned=_.scanned,c.last_mailbox_relay_delivered=_.delivered,c.last_mailbox_relay_errors=_.errors,c.jobs_processed+=d.length,c.last_finished_at=new Date().toISOString()}return{jobs_processed:d.length,outcomes:d,session_sizes_recorded:u,session_size_failures:f,intake:m,session_monitor:p,mailbox_relay:_}}function YD(){return{scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0}}async function ME(e,t,r,n,s){if(!t.has("session-monitor"))return null;let i=wc(e,n),o=Date.now();if(s.last_session_monitor_checked_at!==null){let a=Date.parse(s.last_session_monitor_checked_at);if(Number.isFinite(a)&&o-a<i)return null}s.last_session_monitor_checked_at=new Date(o).toISOString(),s.last_session_monitor_error=null;try{return await r({dal:e,nowMs:o})}catch(a){s.last_session_monitor_error=a instanceof Error?a.message:String(a);try{e.raiseAttention({kind:"daemon_session_monitor_failed",severity:"error",payload:JSON.stringify({error:s.last_session_monitor_error})})}catch{}return null}}var $E,GD,Zd=T(()=>{"use strict";qc();Ro();Ed();Ci();Gw();Yw();Ec();OE();$E=["durable-memory-policies","drift-detectors","intake","job-worker","mailbox-relay","session-size","session-monitor","rollup-updater"],GD=new Set($E)});function jE(e){let t=e.listMembersInState("in_chat");for(let r of t)e.setMemberState(r.id,"attention_needed","daemon_restarted_mid_chat");return t.length}var DE=T(()=>{"use strict"});import{mkdirSync as zD,readFileSync as ZD,readdirSync as QD,statSync as eP,writeFileSync as tP}from"node:fs";import{dirname as rP,join as FE,sep as PE}from"node:path";function sa(e){return{s3:{async send(n){let s=n;switch(s._localfsTag){case UE:return nP(e,s.input);case WE:return sP(e,s.input);case BE:return iP(e,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:tu,GetObjectCommand:eu,PutObjectCommand:Qd}}}function nP(e,t){let r=qE(e,t.Key);return zD(rP(r),{recursive:!0}),tP(r,t.Body),{}}function sP(e,t){let r=qE(e,t.Key),n;try{n=ZD(r)}catch(i){throw i.code==="ENOENT"?Object.assign(new Error("NoSuchKey"),{name:"NoSuchKey"}):i}let s=n.toString("utf-8");return{Body:{transformToString:async()=>s}}}function iP(e,t){let r=t.Prefix??"";HE(r);let s=oP(e).sort((d,u)=>d.key<u.key?-1:d.key>u.key?1:0).filter(d=>d.key.startsWith(r)),i=t.ContinuationToken;i!==void 0&&i!==""&&(s=s.filter(d=>d.key>i));let o=typeof t.MaxKeys=="number"&&Number.isFinite(t.MaxKeys)&&t.MaxKeys>0?Math.floor(t.MaxKeys):void 0,a=s,l=!1;o!==void 0&&s.length>o&&(a=s.slice(0,o),l=!0);let c={Contents:a.map(d=>({Key:d.key,LastModified:d.lastModified})),IsTruncated:l};return l&&(c.NextContinuationToken=a[a.length-1].key),c}function qE(e,t){return HE(t),FE(e,t)}function HE(e){if(e.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${e}`)}function oP(e){let t=[],r=(n,s)=>{let i;try{i=QD(n,{withFileTypes:!0})}catch(o){if(o.code==="ENOENT")return;throw o}for(let o of i){let a=s===""?o.name:`${s}/${o.name}`,l=FE(n,o.name);if(o.isDirectory())r(l,a);else if(o.isFile()){let c=PE==="/"?a:a.split(PE).join("/");t.push({key:c,lastModified:eP(l).mtime})}}};return r(e,""),t}var UE,WE,BE,Qd,eu,tu,ru=T(()=>{"use strict";UE="localfs-put",WE="localfs-get",BE="localfs-list",Qd=class{input;_localfsTag=UE;constructor(t){this.input=t}},eu=class{input;_localfsTag=WE;constructor(t){this.input=t}},tu=class{input;_localfsTag=BE;constructor(t){this.input=t}}});function JE(){return{put:0,get:0,list:0}}function nu(e,t=aP){return e.put*t.putUsd+e.get*t.getUsd+e.list*t.listUsd}function su(e){let t=new Date(e),r=t.getUTCFullYear(),n=String(t.getUTCMonth()+1).padStart(2,"0");return`${r}-${n}`}var aP,ia,iu=T(()=>{"use strict";aP={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};ia=class{counts=JE();record(t,r=1){this.counts[t]+=r}peek(){return{...this.counts}}drain(){let t={...this.counts};return this.counts=JE(),t}estimateCostUsd(t){return nu(this.counts,t)}}});function XE(e){let t=e.now??Date.now,r=e.timers??lP,n=null,s=null;async function i(){let l=t(),c=su(l),d=e.meter.drain();(d.put>0||d.get>0||d.list>0)&&e.store.addUsage({user_id:e.userId,device_id:e.deviceId,period:c,put:d.put,get:d.get,list:d.list,updated_at:new Date(l).toISOString()});let u=e.store.loadUsage(e.userId,e.deviceId,c),f=u?{put:u.put_count,get:u.get_count,list:u.list_count}:{put:0,get:0,list:0};if(e.publishOwnRollup!==void 0)try{await e.publishOwnRollup(c,f)}catch(_){e.log?.(`[usage] publish rollup failed: ${_ instanceof Error?_.message:String(_)}`)}let m=f;if(e.readUserTotal!==void 0)try{m=await e.readUserTotal(c)}catch(_){e.log?.(`[usage] read user total failed: ${_ instanceof Error?_.message:String(_)}`),m=f}let p=nu(m);if(n!==c&&p>=e.ceilingUsd){n=c,e.log?.(`[usage] quota exceeded period=${c} cost=$${p.toFixed(4)} >= ceiling $${e.ceilingUsd}`);try{e.onQuotaExceeded({period:c,costUsd:p,ceilingUsd:e.ceilingUsd})}catch(_){e.log?.(`[usage] onQuotaExceeded threw: ${_ instanceof Error?_.message:String(_)}`)}}}function o(){return s=(s??Promise.resolve()).then(()=>i()).catch(()=>{}),s}let a=r.setInterval(()=>{o()},e.intervalMs);return{stop(){r.clearInterval(a)},flushNow(){return o()},isOverQuota(){return n!==null&&n===su(t())}}}var lP,GE=T(()=>{"use strict";iu();lP={setInterval:(e,t)=>setInterval(e,t),clearInterval:e=>clearInterval(e)}});var ou=T(()=>{"use strict";Mo();Do();Do()});function cP(e){if(typeof e!="object"||e===null||Array.isArray(e))return null;let t=e;if(typeof t.message_id!="string"||t.message_id==="")return null;if(typeof t.reply_to=="string"&&t.reply_to!==""){let s=t.response;if(typeof s!="object"||s===null)return null;let i=s;return typeof i.status!="number"?null:{message_id:t.message_id,reply_to:t.reply_to,response:i}}let r=t.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:t.message_id,request:n}}function dP(e){return e.reply_to!==void 0&&e.response!==void 0}function uP(e){if(typeof e!="object"||e===null)return;let t=e.conversation_id;return typeof t=="string"?t:void 0}function VE(e){let t=e.reason;if(t!==void 0)return t;try{return new DOMException("Aborted","AbortError")}catch{let r=new Error("Aborted");return r.name="AbortError",r}}var oa,Is,KE=T(()=>{"use strict";ou();oa=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(t="MailboxFetchClient stopped before a response arrived"){super(t)}},Is=class{client;log;now;random;pending=new Map;requestHandler=null;stopped=!1;constructor(t){this.client=t.client,this.log=t.log??(()=>{}),this.now=t.now??Date.now,this.random=t.random??Math.random}onRequest(t){if(this.requestHandler!==null)throw new Error("MailboxFetchClient: onRequest handler already registered");this.requestHandler=t}async fetch(t,r){if(this.stopped)throw new oa("MailboxFetchClient.fetch after stop()");if(typeof t.path!="string"||t.path==="")throw new Error("MailboxFetchClient.fetch: request.path is required");let n=t.method;if(typeof n!="string"||n==="")throw new Error("MailboxFetchClient.fetch: request.method is required");let s=Kt(this.now(),this.random);if(this.pending.has(s))throw new Error(`MailboxFetchClient.fetch: duplicate message_id=${s}`);let i=r?.conversationId??s,o={message_id:s,request:t};return new Promise((a,l)=>{let c=r?.abortSignal,d;if(c!==void 0){if(c.aborted){l(VE(c));return}d=()=>{this.pending.has(s)&&(this.pending.delete(s),l(VE(c)))},c.addEventListener("abort",d,{once:!0})}this.pending.set(s,{resolve:a,reject:l,...d!==void 0?{abortListener:d}:{},...c!==void 0?{abortSignal:c}:{}}),this.client.putMessage({conversation_id:i,payload:o}).catch(u=>{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(u))})})}async stop(){if(this.stopped)return;this.stopped=!0;let t=Array.from(this.pending.values());this.pending.clear();let r=new oa;for(let n of t){n.abortListener!==void 0&&n.abortSignal!==void 0&&n.abortSignal.removeEventListener("abort",n.abortListener);try{n.reject(r)}catch{}}}async handleIncoming(t,r){let n=cP(t);if(n===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(dP(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??uP(t)??n.message_id,i;try{i=await this.requestHandler(n.request)}catch(l){let c=l instanceof Error?l.message:String(l),d=typeof l.code=="string"?l.code:"INTERNAL_ERROR";i={status:500,headers:{"content-type":"application/json"},body:{error:d,message:c}}}let a={message_id:Kt(this.now(),this.random),reply_to:n.message_id,response:i};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 au(e){if(typeof e!="object"||e===null||Array.isArray(e))return!1;let t=e;return!(t.kind!=="terminal"||typeof t.session_id!="string"||t.session_id===""||t.direction!=="agent_to_user"&&t.direction!=="user_to_agent"||typeof t.data!="string"||typeof t.ts!="number")}var YE=T(()=>{"use strict"});function lu(e){if(typeof e!="object"||e===null||Array.isArray(e))return!1;let t=e;if(t.kind!=="provider"||typeof t.session_id!="string"||t.session_id===""||t.direction!=="agent_to_user"&&t.direction!=="user_to_agent"||typeof t.ts!="number")return!1;if(t.direction==="agent_to_user"){if(!Array.isArray(t.events))return!1;for(let r of t.events)if(typeof r!="object"||r===null||Array.isArray(r)||typeof r.event_type!="string")return!1}else if(typeof t.user_input!="string")return!1;return!0}var zE=T(()=>{"use strict"});function du(e){if(typeof e!="object"||e===null||Array.isArray(e))return!1;let t=e;if(t.kind!=="daemon_event"||typeof t.event!="string"||t.event===""||typeof t.ts!="number")return!1;if(t.event==="workflows"){if(!Array.isArray(t.workflows))return!1;for(let r of t.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(t.event==="chat_log"){if(typeof t.entry!="object"||t.entry===null||Array.isArray(t.entry))return!1;let r=t.entry;if(typeof r.id!="number"||typeof r.root_teamfile!="string"||r.root_teamfile===""||r.sender_teamfile!==null&&(typeof r.sender_teamfile!="string"||r.sender_teamfile==="")||r.sender_alias!==null&&(typeof r.sender_alias!="string"||r.sender_alias==="")||typeof r.receiver_teamfile!="string"||r.receiver_teamfile===""||typeof r.receiver_alias!="string"||r.receiver_alias===""||typeof r.message!="string"||r.response!==null&&typeof r.response!="string"||typeof r.status!="string"||r.status===""||typeof r.created_at!="string"||r.created_at==="")return!1}return!0}var cu,ZE=T(()=>{"use strict";cu="daemon:events"});function eT(e){return{kind:"prompt",prompt_id:e.prompt_id??Kt(e.now?.()??Date.now(),e.random??Math.random),root_teamfile:e.root_teamfile,text:e.text}}function uu(e){if(e===null||typeof e!="object")return!1;let t=e;return t.kind==="prompt"&&typeof t.prompt_id=="string"&&t.prompt_id.length>0&&typeof t.root_teamfile=="string"&&t.root_teamfile.length>0&&typeof t.text=="string"}var QE,fu=T(()=>{"use strict";ou();QE="prompt:root"});function Ns(e){let t=e.split(".");if(t.length<2||t[1]===void 0||t[1]==="")return null;try{let r=JSON.parse(rT(t[1]));return typeof r.sub=="string"&&r.sub!==""?r.sub:null}catch{return null}}function fP(e){let t=e.split(".");if(t.length<2||t[1]===void 0||t[1]==="")return null;try{let r=JSON.parse(rT(t[1]));return typeof r.exp=="number"&&Number.isFinite(r.exp)?r.exp:null}catch{return null}}function tT(e,t=60){if(typeof e!="string"||e==="")return!0;let r=fP(e);return r===null?!0:Date.now()/1e3>=r-t}function rT(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t.padEnd(Math.ceil(t.length/4)*4,"="),n=globalThis.Buffer;return n!==void 0?n.from(r,"base64").toString("utf8"):atob(r)}var mu=T(()=>{"use strict"});async function aa(e){let t=e.fetchImpl??fetch,r=`https://cognito-idp.${e.region}.amazonaws.com/`,n=await t(r,{method:"POST",headers:{"content-type":"application/x-amz-json-1.1","x-amz-target":mP},body:JSON.stringify({AuthFlow:"REFRESH_TOKEN_AUTH",ClientId:e.clientId,AuthParameters:{REFRESH_TOKEN:e.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 o=JSON.parse(s).AuthenticationResult,a=o?.IdToken;if(typeof a!="string"||a==="")throw new Error("cognito_refresh_no_id_token: InitiateAuth returned no IdToken");return{idToken:a,...typeof o?.AccessToken=="string"&&o.AccessToken!==""?{accessToken:o.AccessToken}:{},...typeof o?.ExpiresIn=="number"&&Number.isFinite(o.ExpiresIn)?{expiresAt:Date.now()+o.ExpiresIn*1e3}:{}}}var mP,pu=T(()=>{"use strict";mP="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as nT,mkdirSync as sT,readFileSync as iT,writeFileSync as oT}from"node:fs";import{homedir as aT}from"node:os";import{dirname as lT,join as cT}from"node:path";function xs(){return process.env.LMCTL_DEVICE_AUTH_PATH??cT(aT(),".lmctl","device-auth.json")}function dT(){return process.env.LMCTL_TOKEN_PATH??cT(aT(),".lmctl","cli-tokens.json")}function _u(e=xs()){try{let t=JSON.parse(iT(e,"utf8"));return typeof t.userId!="string"||t.userId===""||typeof t.refreshToken!="string"||t.refreshToken===""?null:{userId:t.userId,refreshToken:t.refreshToken}}catch{return null}}function uT(e,t=xs()){sT(lT(t),{recursive:!0,mode:448}),oT(t,JSON.stringify(e,null,2));try{nT(t,384)}catch{}}function hu(e,t=dT()){let r={};try{r=JSON.parse(iT(t,"utf8"))}catch{}let n={...r.cognito??{}};n.idToken=e.idToken,e.accessToken!==void 0&&(n.accessToken=e.accessToken),e.refreshToken!==void 0&&(n.refreshToken=e.refreshToken),e.expiresAt!==void 0&&(n.expiresAt=e.expiresAt);let s={...r,cognito:n};sT(lT(t),{recursive:!0,mode:448}),oT(t,JSON.stringify(s,null,2));try{nT(t,384)}catch{}}async function fT(e){let t=e.deviceAuthPath??xs(),r=_u(t);if(r===null)throw new Error("device_auth_not_found: no ~/.lmctl/device-auth.json; run `lmctl device login` first");let n=await aa({region:e.region,clientId:e.clientId,refreshToken:r.refreshToken,...e.fetchImpl!==void 0?{fetchImpl:e.fetchImpl}:{}});return hu({idToken:n.idToken,...n.accessToken!==void 0?{accessToken:n.accessToken}:{},refreshToken:r.refreshToken,...n.expiresAt!==void 0?{expiresAt:n.expiresAt}:{}},e.cliTokensPath??dT()),{idToken:n.idToken,userId:r.userId}}var gu=T(()=>{"use strict";pu()});import{existsSync as pP,realpathSync as _P}from"node:fs";import{dirname as hP}from"node:path";function yu(e){gP(e).catch(t=>{e.log?.(`[mailbox] prompt trigger failed: ${t instanceof Error?t.message:String(t)}`)})}async function gP(e){let t=e.payload.root_teamfile;try{t=_P(e.payload.root_teamfile)}catch(s){let i=`prompt root missing/unreadable: ${e.payload.root_teamfile}: ${s instanceof Error?s.message:String(s)}`;return await Sn(e.store,{rootTeamfile:e.payload.root_teamfile,receiverTeamfile:e.payload.root_teamfile,receiverAlias:"Lead",message:e.payload.text,response:null,status:"error",error_detail:i,log:e.log}),e.log?.(`[mailbox] ${i}`),{status:"error",response:null,error_detail:i}}if(e.store.getRootTeam(t)===null){let s=`prompt root is not registered: ${t}`;return await Sn(e.store,{rootTeamfile:t,receiverTeamfile:t,receiverAlias:"Lead",message:e.payload.text,response:null,status:"error",error_detail:s,log:e.log}),e.log?.(`[mailbox] ${s}`),{status:"error",response:null,error_detail:s}}let r=yP(t);if("error"in r)return await Sn(e.store,{rootTeamfile:t,receiverTeamfile:t,receiverAlias:"Lead",message:e.payload.text,response:null,status:"error",error_detail:r.error,log:e.log}),e.log?.(`[mailbox] ${r.error}`),{status:"error",response:null,error_detail:r.error};let n=hr(e.store,{receiver_teamfile:t,receiver_alias:r.alias,sender_teamfile:`prompt:${e.payload.prompt_id}`,sender_alias:"operator",ttlMs:TP(e.env??process.env)});if(!n.acquired){let s=EP(r.alias,n.current);return await Sn(e.store,{rootTeamfile:t,receiverTeamfile:t,receiverAlias:r.alias,message:e.payload.text,response:null,status:"error",error_detail:s,log:e.log}),e.log?.(`[mailbox] prompt rejected: ${s}`),{status:"error",response:null,error_detail:s}}try{let i=await(e.chat??St)({provider:r.provider,sessionId:r.sessionid,cwd:r.sessiondir,prompt:e.payload.text,env:e.env??process.env,alias:r.alias,permissionMode:"yolo",...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{}}),o=i.status==="stalled",a=!o&&i.text.trim()==="",l=o?`provider stalled${i.stalledAfterMs!==void 0?` after ${i.stalledAfterMs}ms`:""}`:a?"provider returned empty response":null,c=o||a?"error":"ok";return await Sn(e.store,{rootTeamfile:t,receiverTeamfile:t,receiverAlias:r.alias,message:e.payload.text,response:c==="error"?null:i.text,status:c,error_detail:l,log:e.log}),{status:c,response:c==="error"?null:i.text,error_detail:l}}catch(s){let i=s instanceof Error?s.message:String(s);return await Sn(e.store,{rootTeamfile:t,receiverTeamfile:t,receiverAlias:r.alias,message:e.payload.text,response:null,status:"error",error_detail:i,log:e.log}),e.log?.(`[mailbox] prompt provider error: ${i}`),{status:"error",response:null,error_detail:i}}finally{try{e.store.releaseAgentInflight(n.lease)}catch(s){e.log?.(`[mailbox] failed to release prompt in-flight slot: ${s instanceof Error?s.message:String(s)}`)}}}function yP(e){if(!pP(e))return{error:`prompt root missing/unreadable: ${e}`};let t=De(e);if(t.parseErrors.length>0)return{error:`prompt root parse error: ${t.parseErrors.join("; ")}`};let r=At(t);return r===void 0?{error:`prompt root has no Lead: ${e}`}:r.session===void 0||r.session.trim()===""?{error:`prompt root Lead is unseeded: ${e}`}:{alias:r.alias,provider:r.provider,sessionid:r.session,sessiondir:r.sessiondir??hP(e)}}async function Sn(e,t){let r=_T(t.message),n=t.response===null?null:_T(t.response);try{e.insertTeamChatLog({root_teamfile:t.rootTeamfile,sender_teamfile:t.rootTeamfile,sender_alias:"operator",receiver_teamfile:t.receiverTeamfile,receiver_alias:t.receiverAlias,message:r.text,response:n?.text??null,origin:"unknown",status:t.status,error_detail:t.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()})}catch(s){t.log?.(`[mailbox] warning: failed to record prompt chat log: ${s instanceof Error?s.message:String(s)}`)}}function _T(e){return e.length<=mT?{text:e,truncated:!1}:{text:e.slice(0,mT),truncated:!0}}function wP(e,t){return`${e} is servicing ${t.sender_alias} (${t.sender_teamfile}) since ${t.started_at}`}function EP(e,t){return t.sender_teamfile.startsWith("prompt:")?`${e} is busy servicing another prompt since ${t.started_at}`:wP(e,t)}function TP(e=process.env){let t=e.LMCTL_INFLIGHT_TTL_MS;if(t===void 0||t.trim()==="")return pT;let r=Number(t);return!Number.isFinite(r)||r<=0?pT:r}var mT,pT,hT=T(()=>{"use strict";vt();Yt();Fr();mT=256*1024,pT=30*60*1e3});import{chmodSync as bT,existsSync as bP,mkdirSync as ST,readFileSync as ua,writeFileSync as vT}from"node:fs";import{dirname as wu,resolve as la,join as kT}from"node:path";import{fileURLToPath as SP}from"node:url";import{homedir as IT}from"node:os";import{CognitoIdentityClient as vP,GetIdCommand as kP}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as gT}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as IP,ListObjectsV2Command as NP,PutObjectCommand as xP,S3Client as yT}from"@aws-sdk/client-s3";function Rs(e={}){let t=e.env??process.env,r=e.tfstatePath!==void 0?[e.tfstatePath]:$P(e.selfUrl),n={},s;for(let I of r)if(bP(I)){n=OP(I),s=I;break}let i=(...I)=>{for(let x of I)if(typeof x=="string"&&x!=="")return x},o=i(t.LMCTL_NEXT_IDENTITY_POOL_ID,n.LMCTL_NEXT_IDENTITY_POOL_ID)??AP,a=i(t.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??RP,l=i(t.LMCTL_NEXT_MAILBOX_BUCKET,t.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??LP,c=i(t.AWS_REGION,t.AWS_DEFAULT_REGION)??"us-east-1",d=i(t.LMCTL_NEXT_COGNITO_CLIENT_ID,n.LMCTL_NEXT_COGNITO_CLIENT_ID)??fa,u=[];o===void 0&&u.push("LMCTL_NEXT_IDENTITY_POOL_ID"),a===void 0&&u.push("LMCTL_NEXT_COGNITO_USER_POOL_ID"),l===void 0&&u.push("LMCTL_NEXT_MAILBOX_BUCKET");let f={missing:u,tfstateCandidatesChecked:r,...s!==void 0?{tfstatePathUsed:s}:{}};if(u.length>0)return f;let m=t.LMCTL_MAILBOX_POLL_MS,p=m!==void 0&&m.length>0?Number(m):void 0,_=da(t.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),g=da(t.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),h=da(t.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),S=da(t.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),y=i(t.LMCTL_MAILBOX_KEY),w=i(t.LMCTL_TOKEN_PATH);return f.config={identityPoolId:o,cognitoUserPoolId:a,cognitoClientId:d,region:c,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},..._!==void 0?{readIntervalMs:_}:{},...g!==void 0?{heartbeatIdleMs:g}:{},...h!==void 0?{backoffReadIntervalMs:h}:{},...S!==void 0?{chatLogPollIntervalMs:S}:{},...y!==void 0?{mailboxKey:y}:{},...w!==void 0?{tokenPath:w}:{}},f}function OP(e){try{let t=ua(e,"utf8"),n=JSON.parse(t).outputs??{},s={};for(let[i,o]of Object.entries(n))o!==null&&typeof o=="object"&&typeof o.value=="string"&&(s[i]=o.value);return s}catch{return{}}}function $P(e){let t=wu(SP(e??import.meta.url));return[la(t,"..","..","..","..","infra","terraform","terraform.tfstate"),la(t,"..","..","..","..","..","infra","terraform","terraform.tfstate"),la(t,"..","..","..","infra","terraform","terraform.tfstate"),la(t,"..","..","infra","terraform","terraform.tfstate")]}function da(e){if(e===void 0||e==="")return;let t=Number(e);if(!(!Number.isFinite(t)||t<=0))return t*1e3}function CP(e){let t=MP(e.intervalMs)??NT,r=Math.max(1,Math.trunc(e.limit??500)),n=e.now??Date.now,s=e.cursorKey!==void 0&&e.store.loadTeamChatLogCursor!==void 0&&e.store.saveTeamChatLogCursor!==void 0?{key:e.cursorKey,load:e.store.loadTeamChatLogCursor.bind(e.store),save:e.store.saveTeamChatLogCursor.bind(e.store)}:null,i,o=!1,a=!1,l=()=>{try{if(s!==null){let u=s.load(s.key);if(u!==null)return i=u.last_pushed_id,!0}return i=e.store.getMaxTeamChatLogId(),s!==null&&s.save({cursor_key:s.key,last_pushed_id:i,updated_at:new Date(n()).toISOString()}),!0}catch(u){return e.log?.(`[mailbox] daemon_event chat_log seed failed: ${u instanceof Error?u.message:String(u)}`),!1}};l();let c=async()=>{if(!(a||o)){o=!0;try{if(i===void 0&&!l())return;let u=e.store.listTeamChatLogSinceId(i,r);for(let f of u){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 e.publishDaemonEvent(m),s!==null&&s.save({cursor_key:s.key,last_pushed_id:f.id,updated_at:new Date(n()).toISOString()}),i=Math.max(i,f.id)}}catch(u){e.log?.(`[mailbox] daemon_event chat_log tail failed: ${u instanceof Error?u.message:String(u)}`)}finally{o=!1}}},d=setInterval(()=>{c()},t);return typeof d.unref=="function"&&d.unref(),{pollNow:c,stop(){a=!0,clearInterval(d)}}}function MP(e){return typeof e=="number"&&Number.isFinite(e)&&e>0?e:void 0}async function xT(e){let t=e.tokenPath??kT(IT(),".lmctl","cli-tokens.json"),r=ET(e.tokenPath);if(tT(r.cognito?.idToken)&&_u()!==null)try{await fT({region:e.region,clientId:e.cognitoClientId??fa,cliTokensPath:t}),r=ET(e.tokenPath),e.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(A){let Q=A instanceof Error?A.message:String(A);e.log?.(`[mx-mailbox] device-auth refresh failed: ${Q}`)}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.${e.region}.amazonaws.com/${e.cognitoUserPoolId}`,i=r.cognito.identityId,o=!1;i===void 0||i===""?i=await TT({tokenPath:t,region:e.region,identityPoolId:e.identityPoolId,idpProvider:s,idToken:n,log:e.log}):(o=!0,e.log?.(`[mx-mailbox] using cached identityId from cli-tokens (skipping GetId) for ${i}`));let a=gT({identityId:i,logins:{[s]:n},clientConfig:{region:e.region}}),l=new yT({region:e.region,credentials:a}),c={ListObjectsV2Command:NP,GetObjectCommand:IP,PutObjectCommand:xP},d=Ns(n),u=d??i,f=e.deviceId,m=gn({identityId:i,userId:d,deviceId:f,mailboxKey:e.mailboxKey}),p=e.cursorStore,_;if(p!==void 0){let A=p.loadMailboxCursor(u,m);if(A!==null)_=A.last_processed_seq??void 0,e.log?.(`[mx-mailbox] resumed seq cursor=${_??"(sentinel)"} for user_id=${u}`);else{let Q=!1,B=0;for(;!Q&&B<2;){B+=1;try{let k=$o(m,"web"),N=0,L;do{let F=await l.send(new c.ListObjectsV2Command({Bucket:e.mailboxBucket,Prefix:k,MaxKeys:1e3,...L!==void 0?{ContinuationToken:L}:{}}));for(let j of F.Contents??[]){let C=Co(j.Key??"",m,"web");C!==void 0&&C>N&&(N=C)}L=F.IsTruncated===!0?F.NextContinuationToken:void 0}while(L!==void 0);_=N,e.log?.(`[mx-mailbox] cold start: seeded seq cursor=${N} for user_id=${u}`),Q=!0}catch(k){let N=k instanceof Error?k.message:String(k);if(o&&B===1&&PP(k)){e.log?.(`[mx-mailbox] cached identityId rejected by cognito (${N}); clearing + refreshing`),DP(t),o=!1,i=await TT({tokenPath:t,region:e.region,identityPoolId:e.identityPoolId,idpProvider:s,idToken:n,log:e.log}),a=gT({identityId:i,logins:{[s]:n},clientConfig:{region:e.region}}),l=new yT({region:e.region,credentials:a}),m=gn({identityId:i,userId:d,deviceId:f,mailboxKey:e.mailboxKey});continue}e.log?.(`[mx-mailbox] cold start seq probe failed: ${N}`);break}}p.saveMailboxCursor({user_id:u,mailbox_key:m,last_processed_version_id:null,last_processed_seq:_??null,last_processed_at:new Date().toISOString()})}}let g=null,h=e.terminalSessionManager,S=e.persistentSessionManager,y=e.promptTriggerStore,w=new ia,I=new Dr({bucket:e.mailboxBucket,identityId:i,...d!==null?{userId:d}:{},...f!==void 0?{deviceId:f}:{},...e.mailboxKey!==void 0?{mailboxKey:e.mailboxKey}:{},s3:l,commands:c,selfRole:"agent",onS3Op:A=>w.record(A),onMessage:async A=>{if(h!==void 0&&au(A.payload)){h.onInbound(A.payload);return}if(S!==void 0&&lu(A.payload)){await S.onInbound(A.payload);return}if(!du(A.payload)){if(y!==void 0&&uu(A.payload)){yu({store:y,payload:A.payload,log:e.log});return}g!==null&&await g.handleIncoming(A.payload,A)}},...p!==void 0?{onCursorAdvance:A=>{p.saveMailboxCursor({user_id:u,mailbox_key:m,last_processed_version_id:null,last_processed_seq:A,last_processed_at:new Date().toISOString()})}}:{},..._!==void 0?{cursor:_}:{},...e.pollIntervalMs!==void 0?{pollIntervalMs:e.pollIntervalMs}:{},...e.readIntervalMs!==void 0?{readIntervalMs:e.readIntervalMs}:{},...e.heartbeatIdleMs!==void 0?{heartbeatIdleMs:e.heartbeatIdleMs}:{},...e.backoffReadIntervalMs!==void 0?{backoffReadIntervalMs:e.backoffReadIntervalMs}:{}});g=new Is({client:I,...e.log!==void 0?{log:e.log}:{}}),h!==void 0&&h.setPublish(async A=>I.putMessage({conversation_id:`terminal:${A.session_id}`,payload:A})),S!==void 0&&S.setPublish(async A=>I.putMessage({conversation_id:`provider:${A.session_id}`,payload:A}));let x=A=>I.putMessage({conversation_id:cu,payload:A});I.start();let U=e.chatLogTailStore===void 0?void 0:CP({store:e.chatLogTailStore,publishDaemonEvent:x,cursorKey:m,intervalMs:e.chatLogPollIntervalMs??e.readIntervalMs??e.pollIntervalMs??NT,log:e.log});e.log?.(`[mx-mailbox] agent polling ${m} (bucket=${e.mailboxBucket})`);let ue=e.deviceId??i,W=`${u}/usage/`,M;return M=e.usageStore===void 0?void 0:XE({meter:w,store:e.usageStore,userId:u,deviceId:ue,ceilingUsd:e.usageQuotaUsd??1/0,onQuotaExceeded:({period:A,costUsd:Q,ceilingUsd:B})=>{e.log?.(`[usage] month ${A} cost $${Q.toFixed(4)} >= ceiling $${B} \u2014 blocking mailbox`),I.stop().catch(()=>{}),M?.stop()},publishOwnRollup:async(A,Q)=>{await l.send(new c.PutObjectCommand({Bucket:e.mailboxBucket,Key:`${W}${ue}-${A}.json`,Body:JSON.stringify({...Q,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async A=>{let Q={put:0,get:0,list:0},B;do{let k=await l.send(new c.ListObjectsV2Command({Bucket:e.mailboxBucket,Prefix:W,MaxKeys:1e3,...B!==void 0?{ContinuationToken:B}:{}}));for(let N of k.Contents??[]){let L=N.Key??"";if(L.endsWith(`-${A}.json`))try{let F=await l.send(new c.GetObjectCommand({Bucket:e.mailboxBucket,Key:L}));if(F.Body===void 0)continue;let j=JSON.parse(await F.Body.transformToString("utf-8"));Q.put+=j.put??0,Q.get+=j.get??0,Q.list+=j.list??0}catch{}}B=k.IsTruncated===!0?k.NextContinuationToken:void 0}while(B!==void 0);return Q},intervalMs:e.usageFlushIntervalMs??36e5,...e.log!==void 0?{log:e.log}:{}}),{identityId:i,mailbox:I,fetchClient:g,publishDaemonEvent:x,async stop(){U?.stop(),M!==void 0&&(await M.flushNow().catch(()=>{}),M.stop()),await g.stop().catch(()=>{}),await I.stop().catch(()=>{})}}}async function AT(e){let t=e.s3!==void 0&&e.commands!==void 0?{s3:e.s3,commands:e.commands}:sa(e.rootDir),r=gn({identityId:As,userId:As,deviceId:wT}),n=null,s=e.terminalSessionManager,i=e.persistentSessionManager,o=e.promptTriggerStore,a=new Dr({bucket:"local",identityId:As,userId:As,deviceId:wT,s3:t.s3,commands:t.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&au(c.payload)){s.onInbound(c.payload);return}if(i!==void 0&&lu(c.payload)){await i.onInbound(c.payload);return}if(!du(c.payload)){if(o!==void 0&&uu(c.payload)){yu({store:o,payload:c.payload,log:e.log});return}n!==null&&await n.handleIncoming(c.payload,c)}},pollIntervalMs:e.pollIntervalMs??ca,readIntervalMs:e.readIntervalMs??ca,heartbeatIdleMs:e.heartbeatIdleMs??ca,backoffReadIntervalMs:e.backoffReadIntervalMs??ca});n=new Is({client:a,...e.log!==void 0?{log:e.log}:{}}),s!==void 0&&s.setPublish(async c=>a.putMessage({conversation_id:`terminal:${c.session_id}`,payload:c})),i!==void 0&&i.setPublish(async c=>a.putMessage({conversation_id:`provider:${c.session_id}`,payload:c}));let l=c=>a.putMessage({conversation_id:cu,payload:c});return a.start(),e.log?.(`[local-webui] agent polling ${r} (local-fs ${e.rootDir})`),{identityId:As,mailbox:a,fetchClient:n,publishDaemonEvent:l,async stop(){await n.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function ET(e){let t=e??kT(IT(),".lmctl","cli-tokens.json");try{let r=ua(t,"utf8");return JSON.parse(r)}catch{return{}}}function jP(e,t){if(t===void 0||t==="")return;let r={};try{let s=ua(e,"utf8");r=JSON.parse(s)}catch{}if(r.cognito===void 0)return;let n={...r,cognito:{...r.cognito,identityId:t}};ST(wu(e),{recursive:!0,mode:448}),vT(e,JSON.stringify(n,null,2));try{bT(e,384)}catch{}}function DP(e){let t={};try{let n=ua(e,"utf8");t=JSON.parse(n)}catch{return}if(t.cognito===void 0)return;let r={...t,cognito:{...t.cognito}};delete r.cognito.identityId,ST(wu(e),{recursive:!0,mode:448}),vT(e,JSON.stringify(r,null,2));try{bT(e,384)}catch{}}async function TT(e){e.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new vP({region:e.region}).send(new kP({IdentityPoolId:e.identityPoolId,Logins:{[e.idpProvider]:e.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{jP(e.tokenPath,r.IdentityId),e.log?.(`[mx-mailbox] persisted identityId=${r.IdentityId} to ${e.tokenPath}`)}catch(n){let s=n instanceof Error?n.message:String(n);e.log?.(`[mx-mailbox] WARNING: identityId persist failed (${s}); will redo GetId on next restart`)}return r.IdentityId}function PP(e){if(e===null||typeof e!="object")return!1;let t=e,r=[typeof t.name=="string"?t.name:void 0,typeof t.Code=="string"?t.Code:void 0,typeof t.__type=="string"?t.__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 t.message=="string"?t.message:"";return!!(n.includes("NotAuthorizedException")||n.includes("Invalid identity pool configuration")||n.includes("Identity")&&n.includes("not found"))}var NT,ca,fa,AP,RP,LP,As,wT,Eu=T(()=>{"use strict";Po();ru();iu();GE();KE();YE();zE();ZE();fu();Mo();mu();gu();hT();NT=3e3,ca=1e3,fa="79u5jhkk46qofog661c9i0bdcs",AP="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",RP="us-east-1_4iUdFggDn",LP="lmctl-next-preview-mailbox-254332045686";As="local",wT="local"});import{spawn as vu}from"node:child_process";import{createInterface as RT}from"node:readline";var Tu,bu,Su,LT,OT=T(()=>{"use strict";fi();we();Tu=class{child;ctx;rl;nextRpcId=1;pending=new Map;threadId;nextLocalTurnId=1;closed=!1;setResumeThreadId(t){this.threadId=t}async start(t,r){this.ctx=r;let n=vu(t.command,t.args,{cwd:t.cwd??process.cwd(),env:t.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=RT({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 i=s instanceof Buffer?s.toString("utf8"):String(s);r.emit({event_type:"notification",payload:{source:"stderr",text:i}})}),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 i=(await this.rpc("thread/start",{cwd:t.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,o=typeof i?.id=="string"?i.id:void 0;this.threadId=o,r.emit({event_type:"thread_started",payload:{thread_id:o,resumed:!1}})}else{let i=(await this.rpc("thread/start",{cwd:t.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,o=typeof i?.id=="string"?i.id:void 0;this.threadId=o,r.emit({event_type:"thread_started",payload:{thread_id:o,resumed:!1}})}return n}async sendTurn(t){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:t}]})).result?.turn,i=typeof s?.id=="string"?s.id:void 0;if(i!==void 0){let o=this.ctx?.turnMap.get(r);this.ctx?.turnMap.delete(r),o!==void 0&&this.ctx?.turnMap.set(i,o)}}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 t of this.pending.values())t.reject(new Error("codex_session_stopping"));this.pending.clear()}async rpc(t,r){if(this.child?.stdin===null||this.child===void 0)throw new Error("codex_child_unavailable");return new Promise((n,s)=>{let i=this.nextRpcId++;this.pending.set(i,{resolve:n,reject:s});let o=JSON.stringify({jsonrpc:"2.0",id:i,method:t,params:r});try{this.child.stdin.write(o+`
|
|
2043
|
+
Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var ye,jD,DD,sa,Lt=T(()=>{"use strict";Yt();Rt();ye=class extends Error{constructor(t){super(t),this.name="ChatTargetError"}},jD=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,DD=/^ses_[A-Za-z0-9_-]+$/,sa=/^[A-Za-z][A-Za-z0-9_-]*$/});function FD(e=process.env){let t=e.LMCTL_DAEMON_MAILBOX_RELAY_MAX_BATCHES;if(t===void 0||t.trim()==="")return AE;let r=Number(t);return!Number.isFinite(r)||r<=0?AE:Math.max(1,Math.trunc(r))}async function LE(e){let t=e.env??process.env,r=e.maxBatches??FD(t),n=XD(e.dal),s={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0};JD(e.dal,t);let i=new Set;for(;s.scanned<r;){let o=e.dal.listRelayMailboxLanes(r).find(l=>!i.has(RE(l)));if(o===void 0)break;i.add(RE(o)),s.scanned+=1;let a=await UD(e.dal,n,t,o);s.delivered+=a.delivered,s.skipped_busy+=a.skipped_busy,s.skipped_terminal+=a.skipped_terminal,s.errors+=a.errors}return s}function RE(e){return JSON.stringify([e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias])}async function UD(e,t,r,n){let s={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0},i=Pr(e,n.receiver_teamfile,n.receiver_alias);if(i.busy)return i.reason==="terminal-held"?{...s,skipped_terminal:1}:{...s,skipped_busy:1};let o=null;try{let a=He(n.receiver_teamfile,n.receiver_alias,e),l=hr(e,{receiver_teamfile:n.receiver_teamfile,receiver_alias:n.receiver_alias,sender_teamfile:n.sender_teamfile,sender_alias:n.sender_alias,ttlMs:gr()});if(!l.acquired)return{...s,skipped_busy:1};if(o=l.lease,n.message_type==="response"){let d=await oE({sender:{teamfile:n.sender_teamfile,alias:n.sender_alias},receiver:{teamfile:n.receiver_teamfile,alias:n.receiver_alias,provider:a.provider,sessionId:a.sessionid,cwd:a.sessiondir,...a.model!==void 0?{model:a.model}:{},...a.effort!==void 0?{effort:a.effort}:{},...a.isLead!==void 0?{isLead:a.isLead}:{}},io:t,permissionMode:"yolo",env:r});return qD(d)}let c=await Qo({sender:{teamfile:n.sender_teamfile,alias:n.sender_alias},receiver:{teamfile:n.receiver_teamfile,alias:n.receiver_alias,provider:a.provider,sessionId:a.sessionid,cwd:a.sessiondir,...a.model!==void 0?{model:a.model}:{},...a.effort!==void 0?{effort:a.effort}:{},...a.isLead!==void 0?{isLead:a.isLead}:{}},io:t,permissionMode:"yolo",env:r,finalize:"caller"});return BD(e,c)}catch(a){return WD(e,n,`relay delivery error: ${a instanceof Error?a.message:String(a)}`)}finally{if(o!==null)try{e.releaseAgentInflight(o)}catch{}}}function WD(e,t,r){let n={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0};try{let s=t.message_type==="response"?e.listEnqueuedResponseMailFromSender(t.sender_teamfile,t.sender_alias,t.receiver_teamfile,t.receiver_alias):e.listEnqueuedRequestMailFromSender(t.sender_teamfile,t.sender_alias,t.receiver_teamfile,t.receiver_alias),i=t.message_type==="response"?e.markMailDelivered(s.map(o=>o.id),r,new Date().toISOString()):e.markRelayRequestDeliveredAndEnqueueResponses(s,r,new Date().toISOString()).marked;return{...n,delivered:i,errors:1}}catch{return{...n,errors:1}}}function BD(e,t){let r={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0},n=HD(t),s=new Date().toISOString(),{marked:i}=e.markRelayRequestDeliveredAndEnqueueResponses(t.queued,n,s);return{...r,delivered:i,errors:t.status==="ok"?0:1}}function qD(e){return{...{scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0},delivered:e.deliveredIds.length,errors:e.status==="ok"?0:1}}function HD(e){return e.status==="ok"?e.receipt:e.status==="stalled"?`relay delivery error: provider stalled${e.stalledAfterMs!==void 0?` after ${e.stalledAfterMs}ms`:""}
|
|
2044
|
+
${e.receipt}`:`relay delivery error: ${e.error}`}function JD(e,t){let r=t.LMCTL_MAILBOX_DELIVERY_STALE_MS,n=r===void 0||r.trim()===""?NaN:Number(r),s=Number.isFinite(n)&&n>0?n:8*60*60*1e3;e.reclaimStaleMailboxDeliveries(new Date(Date.now()-s).toISOString())}function XD(e){return{stdout:{write:()=>{}},stderr:{write:()=>{}},dal:e}}var AE,OE=T(()=>{"use strict";Fr();Xd();ea();Lt();AE=10});function ks(){let e=process.env.LMCTL_DAEMON_INTERVAL_MS;if(e===void 0||e.trim().length===0)return 5e3;let t=Number(e);return Number.isFinite(t)&&t>0?t:5e3}function VD(e=process.env){let t=e.LMCTL_DAEMON_FEATURES;if(t===void 0)return new Set(["mailbox-relay"]);if(t.trim()==="")return new Set;let r=new Set;for(let n of t.split(",")){let s=n.trim();if(s!==""){if(s==="all")return new Set($E);GD.has(s)&&r.add(s)}}return r}function CE(e){let t=e.intervalMs??ks(),r=e.runOnceFn??jr,n=new Set(e.features??VD()),s={running:e.autoStart!==!1,in_flight:!1,interval_ms:t,enabled_features:[...n].sort(),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,last_mailbox_relay_scanned:0,last_mailbox_relay_delivered:0,last_mailbox_relay_errors:0},i=null,o=null,a=null,l=null,c=null;n.has("rollup-updater")&&e.startRollupUpdaterFn!==!1&&(c=(e.startRollupUpdaterFn??Xw)(e.dal));let d=m=>{s.running&&(i=setTimeout(()=>{f.runCycle().finally(()=>d(t))},m))},u=m=>{s.running&&(o=setTimeout(()=>{l===null&&(l=ME(e.dal,n,e.monitorSessionActivityFn??yc,t,s).finally(()=>{l=null})),l.finally(()=>u(wc(e.dal,t)))},m))},f={state:s,runCycle:async()=>(a!==null||(a=KD(e.dal,r,e.collectSessionSizesFn??p_,e.scanIntakeFn??lo,e.monitorSessionActivityFn??yc,e.mailboxRelayFn??LE,e.worker_id??"daemon",t,n,s).finally(()=>{a=null})),a),stop:async()=>{s.running=!1,i!==null&&clearTimeout(i),o!==null&&clearTimeout(o),c?.stop(),a!==null&&await a.catch(()=>{}),l!==null&&await l.catch(()=>{})}};if(s.running){let m=e.firstDelayMs??5e3;d(m),n.has("session-monitor")&&u(m)}return f}async function KD(e,t,r,n,s,i,o,a,l,c){c.in_flight=!0,c.last_started_at=new Date().toISOString(),c.last_error=null;let d=[],u=0,f=0,m=[],p=null,_=YD();try{if(l.has("durable-memory-policies")&&by({dal:e}),l.has("drift-detectors")&&Kw({dal:e}),l.has("intake")&&(m=await n(e)),l.has("job-worker"))for(;;){let g=await t({dal:e,worker_id:o,lease_ms:6e5});if(g===null)break;d.push(g)}if(l.has("mailbox-relay")&&(_=await i({dal:e})),l.has("session-size")){let g=await r(e);u=g.recorded,f=g.failed}l.has("session-monitor")&&(p=await ME(e,l,s,a,c))}catch(g){c.last_error=g instanceof Error?g.message:String(g);try{e.raiseAttention({kind:"daemon_worker_failed",severity:"error",payload:JSON.stringify({error:c.last_error})})}catch{}}finally{c.in_flight=!1,c.cycles+=1,c.last_jobs_processed=d.length,c.last_session_sizes_recorded=u,c.last_session_size_failures=f,c.last_intake_scanned=m.reduce((g,h)=>g+h.scanned,0),c.last_intake_new_jobs=m.reduce((g,h)=>g+h.new_jobs,0),c.last_intake_failures=m.filter(g=>g.error!==void 0).length,c.last_session_hung_detected=p?.hung_detected??0,c.last_mailbox_relay_scanned=_.scanned,c.last_mailbox_relay_delivered=_.delivered,c.last_mailbox_relay_errors=_.errors,c.jobs_processed+=d.length,c.last_finished_at=new Date().toISOString()}return{jobs_processed:d.length,outcomes:d,session_sizes_recorded:u,session_size_failures:f,intake:m,session_monitor:p,mailbox_relay:_}}function YD(){return{scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0}}async function ME(e,t,r,n,s){if(!t.has("session-monitor"))return null;let i=wc(e,n),o=Date.now();if(s.last_session_monitor_checked_at!==null){let a=Date.parse(s.last_session_monitor_checked_at);if(Number.isFinite(a)&&o-a<i)return null}s.last_session_monitor_checked_at=new Date(o).toISOString(),s.last_session_monitor_error=null;try{return await r({dal:e,nowMs:o})}catch(a){s.last_session_monitor_error=a instanceof Error?a.message:String(a);try{e.raiseAttention({kind:"daemon_session_monitor_failed",severity:"error",payload:JSON.stringify({error:s.last_session_monitor_error})})}catch{}return null}}var $E,GD,Zd=T(()=>{"use strict";qc();Lo();Ed();Mi();Gw();Yw();Ec();OE();$E=["durable-memory-policies","drift-detectors","intake","job-worker","mailbox-relay","session-size","session-monitor","rollup-updater"],GD=new Set($E)});function jE(e){let t=e.listMembersInState("in_chat");for(let r of t)e.setMemberState(r.id,"attention_needed","daemon_restarted_mid_chat");return t.length}var DE=T(()=>{"use strict"});import{mkdirSync as zD,readFileSync as ZD,readdirSync as QD,statSync as eP,writeFileSync as tP}from"node:fs";import{dirname as rP,join as FE,sep as PE}from"node:path";function ia(e){return{s3:{async send(n){let s=n;switch(s._localfsTag){case UE:return nP(e,s.input);case WE:return sP(e,s.input);case BE:return iP(e,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:tu,GetObjectCommand:eu,PutObjectCommand:Qd}}}function nP(e,t){let r=qE(e,t.Key);return zD(rP(r),{recursive:!0}),tP(r,t.Body),{}}function sP(e,t){let r=qE(e,t.Key),n;try{n=ZD(r)}catch(i){throw i.code==="ENOENT"?Object.assign(new Error("NoSuchKey"),{name:"NoSuchKey"}):i}let s=n.toString("utf-8");return{Body:{transformToString:async()=>s}}}function iP(e,t){let r=t.Prefix??"";HE(r);let s=oP(e).sort((d,u)=>d.key<u.key?-1:d.key>u.key?1:0).filter(d=>d.key.startsWith(r)),i=t.ContinuationToken;i!==void 0&&i!==""&&(s=s.filter(d=>d.key>i));let o=typeof t.MaxKeys=="number"&&Number.isFinite(t.MaxKeys)&&t.MaxKeys>0?Math.floor(t.MaxKeys):void 0,a=s,l=!1;o!==void 0&&s.length>o&&(a=s.slice(0,o),l=!0);let c={Contents:a.map(d=>({Key:d.key,LastModified:d.lastModified})),IsTruncated:l};return l&&(c.NextContinuationToken=a[a.length-1].key),c}function qE(e,t){return HE(t),FE(e,t)}function HE(e){if(e.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${e}`)}function oP(e){let t=[],r=(n,s)=>{let i;try{i=QD(n,{withFileTypes:!0})}catch(o){if(o.code==="ENOENT")return;throw o}for(let o of i){let a=s===""?o.name:`${s}/${o.name}`,l=FE(n,o.name);if(o.isDirectory())r(l,a);else if(o.isFile()){let c=PE==="/"?a:a.split(PE).join("/");t.push({key:c,lastModified:eP(l).mtime})}}};return r(e,""),t}var UE,WE,BE,Qd,eu,tu,ru=T(()=>{"use strict";UE="localfs-put",WE="localfs-get",BE="localfs-list",Qd=class{input;_localfsTag=UE;constructor(t){this.input=t}},eu=class{input;_localfsTag=WE;constructor(t){this.input=t}},tu=class{input;_localfsTag=BE;constructor(t){this.input=t}}});function JE(){return{put:0,get:0,list:0}}function nu(e,t=aP){return e.put*t.putUsd+e.get*t.getUsd+e.list*t.listUsd}function su(e){let t=new Date(e),r=t.getUTCFullYear(),n=String(t.getUTCMonth()+1).padStart(2,"0");return`${r}-${n}`}var aP,oa,iu=T(()=>{"use strict";aP={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};oa=class{counts=JE();record(t,r=1){this.counts[t]+=r}peek(){return{...this.counts}}drain(){let t={...this.counts};return this.counts=JE(),t}estimateCostUsd(t){return nu(this.counts,t)}}});function XE(e){let t=e.now??Date.now,r=e.timers??lP,n=null,s=null;async function i(){let l=t(),c=su(l),d=e.meter.drain();(d.put>0||d.get>0||d.list>0)&&e.store.addUsage({user_id:e.userId,device_id:e.deviceId,period:c,put:d.put,get:d.get,list:d.list,updated_at:new Date(l).toISOString()});let u=e.store.loadUsage(e.userId,e.deviceId,c),f=u?{put:u.put_count,get:u.get_count,list:u.list_count}:{put:0,get:0,list:0};if(e.publishOwnRollup!==void 0)try{await e.publishOwnRollup(c,f)}catch(_){e.log?.(`[usage] publish rollup failed: ${_ instanceof Error?_.message:String(_)}`)}let m=f;if(e.readUserTotal!==void 0)try{m=await e.readUserTotal(c)}catch(_){e.log?.(`[usage] read user total failed: ${_ instanceof Error?_.message:String(_)}`),m=f}let p=nu(m);if(n!==c&&p>=e.ceilingUsd){n=c,e.log?.(`[usage] quota exceeded period=${c} cost=$${p.toFixed(4)} >= ceiling $${e.ceilingUsd}`);try{e.onQuotaExceeded({period:c,costUsd:p,ceilingUsd:e.ceilingUsd})}catch(_){e.log?.(`[usage] onQuotaExceeded threw: ${_ instanceof Error?_.message:String(_)}`)}}}function o(){return s=(s??Promise.resolve()).then(()=>i()).catch(()=>{}),s}let a=r.setInterval(()=>{o()},e.intervalMs);return{stop(){r.clearInterval(a)},flushNow(){return o()},isOverQuota(){return n!==null&&n===su(t())}}}var lP,GE=T(()=>{"use strict";iu();lP={setInterval:(e,t)=>setInterval(e,t),clearInterval:e=>clearInterval(e)}});var ou=T(()=>{"use strict";jo();Po();Po()});function cP(e){if(typeof e!="object"||e===null||Array.isArray(e))return null;let t=e;if(typeof t.message_id!="string"||t.message_id==="")return null;if(typeof t.reply_to=="string"&&t.reply_to!==""){let s=t.response;if(typeof s!="object"||s===null)return null;let i=s;return typeof i.status!="number"?null:{message_id:t.message_id,reply_to:t.reply_to,response:i}}let r=t.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:t.message_id,request:n}}function dP(e){return e.reply_to!==void 0&&e.response!==void 0}function uP(e){if(typeof e!="object"||e===null)return;let t=e.conversation_id;return typeof t=="string"?t:void 0}function VE(e){let t=e.reason;if(t!==void 0)return t;try{return new DOMException("Aborted","AbortError")}catch{let r=new Error("Aborted");return r.name="AbortError",r}}var aa,Is,KE=T(()=>{"use strict";ou();aa=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(t="MailboxFetchClient stopped before a response arrived"){super(t)}},Is=class{client;log;now;random;pending=new Map;requestHandler=null;stopped=!1;constructor(t){this.client=t.client,this.log=t.log??(()=>{}),this.now=t.now??Date.now,this.random=t.random??Math.random}onRequest(t){if(this.requestHandler!==null)throw new Error("MailboxFetchClient: onRequest handler already registered");this.requestHandler=t}async fetch(t,r){if(this.stopped)throw new aa("MailboxFetchClient.fetch after stop()");if(typeof t.path!="string"||t.path==="")throw new Error("MailboxFetchClient.fetch: request.path is required");let n=t.method;if(typeof n!="string"||n==="")throw new Error("MailboxFetchClient.fetch: request.method is required");let s=Kt(this.now(),this.random);if(this.pending.has(s))throw new Error(`MailboxFetchClient.fetch: duplicate message_id=${s}`);let i=r?.conversationId??s,o={message_id:s,request:t};return new Promise((a,l)=>{let c=r?.abortSignal,d;if(c!==void 0){if(c.aborted){l(VE(c));return}d=()=>{this.pending.has(s)&&(this.pending.delete(s),l(VE(c)))},c.addEventListener("abort",d,{once:!0})}this.pending.set(s,{resolve:a,reject:l,...d!==void 0?{abortListener:d}:{},...c!==void 0?{abortSignal:c}:{}}),this.client.putMessage({conversation_id:i,payload:o}).catch(u=>{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(u))})})}async stop(){if(this.stopped)return;this.stopped=!0;let t=Array.from(this.pending.values());this.pending.clear();let r=new aa;for(let n of t){n.abortListener!==void 0&&n.abortSignal!==void 0&&n.abortSignal.removeEventListener("abort",n.abortListener);try{n.reject(r)}catch{}}}async handleIncoming(t,r){let n=cP(t);if(n===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(dP(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??uP(t)??n.message_id,i;try{i=await this.requestHandler(n.request)}catch(l){let c=l instanceof Error?l.message:String(l),d=typeof l.code=="string"?l.code:"INTERNAL_ERROR";i={status:500,headers:{"content-type":"application/json"},body:{error:d,message:c}}}let a={message_id:Kt(this.now(),this.random),reply_to:n.message_id,response:i};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 au(e){if(typeof e!="object"||e===null||Array.isArray(e))return!1;let t=e;return!(t.kind!=="terminal"||typeof t.session_id!="string"||t.session_id===""||t.direction!=="agent_to_user"&&t.direction!=="user_to_agent"||typeof t.data!="string"||typeof t.ts!="number")}var YE=T(()=>{"use strict"});function lu(e){if(typeof e!="object"||e===null||Array.isArray(e))return!1;let t=e;if(t.kind!=="provider"||typeof t.session_id!="string"||t.session_id===""||t.direction!=="agent_to_user"&&t.direction!=="user_to_agent"||typeof t.ts!="number")return!1;if(t.direction==="agent_to_user"){if(!Array.isArray(t.events))return!1;for(let r of t.events)if(typeof r!="object"||r===null||Array.isArray(r)||typeof r.event_type!="string")return!1}else if(typeof t.user_input!="string")return!1;return!0}var zE=T(()=>{"use strict"});function du(e){if(typeof e!="object"||e===null||Array.isArray(e))return!1;let t=e;if(t.kind!=="daemon_event"||typeof t.event!="string"||t.event===""||typeof t.ts!="number")return!1;if(t.event==="workflows"){if(!Array.isArray(t.workflows))return!1;for(let r of t.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(t.event==="chat_log"){if(typeof t.entry!="object"||t.entry===null||Array.isArray(t.entry))return!1;let r=t.entry;if(typeof r.id!="number"||typeof r.root_teamfile!="string"||r.root_teamfile===""||r.sender_teamfile!==null&&(typeof r.sender_teamfile!="string"||r.sender_teamfile==="")||r.sender_alias!==null&&(typeof r.sender_alias!="string"||r.sender_alias==="")||typeof r.receiver_teamfile!="string"||r.receiver_teamfile===""||typeof r.receiver_alias!="string"||r.receiver_alias===""||typeof r.message!="string"||r.response!==null&&typeof r.response!="string"||typeof r.status!="string"||r.status===""||typeof r.created_at!="string"||r.created_at==="")return!1}return!0}var cu,ZE=T(()=>{"use strict";cu="daemon:events"});function eT(e){return{kind:"prompt",prompt_id:e.prompt_id??Kt(e.now?.()??Date.now(),e.random??Math.random),root_teamfile:e.root_teamfile,text:e.text}}function uu(e){if(e===null||typeof e!="object")return!1;let t=e;return t.kind==="prompt"&&typeof t.prompt_id=="string"&&t.prompt_id.length>0&&typeof t.root_teamfile=="string"&&t.root_teamfile.length>0&&typeof t.text=="string"}var QE,fu=T(()=>{"use strict";ou();QE="prompt:root"});function Ns(e){let t=e.split(".");if(t.length<2||t[1]===void 0||t[1]==="")return null;try{let r=JSON.parse(rT(t[1]));return typeof r.sub=="string"&&r.sub!==""?r.sub:null}catch{return null}}function fP(e){let t=e.split(".");if(t.length<2||t[1]===void 0||t[1]==="")return null;try{let r=JSON.parse(rT(t[1]));return typeof r.exp=="number"&&Number.isFinite(r.exp)?r.exp:null}catch{return null}}function tT(e,t=60){if(typeof e!="string"||e==="")return!0;let r=fP(e);return r===null?!0:Date.now()/1e3>=r-t}function rT(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t.padEnd(Math.ceil(t.length/4)*4,"="),n=globalThis.Buffer;return n!==void 0?n.from(r,"base64").toString("utf8"):atob(r)}var mu=T(()=>{"use strict"});async function la(e){let t=e.fetchImpl??fetch,r=`https://cognito-idp.${e.region}.amazonaws.com/`,n=await t(r,{method:"POST",headers:{"content-type":"application/x-amz-json-1.1","x-amz-target":mP},body:JSON.stringify({AuthFlow:"REFRESH_TOKEN_AUTH",ClientId:e.clientId,AuthParameters:{REFRESH_TOKEN:e.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 o=JSON.parse(s).AuthenticationResult,a=o?.IdToken;if(typeof a!="string"||a==="")throw new Error("cognito_refresh_no_id_token: InitiateAuth returned no IdToken");return{idToken:a,...typeof o?.AccessToken=="string"&&o.AccessToken!==""?{accessToken:o.AccessToken}:{},...typeof o?.ExpiresIn=="number"&&Number.isFinite(o.ExpiresIn)?{expiresAt:Date.now()+o.ExpiresIn*1e3}:{}}}var mP,pu=T(()=>{"use strict";mP="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as nT,mkdirSync as sT,readFileSync as iT,writeFileSync as oT}from"node:fs";import{homedir as aT}from"node:os";import{dirname as lT,join as cT}from"node:path";function xs(){return process.env.LMCTL_DEVICE_AUTH_PATH??cT(aT(),".lmctl","device-auth.json")}function dT(){return process.env.LMCTL_TOKEN_PATH??cT(aT(),".lmctl","cli-tokens.json")}function _u(e=xs()){try{let t=JSON.parse(iT(e,"utf8"));return typeof t.userId!="string"||t.userId===""||typeof t.refreshToken!="string"||t.refreshToken===""?null:{userId:t.userId,refreshToken:t.refreshToken}}catch{return null}}function uT(e,t=xs()){sT(lT(t),{recursive:!0,mode:448}),oT(t,JSON.stringify(e,null,2));try{nT(t,384)}catch{}}function hu(e,t=dT()){let r={};try{r=JSON.parse(iT(t,"utf8"))}catch{}let n={...r.cognito??{}};n.idToken=e.idToken,e.accessToken!==void 0&&(n.accessToken=e.accessToken),e.refreshToken!==void 0&&(n.refreshToken=e.refreshToken),e.expiresAt!==void 0&&(n.expiresAt=e.expiresAt);let s={...r,cognito:n};sT(lT(t),{recursive:!0,mode:448}),oT(t,JSON.stringify(s,null,2));try{nT(t,384)}catch{}}async function fT(e){let t=e.deviceAuthPath??xs(),r=_u(t);if(r===null)throw new Error("device_auth_not_found: no ~/.lmctl/device-auth.json; run `lmctl device login` first");let n=await la({region:e.region,clientId:e.clientId,refreshToken:r.refreshToken,...e.fetchImpl!==void 0?{fetchImpl:e.fetchImpl}:{}});return hu({idToken:n.idToken,...n.accessToken!==void 0?{accessToken:n.accessToken}:{},refreshToken:r.refreshToken,...n.expiresAt!==void 0?{expiresAt:n.expiresAt}:{}},e.cliTokensPath??dT()),{idToken:n.idToken,userId:r.userId}}var gu=T(()=>{"use strict";pu()});import{existsSync as pP,realpathSync as _P}from"node:fs";import{dirname as hP}from"node:path";function yu(e){gP(e).catch(t=>{e.log?.(`[mailbox] prompt trigger failed: ${t instanceof Error?t.message:String(t)}`)})}async function gP(e){let t=e.payload.root_teamfile;try{t=_P(e.payload.root_teamfile)}catch(s){let i=`prompt root missing/unreadable: ${e.payload.root_teamfile}: ${s instanceof Error?s.message:String(s)}`;return Sn({rootTeamfile:e.payload.root_teamfile,receiverTeamfile:e.payload.root_teamfile,receiverAlias:"Lead",message:e.payload.text,promptId:e.payload.prompt_id,detail:i,reason:"root_unavailable"}),e.log?.(`[mailbox] ${i}`),{status:"error",response:null,error_detail:i}}if(e.store.getRootTeam(t)===null){let s=`prompt root is not registered: ${t}`;return Sn({rootTeamfile:t,receiverTeamfile:t,receiverAlias:"Lead",message:e.payload.text,promptId:e.payload.prompt_id,detail:s,reason:"root_unregistered"}),e.log?.(`[mailbox] ${s}`),{status:"error",response:null,error_detail:s}}let r=wP(t);if("error"in r)return Sn({rootTeamfile:t,receiverTeamfile:t,receiverAlias:"Lead",message:e.payload.text,promptId:e.payload.prompt_id,detail:r.error,reason:"root_invalid"}),e.log?.(`[mailbox] ${r.error}`),{status:"error",response:null,error_detail:r.error};let n=hr(e.store,{receiver_teamfile:t,receiver_alias:r.alias,sender_teamfile:`prompt:${e.payload.prompt_id}`,sender_alias:"operator",ttlMs:SP(e.env??process.env)});if(!n.acquired){let s=bP(r.alias,n.current);return Sn({rootTeamfile:t,receiverTeamfile:t,receiverAlias:r.alias,message:e.payload.text,promptId:e.payload.prompt_id,detail:s,reason:"unavailable"}),e.log?.(`[mailbox] prompt rejected: ${s}`),{status:"error",response:null,error_detail:s}}try{let i=await(e.chat??St)({provider:r.provider,sessionId:r.sessionid,cwd:r.sessiondir,prompt:e.payload.text,env:e.env??process.env,alias:r.alias,permissionMode:"yolo",...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{}}),o=i.status==="stalled",a=!o&&i.text.trim()==="",l=o?`provider stalled${i.stalledAfterMs!==void 0?` after ${i.stalledAfterMs}ms`:""}`:a?"provider returned empty response":null,c=o||a?"error":"ok";return c==="ok"?await EP(e.store,{rootTeamfile:t,receiverTeamfile:t,receiverAlias:r.alias,message:e.payload.text,response:i.text,status:c,error_detail:null,log:e.log}):Sn({rootTeamfile:t,receiverTeamfile:t,receiverAlias:r.alias,message:e.payload.text,promptId:e.payload.prompt_id,detail:l??"provider failed",reason:o?"stalled":"empty_response"}),{status:c,response:c==="error"?null:i.text,error_detail:l}}catch(s){let i=s instanceof Error?s.message:String(s);return Sn({rootTeamfile:t,receiverTeamfile:t,receiverAlias:r.alias,message:e.payload.text,promptId:e.payload.prompt_id,detail:i,reason:"provider_error"}),e.log?.(`[mailbox] prompt provider error: ${i}`),{status:"error",response:null,error_detail:i}}finally{try{e.store.releaseAgentInflight(n.lease)}catch(s){e.log?.(`[mailbox] failed to release prompt in-flight slot: ${s instanceof Error?s.message:String(s)}`)}}}function Sn(e){H({event:"prompt_trigger_error",reason:e.reason,prompt_id:e.promptId,root_teamfile:e.rootTeamfile,sender_teamfile:e.rootTeamfile,sender_alias:"operator",receiver_teamfile:e.receiverTeamfile,receiver_alias:e.receiverAlias,error_detail:e.detail,message_preview:yP(e.message)})}function yP(e){let t=e.replace(/\s+/gu," ").trim();return t.length<=500?t:`${t.slice(0,497)}...`}function wP(e){if(!pP(e))return{error:`prompt root missing/unreadable: ${e}`};let t=De(e);if(t.parseErrors.length>0)return{error:`prompt root parse error: ${t.parseErrors.join("; ")}`};let r=At(t);return r===void 0?{error:`prompt root has no Lead: ${e}`}:r.session===void 0||r.session.trim()===""?{error:`prompt root Lead is unseeded: ${e}`}:{alias:r.alias,provider:r.provider,sessionid:r.session,sessiondir:r.sessiondir??hP(e)}}async function EP(e,t){let r=_T(t.message),n=t.response===null?null:_T(t.response);try{e.insertTeamChatLog({root_teamfile:t.rootTeamfile,sender_teamfile:t.rootTeamfile,sender_alias:"operator",receiver_teamfile:t.receiverTeamfile,receiver_alias:t.receiverAlias,message:r.text,response:n?.text??null,origin:"unknown",status:t.status,error_detail:t.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()})}catch(s){t.log?.(`[mailbox] warning: failed to record prompt chat log: ${s instanceof Error?s.message:String(s)}`)}}function _T(e){return e.length<=mT?{text:e,truncated:!1}:{text:e.slice(0,mT),truncated:!0}}function TP(e,t){return`${e} is servicing ${t.sender_alias} (${t.sender_teamfile}) since ${t.started_at}`}function bP(e,t){return t.sender_teamfile.startsWith("prompt:")?`${e} is busy servicing another prompt since ${t.started_at}`:TP(e,t)}function SP(e=process.env){let t=e.LMCTL_INFLIGHT_TTL_MS;if(t===void 0||t.trim()==="")return pT;let r=Number(t);return!Number.isFinite(r)||r<=0?pT:r}var mT,pT,hT=T(()=>{"use strict";vt();Yt();he();Fr();mT=256*1024,pT=30*60*1e3});import{chmodSync as bT,existsSync as vP,mkdirSync as ST,readFileSync as fa,writeFileSync as vT}from"node:fs";import{dirname as wu,resolve as ca,join as kT}from"node:path";import{fileURLToPath as kP}from"node:url";import{homedir as IT}from"node:os";import{CognitoIdentityClient as IP,GetIdCommand as NP}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as gT}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as xP,ListObjectsV2Command as AP,PutObjectCommand as RP,S3Client as yT}from"@aws-sdk/client-s3";function Rs(e={}){let t=e.env??process.env,r=e.tfstatePath!==void 0?[e.tfstatePath]:MP(e.selfUrl),n={},s;for(let I of r)if(vP(I)){n=CP(I),s=I;break}let i=(...I)=>{for(let x of I)if(typeof x=="string"&&x!=="")return x},o=i(t.LMCTL_NEXT_IDENTITY_POOL_ID,n.LMCTL_NEXT_IDENTITY_POOL_ID)??LP,a=i(t.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??OP,l=i(t.LMCTL_NEXT_MAILBOX_BUCKET,t.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??$P,c=i(t.AWS_REGION,t.AWS_DEFAULT_REGION)??"us-east-1",d=i(t.LMCTL_NEXT_COGNITO_CLIENT_ID,n.LMCTL_NEXT_COGNITO_CLIENT_ID)??ma,u=[];o===void 0&&u.push("LMCTL_NEXT_IDENTITY_POOL_ID"),a===void 0&&u.push("LMCTL_NEXT_COGNITO_USER_POOL_ID"),l===void 0&&u.push("LMCTL_NEXT_MAILBOX_BUCKET");let f={missing:u,tfstateCandidatesChecked:r,...s!==void 0?{tfstatePathUsed:s}:{}};if(u.length>0)return f;let m=t.LMCTL_MAILBOX_POLL_MS,p=m!==void 0&&m.length>0?Number(m):void 0,_=ua(t.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),g=ua(t.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),h=ua(t.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),S=ua(t.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),y=i(t.LMCTL_MAILBOX_KEY),w=i(t.LMCTL_TOKEN_PATH);return f.config={identityPoolId:o,cognitoUserPoolId:a,cognitoClientId:d,region:c,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},..._!==void 0?{readIntervalMs:_}:{},...g!==void 0?{heartbeatIdleMs:g}:{},...h!==void 0?{backoffReadIntervalMs:h}:{},...S!==void 0?{chatLogPollIntervalMs:S}:{},...y!==void 0?{mailboxKey:y}:{},...w!==void 0?{tokenPath:w}:{}},f}function CP(e){try{let t=fa(e,"utf8"),n=JSON.parse(t).outputs??{},s={};for(let[i,o]of Object.entries(n))o!==null&&typeof o=="object"&&typeof o.value=="string"&&(s[i]=o.value);return s}catch{return{}}}function MP(e){let t=wu(kP(e??import.meta.url));return[ca(t,"..","..","..","..","infra","terraform","terraform.tfstate"),ca(t,"..","..","..","..","..","infra","terraform","terraform.tfstate"),ca(t,"..","..","..","infra","terraform","terraform.tfstate"),ca(t,"..","..","infra","terraform","terraform.tfstate")]}function ua(e){if(e===void 0||e==="")return;let t=Number(e);if(!(!Number.isFinite(t)||t<=0))return t*1e3}function jP(e){let t=DP(e.intervalMs)??NT,r=Math.max(1,Math.trunc(e.limit??500)),n=e.now??Date.now,s=e.cursorKey!==void 0&&e.store.loadTeamChatLogCursor!==void 0&&e.store.saveTeamChatLogCursor!==void 0?{key:e.cursorKey,load:e.store.loadTeamChatLogCursor.bind(e.store),save:e.store.saveTeamChatLogCursor.bind(e.store)}:null,i,o=!1,a=!1,l=()=>{try{if(s!==null){let u=s.load(s.key);if(u!==null)return i=u.last_pushed_id,!0}return i=e.store.getMaxTeamChatLogId(),s!==null&&s.save({cursor_key:s.key,last_pushed_id:i,updated_at:new Date(n()).toISOString()}),!0}catch(u){return e.log?.(`[mailbox] daemon_event chat_log seed failed: ${u instanceof Error?u.message:String(u)}`),!1}};l();let c=async()=>{if(!(a||o)){o=!0;try{if(i===void 0&&!l())return;let u=e.store.listTeamChatLogSinceId(i,r);for(let f of u){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 e.publishDaemonEvent(m),s!==null&&s.save({cursor_key:s.key,last_pushed_id:f.id,updated_at:new Date(n()).toISOString()}),i=Math.max(i,f.id)}}catch(u){e.log?.(`[mailbox] daemon_event chat_log tail failed: ${u instanceof Error?u.message:String(u)}`)}finally{o=!1}}},d=setInterval(()=>{c()},t);return typeof d.unref=="function"&&d.unref(),{pollNow:c,stop(){a=!0,clearInterval(d)}}}function DP(e){return typeof e=="number"&&Number.isFinite(e)&&e>0?e:void 0}async function xT(e){let t=e.tokenPath??kT(IT(),".lmctl","cli-tokens.json"),r=ET(e.tokenPath);if(tT(r.cognito?.idToken)&&_u()!==null)try{await fT({region:e.region,clientId:e.cognitoClientId??ma,cliTokensPath:t}),r=ET(e.tokenPath),e.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(A){let Q=A instanceof Error?A.message:String(A);e.log?.(`[mx-mailbox] device-auth refresh failed: ${Q}`)}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.${e.region}.amazonaws.com/${e.cognitoUserPoolId}`,i=r.cognito.identityId,o=!1;i===void 0||i===""?i=await TT({tokenPath:t,region:e.region,identityPoolId:e.identityPoolId,idpProvider:s,idToken:n,log:e.log}):(o=!0,e.log?.(`[mx-mailbox] using cached identityId from cli-tokens (skipping GetId) for ${i}`));let a=gT({identityId:i,logins:{[s]:n},clientConfig:{region:e.region}}),l=new yT({region:e.region,credentials:a}),c={ListObjectsV2Command:AP,GetObjectCommand:xP,PutObjectCommand:RP},d=Ns(n),u=d??i,f=e.deviceId,m=gn({identityId:i,userId:d,deviceId:f,mailboxKey:e.mailboxKey}),p=e.cursorStore,_;if(p!==void 0){let A=p.loadMailboxCursor(u,m);if(A!==null)_=A.last_processed_seq??void 0,e.log?.(`[mx-mailbox] resumed seq cursor=${_??"(sentinel)"} for user_id=${u}`);else{let Q=!1,B=0;for(;!Q&&B<2;){B+=1;try{let k=Co(m,"web"),N=0,L;do{let F=await l.send(new c.ListObjectsV2Command({Bucket:e.mailboxBucket,Prefix:k,MaxKeys:1e3,...L!==void 0?{ContinuationToken:L}:{}}));for(let j of F.Contents??[]){let C=Mo(j.Key??"",m,"web");C!==void 0&&C>N&&(N=C)}L=F.IsTruncated===!0?F.NextContinuationToken:void 0}while(L!==void 0);_=N,e.log?.(`[mx-mailbox] cold start: seeded seq cursor=${N} for user_id=${u}`),Q=!0}catch(k){let N=k instanceof Error?k.message:String(k);if(o&&B===1&&UP(k)){e.log?.(`[mx-mailbox] cached identityId rejected by cognito (${N}); clearing + refreshing`),FP(t),o=!1,i=await TT({tokenPath:t,region:e.region,identityPoolId:e.identityPoolId,idpProvider:s,idToken:n,log:e.log}),a=gT({identityId:i,logins:{[s]:n},clientConfig:{region:e.region}}),l=new yT({region:e.region,credentials:a}),m=gn({identityId:i,userId:d,deviceId:f,mailboxKey:e.mailboxKey});continue}e.log?.(`[mx-mailbox] cold start seq probe failed: ${N}`);break}}p.saveMailboxCursor({user_id:u,mailbox_key:m,last_processed_version_id:null,last_processed_seq:_??null,last_processed_at:new Date().toISOString()})}}let g=null,h=e.terminalSessionManager,S=e.persistentSessionManager,y=e.promptTriggerStore,w=new oa,I=new Dr({bucket:e.mailboxBucket,identityId:i,...d!==null?{userId:d}:{},...f!==void 0?{deviceId:f}:{},...e.mailboxKey!==void 0?{mailboxKey:e.mailboxKey}:{},s3:l,commands:c,selfRole:"agent",onS3Op:A=>w.record(A),onMessage:async A=>{if(h!==void 0&&au(A.payload)){h.onInbound(A.payload);return}if(S!==void 0&&lu(A.payload)){await S.onInbound(A.payload);return}if(!du(A.payload)){if(y!==void 0&&uu(A.payload)){yu({store:y,payload:A.payload,log:e.log});return}g!==null&&await g.handleIncoming(A.payload,A)}},...p!==void 0?{onCursorAdvance:A=>{p.saveMailboxCursor({user_id:u,mailbox_key:m,last_processed_version_id:null,last_processed_seq:A,last_processed_at:new Date().toISOString()})}}:{},..._!==void 0?{cursor:_}:{},...e.pollIntervalMs!==void 0?{pollIntervalMs:e.pollIntervalMs}:{},...e.readIntervalMs!==void 0?{readIntervalMs:e.readIntervalMs}:{},...e.heartbeatIdleMs!==void 0?{heartbeatIdleMs:e.heartbeatIdleMs}:{},...e.backoffReadIntervalMs!==void 0?{backoffReadIntervalMs:e.backoffReadIntervalMs}:{}});g=new Is({client:I,...e.log!==void 0?{log:e.log}:{}}),h!==void 0&&h.setPublish(async A=>I.putMessage({conversation_id:`terminal:${A.session_id}`,payload:A})),S!==void 0&&S.setPublish(async A=>I.putMessage({conversation_id:`provider:${A.session_id}`,payload:A}));let x=A=>I.putMessage({conversation_id:cu,payload:A});I.start();let U=e.chatLogTailStore===void 0?void 0:jP({store:e.chatLogTailStore,publishDaemonEvent:x,cursorKey:m,intervalMs:e.chatLogPollIntervalMs??e.readIntervalMs??e.pollIntervalMs??NT,log:e.log});e.log?.(`[mx-mailbox] agent polling ${m} (bucket=${e.mailboxBucket})`);let ue=e.deviceId??i,W=`${u}/usage/`,M;return M=e.usageStore===void 0?void 0:XE({meter:w,store:e.usageStore,userId:u,deviceId:ue,ceilingUsd:e.usageQuotaUsd??1/0,onQuotaExceeded:({period:A,costUsd:Q,ceilingUsd:B})=>{e.log?.(`[usage] month ${A} cost $${Q.toFixed(4)} >= ceiling $${B} \u2014 blocking mailbox`),I.stop().catch(()=>{}),M?.stop()},publishOwnRollup:async(A,Q)=>{await l.send(new c.PutObjectCommand({Bucket:e.mailboxBucket,Key:`${W}${ue}-${A}.json`,Body:JSON.stringify({...Q,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async A=>{let Q={put:0,get:0,list:0},B;do{let k=await l.send(new c.ListObjectsV2Command({Bucket:e.mailboxBucket,Prefix:W,MaxKeys:1e3,...B!==void 0?{ContinuationToken:B}:{}}));for(let N of k.Contents??[]){let L=N.Key??"";if(L.endsWith(`-${A}.json`))try{let F=await l.send(new c.GetObjectCommand({Bucket:e.mailboxBucket,Key:L}));if(F.Body===void 0)continue;let j=JSON.parse(await F.Body.transformToString("utf-8"));Q.put+=j.put??0,Q.get+=j.get??0,Q.list+=j.list??0}catch{}}B=k.IsTruncated===!0?k.NextContinuationToken:void 0}while(B!==void 0);return Q},intervalMs:e.usageFlushIntervalMs??36e5,...e.log!==void 0?{log:e.log}:{}}),{identityId:i,mailbox:I,fetchClient:g,publishDaemonEvent:x,async stop(){U?.stop(),M!==void 0&&(await M.flushNow().catch(()=>{}),M.stop()),await g.stop().catch(()=>{}),await I.stop().catch(()=>{})}}}async function AT(e){let t=e.s3!==void 0&&e.commands!==void 0?{s3:e.s3,commands:e.commands}:ia(e.rootDir),r=gn({identityId:As,userId:As,deviceId:wT}),n=null,s=e.terminalSessionManager,i=e.persistentSessionManager,o=e.promptTriggerStore,a=new Dr({bucket:"local",identityId:As,userId:As,deviceId:wT,s3:t.s3,commands:t.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&au(c.payload)){s.onInbound(c.payload);return}if(i!==void 0&&lu(c.payload)){await i.onInbound(c.payload);return}if(!du(c.payload)){if(o!==void 0&&uu(c.payload)){yu({store:o,payload:c.payload,log:e.log});return}n!==null&&await n.handleIncoming(c.payload,c)}},pollIntervalMs:e.pollIntervalMs??da,readIntervalMs:e.readIntervalMs??da,heartbeatIdleMs:e.heartbeatIdleMs??da,backoffReadIntervalMs:e.backoffReadIntervalMs??da});n=new Is({client:a,...e.log!==void 0?{log:e.log}:{}}),s!==void 0&&s.setPublish(async c=>a.putMessage({conversation_id:`terminal:${c.session_id}`,payload:c})),i!==void 0&&i.setPublish(async c=>a.putMessage({conversation_id:`provider:${c.session_id}`,payload:c}));let l=c=>a.putMessage({conversation_id:cu,payload:c});return a.start(),e.log?.(`[local-webui] agent polling ${r} (local-fs ${e.rootDir})`),{identityId:As,mailbox:a,fetchClient:n,publishDaemonEvent:l,async stop(){await n.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function ET(e){let t=e??kT(IT(),".lmctl","cli-tokens.json");try{let r=fa(t,"utf8");return JSON.parse(r)}catch{return{}}}function PP(e,t){if(t===void 0||t==="")return;let r={};try{let s=fa(e,"utf8");r=JSON.parse(s)}catch{}if(r.cognito===void 0)return;let n={...r,cognito:{...r.cognito,identityId:t}};ST(wu(e),{recursive:!0,mode:448}),vT(e,JSON.stringify(n,null,2));try{bT(e,384)}catch{}}function FP(e){let t={};try{let n=fa(e,"utf8");t=JSON.parse(n)}catch{return}if(t.cognito===void 0)return;let r={...t,cognito:{...t.cognito}};delete r.cognito.identityId,ST(wu(e),{recursive:!0,mode:448}),vT(e,JSON.stringify(r,null,2));try{bT(e,384)}catch{}}async function TT(e){e.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new IP({region:e.region}).send(new NP({IdentityPoolId:e.identityPoolId,Logins:{[e.idpProvider]:e.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{PP(e.tokenPath,r.IdentityId),e.log?.(`[mx-mailbox] persisted identityId=${r.IdentityId} to ${e.tokenPath}`)}catch(n){let s=n instanceof Error?n.message:String(n);e.log?.(`[mx-mailbox] WARNING: identityId persist failed (${s}); will redo GetId on next restart`)}return r.IdentityId}function UP(e){if(e===null||typeof e!="object")return!1;let t=e,r=[typeof t.name=="string"?t.name:void 0,typeof t.Code=="string"?t.Code:void 0,typeof t.__type=="string"?t.__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 t.message=="string"?t.message:"";return!!(n.includes("NotAuthorizedException")||n.includes("Invalid identity pool configuration")||n.includes("Identity")&&n.includes("not found"))}var NT,da,ma,LP,OP,$P,As,wT,Eu=T(()=>{"use strict";Fo();ru();iu();GE();KE();YE();zE();ZE();fu();jo();mu();gu();hT();NT=3e3,da=1e3,ma="79u5jhkk46qofog661c9i0bdcs",LP="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",OP="us-east-1_4iUdFggDn",$P="lmctl-next-preview-mailbox-254332045686";As="local",wT="local"});import{spawn as vu}from"node:child_process";import{createInterface as RT}from"node:readline";var Tu,bu,Su,LT,OT=T(()=>{"use strict";mi();he();Tu=class{child;ctx;rl;nextRpcId=1;pending=new Map;threadId;nextLocalTurnId=1;closed=!1;setResumeThreadId(t){this.threadId=t}async start(t,r){this.ctx=r;let n=vu(t.command,t.args,{cwd:t.cwd??process.cwd(),env:t.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=RT({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 i=s instanceof Buffer?s.toString("utf8"):String(s);r.emit({event_type:"notification",payload:{source:"stderr",text:i}})}),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 i=(await this.rpc("thread/start",{cwd:t.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,o=typeof i?.id=="string"?i.id:void 0;this.threadId=o,r.emit({event_type:"thread_started",payload:{thread_id:o,resumed:!1}})}else{let i=(await this.rpc("thread/start",{cwd:t.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,o=typeof i?.id=="string"?i.id:void 0;this.threadId=o,r.emit({event_type:"thread_started",payload:{thread_id:o,resumed:!1}})}return n}async sendTurn(t){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:t}]})).result?.turn,i=typeof s?.id=="string"?s.id:void 0;if(i!==void 0){let o=this.ctx?.turnMap.get(r);this.ctx?.turnMap.delete(r),o!==void 0&&this.ctx?.turnMap.set(i,o)}}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 t of this.pending.values())t.reject(new Error("codex_session_stopping"));this.pending.clear()}async rpc(t,r){if(this.child?.stdin===null||this.child===void 0)throw new Error("codex_child_unavailable");return new Promise((n,s)=>{let i=this.nextRpcId++;this.pending.set(i,{resolve:n,reject:s});let o=JSON.stringify({jsonrpc:"2.0",id:i,method:t,params:r});try{this.child.stdin.write(o+`
|
|
2045
2045
|
`)}catch(a){this.pending.delete(i),s(a instanceof Error?a:new Error(String(a)))}})}notify(t,r){if(this.child?.stdin===null||this.child===void 0)return;let n=JSON.stringify({jsonrpc:"2.0",method:t,params:r});try{this.child.stdin.write(n+`
|
|
2046
2046
|
`)}catch{}}handleLine(t){if(t.trim()==="")return;let r;try{r=JSON.parse(t)}catch{return}if(typeof r.id=="number"&&this.pending.has(r.id)){let o=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);o.reject(new Error(`codex_rpc_error: ${l}`))}else o.resolve(r);return}let n=typeof r.method=="string"?r.method:void 0;if(n===void 0)return;let s=r.params??{},i=this.normalizeNotification(n,s);i!==void 0&&this.ctx?.emit(i)}normalizeNotification(t,r){if(t==="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(t==="turn/started")return{event_type:"turn_started",payload:{turn_id:r.turn?.id,thread_id:this.threadId}};if(t==="item/agentMessage/delta")return{event_type:"assistant_message_delta",payload:{text:typeof r.delta=="string"?r.delta:""}};if(t==="item/started"||t==="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:t==="item/started"?"started":"completed",item:n}}:{event_type:"notification",payload:{method:t,params:r}}}if(t==="turn/completed"){let n=r.turn;return typeof n?.id=="string"&&this.ctx?.turnMap.delete(n.id),{event_type:"turn_complete",payload:r}}if(t==="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:t,params:r}}}},bu=class{child;ctx;buffer="";sessionIdSeen;closed=!1;async start(t,r){this.ctx=r;let n=vu(t.command,t.args,{cwd:t.cwd??process.cwd(),env:t.env??process.env,stdio:["pipe","pipe","pipe"]});return this.child=n,n.stdout.on("data",s=>{if(r.generation!==r.currentGeneration())return;let i=s instanceof Buffer?s.toString("utf8"):String(s);this.buffer+=i;let o=this.buffer.split(`
|
|
2047
2047
|
`);this.buffer=o.pop()??"";for(let a of o)this.handleLine(a)}),n.stderr?.on("data",s=>{if(r.generation!==r.currentGeneration())return;let i=s instanceof Buffer?s.toString("utf8"):String(s);r.emit({event_type:"notification",payload:{source:"stderr",text:i}})}),n}async sendTurn(t){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:t}});try{this.child.stdin.write(n+`
|
|
2048
|
-
`)}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(t){if(t.trim()==="")return;let r;try{r=JSON.parse(t)}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 i=r.message?.content;if(Array.isArray(i))for(let o of i)o.type==="text"&&typeof o.text=="string"&&o.text!==""&&this.ctx?.emit({event_type:"assistant_message_delta",payload:{text:o.text}});return}if(n==="result"){let s=typeof r.session_id=="string"?r.session_id:void 0;for(let i of Array.from(this.ctx?.turnMap.keys()??[]))this.ctx?.turnMap.delete(i);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}})}},Su=class{child;ctx;rl;nextRpcId=1;pending=new Map;sessionId;closed=!1;async start(t,r){this.ctx=r;let n=t.cwd??process.cwd();if(t.provider==="opencode")try{
|
|
2048
|
+
`)}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(t){if(t.trim()==="")return;let r;try{r=JSON.parse(t)}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 i=r.message?.content;if(Array.isArray(i))for(let o of i)o.type==="text"&&typeof o.text=="string"&&o.text!==""&&this.ctx?.emit({event_type:"assistant_message_delta",payload:{text:o.text}});return}if(n==="result"){let s=typeof r.session_id=="string"?r.session_id:void 0;for(let i of Array.from(this.ctx?.turnMap.keys()??[]))this.ctx?.turnMap.delete(i);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}})}},Su=class{child;ctx;rl;nextRpcId=1;pending=new Map;sessionId;closed=!1;async start(t,r){this.ctx=r;let n=t.cwd??process.cwd();if(t.provider==="opencode")try{fi(n)}catch(a){H({event:"opencode_config_install_failed",cwd:n,error_message:a instanceof Error?a.message:String(a)})}let s=vu(t.command,t.args,{cwd:n,env:t.env??process.env,stdio:["pipe","pipe","pipe"]});this.child=s,this.rl=RT({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 o=(await this.rpc("session/new",{cwd:t.cwd??process.cwd(),mcpServers:[]})).result;return this.sessionId=typeof o?.sessionId=="string"?o.sessionId:void 0,r.emit({event_type:"thread_started",payload:{thread_id:this.sessionId,raw:o}}),s}async sendTurn(t){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:t}]})).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 t of this.pending.values())t.reject(new Error("acp_session_stopping"));this.pending.clear()}async rpc(t,r){if(this.child?.stdin===null||this.child===void 0)throw new Error("acp_child_unavailable");return new Promise((n,s)=>{let i=this.nextRpcId++;this.pending.set(i,{resolve:n,reject:s});let o=JSON.stringify({jsonrpc:"2.0",id:i,method:t,params:r});try{this.child.stdin.write(o+`
|
|
2049
2049
|
`)}catch(a){this.pending.delete(i),s(a instanceof Error?a:new Error(String(a)))}})}notify(t,r){if(this.child?.stdin===null||this.child===void 0)return;let n=JSON.stringify({jsonrpc:"2.0",method:t,params:r});try{this.child.stdin.write(n+`
|
|
2050
2050
|
`)}catch{}}handleLine(t){if(t.trim()==="")return;let r;try{r=JSON.parse(t)}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 i=r.error,o=typeof i?.message=="string"&&i.message!==""?i.message:JSON.stringify(r.error);s.reject(new Error(`acp_rpc_error: ${o}`))}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+`
|
|
2051
|
-
`)}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,i=s?.update;if((typeof i?.sessionUpdate=="string"?i.sessionUpdate:"")==="agent_message_chunk"){let a=i?.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}})}}},LT=e=>{switch(e){case"codex":return new Tu;case"claude":case"qwen":return new bu;case"gemini":case"copilot":case"opencode":return new Su;default:throw new Error(`no_persistent_adapter_for_provider: ${e}`)}}});import{randomUUID as
|
|
2052
|
-
`,{encoding:"utf8",mode:384}),r}var Iu=T(()=>{"use strict"});import*as $T from"node:child_process";function
|
|
2053
|
-
`),2;try{WT(t)}catch(y){return 1}let n=Ie({path:le()}),s={portCli:
|
|
2054
|
-
`),2}process.env.LMCTL_API_URL=i.apiUrl,process.env.LMCTL_API_TOKEN=i.apiToken,process.env.LMCTL_API_PORT=String(i.port),jE(n);let o;if(r.localWebui!==void 0){let y=BT(r.localWebui.dir,process.env);if(y===null)return t.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 w=qT(process.env),{s3:I,commands:x}=
|
|
2051
|
+
`)}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,i=s?.update;if((typeof i?.sessionUpdate=="string"?i.sessionUpdate:"")==="agent_message_chunk"){let a=i?.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}})}}},LT=e=>{switch(e){case"codex":return new Tu;case"claude":case"qwen":return new bu;case"gemini":case"copilot":case"opencode":return new Su;default:throw new Error(`no_persistent_adapter_for_provider: ${e}`)}}});import{randomUUID as WP}from"node:crypto";import{existsSync as Mz,mkdirSync as BP,readFileSync as qP,writeFileSync as HP}from"node:fs";import{homedir as JP}from"node:os";import{dirname as XP,join as GP}from"node:path";function pa(){return process.env.LMCTL_DEVICE_FILE??GP(JP(),".lmctl","device.json")}function Br(e=pa()){let t=process.env.LMCTL_DEVICE_ID;if(t!==void 0&&t!=="")return{device_id:t,created_at:"env"};try{let r=JSON.parse(qP(e,"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 ku(e=pa()){let t=Br(e);if(t!==null&&t.created_at!=="env")return t;let r={device_id:WP(),created_at:new Date().toISOString()};return BP(XP(e),{recursive:!0}),HP(e,`${JSON.stringify(r,null,2)}
|
|
2052
|
+
`,{encoding:"utf8",mode:384}),r}var Iu=T(()=>{"use strict"});import*as $T from"node:child_process";function KP(e,t){try{let r=t(e,["--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 Nu(e,t={}){let r=t.spawnSync===void 0&&process.env[YP]==="1",n=t.spawnSync??$T.spawnSync,s=new Set,i=[];for(let o of e){if(s.has(o))continue;s.add(o);let a=_a[o];if(!a){i.push({provider:o,binary:"<unknown>",found:!1,failureMode:"not installed"});continue}if(r){i.push({provider:o,binary:a,found:!0,version:"(skipped)"});continue}let l=KP(a,n);l.found?i.push({provider:o,binary:a,found:!0,version:l.version}):i.push({provider:o,binary:a,found:!1,failureMode:l.failureMode})}return i}function CT(e){if(e.binary==="<unknown>")return`unknown provider "${e.provider}" \u2014 no binary mapping (allowed: ${Object.keys(_a).join(", ")})`;let t=VP[e.provider],r=t?` (install via ${t})`:"";return e.failureMode==="runs but failed"?`provider "${e.provider}" binary '${e.binary}' found but \`${e.binary} --version\` failed to run cleanly \u2014 check install integrity${r}`:`provider "${e.provider}" binary '${e.binary}' not installed${r}`}var _a,VP,YP,MT=T(()=>{"use strict";_a={claude:"claude",codex:"codex",copilot:"copilot",gemini:"gemini",opencode:"opencode",lmplayer:"lmplayer",qwen:"qwen",agy:"agy"},VP={claude:"https://docs.claude.com/code",codex:"https://github.com/openai/codex",copilot:"https://docs.github.com/copilot/cli",gemini:"https://github.com/google-gemini/gemini-cli",opencode:"https://opencode.ai",lmplayer:"Install lmplayer and ensure the lmplayer binary is on PATH.",qwen:"https://github.com/QwenLM/qwen-code",agy:"https://antigravity.google"};YP="LMCTL_SKIP_BINARY_CHECK"});var JT={};we(JT,{ProviderBinaryPreflightError:()=>ha,__setProviderBinaryCheckForTest:()=>iF,bootstrapAgentRestMailbox:()=>PT,publishRegisteredWorkflowsOnStart:()=>DT,resolveLocalMailboxDir:()=>qT,resolveLocalWebuiDir:()=>BT,resolveServeConfig:()=>FT,runProviderBinaryPreflight:()=>WT,runServe:()=>tF,validateServeArgs:()=>HT});import{randomBytes as zP}from"node:crypto";import{existsSync as ZP}from"node:fs";import{homedir as QP}from"node:os";import{isAbsolute as jT,resolve as xu}from"node:path";async function tF(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(eF),0;let r=HT(e,process.env);if(typeof r=="string")return t.stderr.write(`error: ${r}
|
|
2053
|
+
`),2;try{WT(t)}catch(y){return 1}let n=Ie({path:le()}),s={portCli:oF(e)},i;try{i=FT({dal:n,cli:s,env:process.env,parsed:r,io:t})}catch(y){return n.close(),t.stderr.write(`error: ${y instanceof Error?y.message:String(y)}
|
|
2054
|
+
`),2}process.env.LMCTL_API_URL=i.apiUrl,process.env.LMCTL_API_TOKEN=i.apiToken,process.env.LMCTL_API_PORT=String(i.port),jE(n);let o;if(r.localWebui!==void 0){let y=BT(r.localWebui.dir,process.env);if(y===null)return t.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 w=qT(process.env),{s3:I,commands:x}=ia(w);o={webuiDir:y,rootDir:w,s3:I,commands:x},t.stdout.write(`local webui: serving SPA from ${y}; mailbox store ${w}
|
|
2055
2055
|
`)}let a=r.noDaemon?void 0:CE({dal:n,intervalMs:ks()}),l=o!==void 0?{missing:[],tfstateCandidatesChecked:[]}:Rs({env:process.env});l.missing.length>0&&t.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)`)+`
|
|
2056
|
-
`);let c=await
|
|
2057
|
-
`)}),d=new
|
|
2058
|
-
`)}),u=Br()?.device_id,f=Bw({dal:n,daemon:a,...l.config!==void 0?{webuiRuntimeConfig:
|
|
2059
|
-
`),await new Promise(y=>{let w=()=>{(async()=>(a!==void 0&&await a.stop(),S.close(),await g.stop(),c!==void 0&&await c.stop(),await d.stop(),n.close(),y()))()};process.once("SIGTERM",w),process.once("SIGINT",w)}),0}function
|
|
2056
|
+
`);let c=await sF({log:y=>t.stderr.write(`${y}
|
|
2057
|
+
`)}),d=new Ho({adapterFactory:LT,publish:async()=>{throw new Error("persistent_publish_not_wired: mailbox runtime has not bound the publish hook yet")},log:y=>t.stderr.write(`${y}
|
|
2058
|
+
`)}),u=Br()?.device_id,f=Bw({dal:n,daemon:a,...l.config!==void 0?{webuiRuntimeConfig:rF(l.config,u)}:{},...c!==void 0?{terminalSessionManager:c}:{},persistentSessionManager:d,...o!==void 0?{localWebui:{webuiDir:o.webuiDir,localMailbox:{s3:o.s3,commands:o.commands}}}:{}}),m=process.env.LMCTL_USAGE_QUOTA_USD,p=m!==void 0&&m!==""?Number(m):NaN,_=Number.isFinite(p)&&p>0?p:void 0,g=await PT({dal:n,app:f,io:t,mailbox:l.config===void 0?void 0:{...l.config,cursorStore:n,chatLogTailStore:n,promptTriggerStore:n,usageStore:n,..._!==void 0?{usageQuotaUsd:_}:{},...u!==void 0?{deviceId:u}:{}},...o!==void 0?{localMailbox:{rootDir:o.rootDir,s3:o.s3,commands:o.commands,promptTriggerStore:n}}:{},...c!==void 0?{terminalSessionManager:c}:{},persistentSessionManager:d});await DT({dal:n,mailbox:g.mailbox,io:t});let{serve:h}=await import("@hono/node-server"),S=h({fetch:f.fetch,port:i.port,hostname:r.bind});return t.stdout.write(`listening on ${r.bind}:${i.port}
|
|
2059
|
+
`),await new Promise(y=>{let w=()=>{(async()=>(a!==void 0&&await a.stop(),S.close(),await g.stop(),c!==void 0&&await c.stop(),await d.stop(),n.close(),y()))()};process.once("SIGTERM",w),process.once("SIGINT",w)}),0}function rF(e,t){return{identityPoolId:e.identityPoolId,cognitoUserPoolId:e.cognitoUserPoolId,cognitoRegion:e.region,mailboxBucket:e.mailboxBucket,workspaceFetchMode:"mailbox",...t!==void 0?{deviceId:t}:{},...e.mailboxKey!==void 0?{mailboxKey:e.mailboxKey}:{},mailboxPolling:{...e.readIntervalMs!==void 0?{readIntervalSeconds:e.readIntervalMs/1e3}:{},...e.heartbeatIdleMs!==void 0?{heartbeatIdleSeconds:e.heartbeatIdleMs/1e3}:{},...e.backoffReadIntervalMs!==void 0?{backoffReadIntervalSeconds:e.backoffReadIntervalMs/1e3}:{}}}}async function DT(e){if(e.mailbox===void 0)return;let t={kind:"daemon_event",event:"workflows",ts:Date.now(),workflows:e.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 e.mailbox.publishDaemonEvent(t)}catch(r){e.io?.stderr.write(`[mailbox] daemon_event workflows push failed: ${r instanceof Error?r.message:String(r)}
|
|
2060
2060
|
`)}}async function PT(e){let t;if(e.mailbox!==void 0||e.localMailbox!==void 0)try{t=e.localMailbox!==void 0?await AT({...e.localMailbox,log:r=>e.io?.stderr.write(`${r}
|
|
2061
2061
|
`),...e.terminalSessionManager!==void 0?{terminalSessionManager:e.terminalSessionManager}:{},...e.persistentSessionManager!==void 0?{persistentSessionManager:e.persistentSessionManager}:{}}):await xT({...e.mailbox,log:r=>e.io?.stderr.write(`${r}
|
|
2062
2062
|
`),...e.terminalSessionManager!==void 0?{terminalSessionManager:e.terminalSessionManager}:{},...e.persistentSessionManager!==void 0?{persistentSessionManager:e.persistentSessionManager}:{}}),t.fetchClient.onRequest(Th({app:e.app,log:r=>e.io?.stderr.write(`${r}
|
|
2063
2063
|
`)})),e.io?.stderr.write(`[mailbox] dg-2 agent runtime started (identity=${t.identityId})
|
|
2064
2064
|
`)}catch(r){let n=r instanceof Error?r.message:String(r);e.io?.stderr.write(`[mailbox] dg-2 agent runtime NOT started: ${n}
|
|
2065
|
-
`)}return{...t!==void 0?{mailbox:t}:{},async stop(){t!==void 0&&await t.stop()}}}function FT(e){let{dal:t,cli:r,env:n,parsed:s,io:i}=e,o=[],a,l=t.getConfig("api.port");if(r.portCli!==void 0)a=r.portCli;else if(l!==null){let m=Number(l);if(!Number.isInteger(m)||m<=0||m>65535)throw new Error(`invalid api.port in lmctl_config: ${l}`);a=m}else if(n.LMCTL_API_PORT!==void 0&&n.LMCTL_API_PORT.length>0){let m=Number(n.LMCTL_API_PORT);if(!Number.isInteger(m)||m<=0||m>65535)throw new Error(`invalid LMCTL_API_PORT: ${n.LMCTL_API_PORT}`);a=m,o.push("api.port")}else a=s.port;let c,d=t.getConfig("api.token");d!==null?c=d:n.LMCTL_API_TOKEN!==void 0&&n.LMCTL_API_TOKEN.length>0?(c=n.LMCTL_API_TOKEN,o.push("api.token")):(c=
|
|
2066
|
-
`);return{port:a,apiUrl:u,apiToken:c}}function
|
|
2065
|
+
`)}return{...t!==void 0?{mailbox:t}:{},async stop(){t!==void 0&&await t.stop()}}}function FT(e){let{dal:t,cli:r,env:n,parsed:s,io:i}=e,o=[],a,l=t.getConfig("api.port");if(r.portCli!==void 0)a=r.portCli;else if(l!==null){let m=Number(l);if(!Number.isInteger(m)||m<=0||m>65535)throw new Error(`invalid api.port in lmctl_config: ${l}`);a=m}else if(n.LMCTL_API_PORT!==void 0&&n.LMCTL_API_PORT.length>0){let m=Number(n.LMCTL_API_PORT);if(!Number.isInteger(m)||m<=0||m>65535)throw new Error(`invalid LMCTL_API_PORT: ${n.LMCTL_API_PORT}`);a=m,o.push("api.port")}else a=s.port;let c,d=t.getConfig("api.token");d!==null?c=d:n.LMCTL_API_TOKEN!==void 0&&n.LMCTL_API_TOKEN.length>0?(c=n.LMCTL_API_TOKEN,o.push("api.token")):(c=zP(32).toString("hex"),t.setConfig("api.token",c),i.stdout.write("Generated initial api.token; view via `lmctl api config get api.token`\n"));let u,f=t.getConfig("api.url");f!==null?u=f:n.LMCTL_API_URL!==void 0&&n.LMCTL_API_URL.length>0?(u=n.LMCTL_API_URL,o.push("api.url")):(u=`http://127.0.0.1:${a}`,t.setConfig("api.url",u));for(let m of o)i.stderr.write(`note: ${nF(m)} env var used as fallback for ${m}; consider \`lmctl api config set ${m} ...\` to make this DB-canonical.
|
|
2066
|
+
`);return{port:a,apiUrl:u,apiToken:c}}function nF(e){switch(e){case"api.port":return"LMCTL_API_PORT";case"api.token":return"LMCTL_API_TOKEN";case"api.url":return"LMCTL_API_URL";default:return`LMCTL_${e.replaceAll(".","_").toUpperCase()}`}}async function sF(e){let t;try{t=await import("node-pty")}catch(r){let n=r instanceof Error?r.message:String(r);e.log(`[dt-2] node-pty not available; terminal routes will return 503 (${n})`);return}return new qo({pty:{spawn:t.spawn.bind(t)},publish:async()=>{throw new Error("terminal_publish_not_wired: mailbox runtime has not bound the publish hook yet")},log:e.log})}function iF(e){UT=e??Nu}function WT(e){let t=Object.keys(_a),r=UT(t),n=r.filter(i=>!i.found);if(n.length>0){for(let i of n)e.stderr.write(`error: ${CT(i)}
|
|
2067
2067
|
`);throw e.stderr.write(`error: agent refusing to start; ensure missing provider CLIs are on PATH
|
|
2068
|
-
`),new
|
|
2069
|
-
`)}function BT(e,t){let r=e!==void 0&&e!==""?e:t.LMCTL_LOCAL_WEBUI_DIR!==void 0&&t.LMCTL_LOCAL_WEBUI_DIR!==""?t.LMCTL_LOCAL_WEBUI_DIR:void 0;if(r===void 0)return null;let n=jT(r)?r:xu(process.cwd(),r);return
|
|
2068
|
+
`),new ha(n)}let s=r.map(i=>i.provider).join(", ");e.stdout.write(`providers ready: ${s}
|
|
2069
|
+
`)}function BT(e,t){let r=e!==void 0&&e!==""?e:t.LMCTL_LOCAL_WEBUI_DIR!==void 0&&t.LMCTL_LOCAL_WEBUI_DIR!==""?t.LMCTL_LOCAL_WEBUI_DIR:void 0;if(r===void 0)return null;let n=jT(r)?r:xu(process.cwd(),r);return ZP(`${n}/index.html`)?n:null}function qT(e){let t=e.LMCTL_LOCAL_MAILBOX_DIR;return t!==void 0&&t!==""?jT(t)?t:xu(process.cwd(),t):xu(QP(),".lmctl","local-mailbox")}function oF(e){for(let t=0;t<e.length;t+=1)if(e[t]==="--port"){let r=e[t+1];if(r!==void 0&&!r.startsWith("--")){let n=Number(r);if(Number.isInteger(n)&&n>0&&n<=65535)return n}}}function HT(e,t=process.env){let r=aF(e);return typeof r=="string"?r:r.bind==="0.0.0.0"&&!r.insecureNoAuth&&!t.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 aF(e){let t={port:8787,bind:"127.0.0.1",noDaemon:!1,insecureNoAuth:!1};for(let r=0;r<e.length;r+=1){let n=e[r];if(n==="--port"){let s=e[++r];if(s===void 0||s.startsWith("--"))return"missing value for --port";let i=Number(s);if(!Number.isInteger(i)||i<=0||i>65535)return`invalid --port: ${s}`;t.port=i;continue}if(n==="--bind"){let s=e[++r];if(s===void 0||s.startsWith("--"))return"missing value for --bind";t.bind=s;continue}if(n==="--no-daemon"){t.noDaemon=!0;continue}if(n==="--insecure-no-auth"){t.insecureNoAuth=!0;continue}if(n==="--webui"){let s=e[r+1];s!==void 0&&!s.startsWith("--")?(t.localWebui={dir:s},r+=1):t.localWebui={dir:void 0};continue}return`unknown argument: ${n}`}return t}var eF,ha,UT,XT=T(()=>{"use strict";Ze();Jw();Zd();DE();Jc();Eu();ru();Cd();Md();OT();Iu();MT();Xe();eF=`usage: lmctl serve [--port N] [--bind HOST] [--no-daemon] [--insecure-no-auth] [--webui [DIR]]
|
|
2070
2070
|
|
|
2071
2071
|
Start the local HTTP API, web UI, queue daemon, terminal manager, and agent
|
|
2072
2072
|
services. Help exits before any port binding or daemon startup.
|
|
@@ -2076,24 +2076,24 @@ services. Help exits before any port binding or daemon startup.
|
|
|
2076
2076
|
against the local filesystem (no S3, no Cognito) with a fixed
|
|
2077
2077
|
local identity. Mailbox store defaults to
|
|
2078
2078
|
~/.lmctl/local-mailbox/ ($LMCTL_LOCAL_MAILBOX_DIR overrides).
|
|
2079
|
-
`;
|
|
2080
|
-
`,"utf8"),Je.renameSync(r,e)}catch(n){try{Je.unlinkSync(r)}catch{}throw n}}function
|
|
2081
|
-
`)),
|
|
2079
|
+
`;ha=class extends Error{missing;constructor(t){let r=t.map(n=>n.provider).join(", ");super(`provider binary pre-flight failed: ${r}`),this.name="ProviderBinaryPreflightError",this.missing=t}},UT=Nu});import{existsSync as lF,mkdirSync as cF,readFileSync as dF,renameSync as uF,unlinkSync as fF,writeFileSync as mF}from"node:fs";import{homedir as VT}from"node:os";import{dirname as Ls,join as _t,resolve as pF}from"node:path";function In(e,t,r){let n=Ls(pF(r)),s=new Set,i=new Map;for(let o of t.members){if(s.add(o.provider),o.teamfile!==void 0)continue;let a=o.sessiondir??n,l=i.get(a)??new Set;l.add(o.provider),i.set(a,l)}for(let[o,a]of i.entries())wr(_t(o,".mcp.json"),"mcpServers",[vn(),kn()]),a.has("opencode")&&wr(_t(o,".opencode","opencode.json"),"mcp",[ZT(),QT()]);for(let o of s)gF(o)}function Au(e=KT??VT()){return _t(e,".copilot","mcp-config.json")}function YT(e,t){let r={};if(Je.existsSync(e)){let i=JSON.parse(Je.readFileSync(e,"utf8"));if(!Ot(i))throw new Error(`${e} is not a JSON object`);r=i}let n=Ot(r.mcpServers)?{...r.mcpServers}:{},s=!1;for(let[i,o]of Object.entries(t)){let a=Ot(n[i])?n[i]:void 0;AF(a,o)||(n[i]=o,s=!0)}return s?(r.mcpServers=n,zT(e,r),{changed:!0}):{changed:!1}}function zT(e,t){Je.mkdirSync(Ls(e),{recursive:!0});let r=_t(Ls(e),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{Je.writeFileSync(r,`${JSON.stringify(t,null,2)}
|
|
2080
|
+
`,"utf8"),Je.renameSync(r,e)}catch(n){try{Je.unlinkSync(r)}catch{}throw n}}function hF(e,t){Je.mkdirSync(Ls(e),{recursive:!0});let r=_t(Ls(e),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{Je.writeFileSync(r,t,"utf8"),Je.renameSync(r,e)}catch(n){try{Je.unlinkSync(r)}catch{}throw n}}function wr(e,t,r){try{if(!Je.existsSync(e))return;let n=JSON.parse(Je.readFileSync(e,"utf8"));if(!Ot(n)||!Ot(n[t]))return;let s={...n[t]},i=[];for(let{name:o,shouldRemove:a}of r)Object.prototype.hasOwnProperty.call(s,o)&&a(s[o])&&(delete s[o],i.push(o));if(i.length===0)return;n[t]=s,zT(e,n),H({event:"mcp_cleanup",path:e,removed:i})}catch{}}function vn(){return{name:ya,shouldRemove:kF}}function ZT(){return{name:ya,shouldRemove:IF}}function kn(){return{name:ga,shouldRemove:SF}}function QT(){return{name:ga,shouldRemove:vF}}function gF(e){let t=KT??VT();switch(e){case"copilot":wr(Au(t),"mcpServers",[vn(),kn()]);return;case"claude":wr(_t(t,".claude.json"),"mcpServers",[vn(),kn()]);return;case"gemini":wr(_t(t,".gemini","settings.json"),"mcpServers",[vn(),kn()]);return;case"qwen":wr(_t(t,".qwen","settings.json"),"mcpServers",[vn(),kn()]);return;case"agy":wr(_t(t,".gemini","antigravity-cli","settings.json"),"mcpServers",[vn(),kn()]);return;case"opencode":wr(_t(t,".config","opencode","opencode.json"),"mcp",[ZT(),QT()]);return;case"codex":yF(_t(t,".codex","config.toml"));return;default:return}}function yF(e){try{if(!Je.existsSync(e))return;let t=Je.readFileSync(e,"utf8"),r=wF(t);if(r===null)return;let n=t.split(/\n/),s=[],i=new Set,o=!1,a;for(let l of n){let c=eb(l);if(c===null)return;if(c!==void 0){if(GT(c,r)){o=!0,a=c[1],i.add(a);continue}o=!1,a=void 0,s.push(l);continue}if(o){if(/^\s*(?:#.*)?$/.test(l)){s.push(l);continue}a!==void 0&&i.add(a);continue}let d=TF(l);if(d===null)return;if(d!==void 0&>(d,r)){i.add(d[1]);continue}s.push(l)}if(i.size===0)return;hF(e,s.join(`
|
|
2081
|
+
`)),H({event:"mcp_cleanup",path:e,removed:[...i]})}catch{}}function GT(e,t){return e.length<2||e[0]!=="mcp_servers"?!1:t.has(e[1])}function wF(e){let t=new Map,r;for(let s of e.split(/\n/)){let i=eb(s);if(i===null)return null;if(i!==void 0){r=i;continue}let o=s.indexOf("=");if(o<0)continue;let a=s.slice(0,o).trim(),l=s.slice(o+1).trim(),c=EF(a,r);if(c===null)return null;if(c===void 0||c.length!==3||c[0]!=="mcp_servers"||c[1]!==ga&&c[1]!==ya)continue;let d=t.get(c[1])??{};if(c[2]==="command"){let u=tb(l);if(u===null)return null;d.command=u}else if(c[2]==="args"){let u=bF(l);if(u===null)return null;d.args=u}t.set(c[1],d)}let n=new Set;for(let[s,i]of t.entries())s===ga&&nb(i.command,i.args)&&n.add(s),s===ya&&sb(i.command,i.args)&&n.add(s);return n}function EF(e,t){if(e.startsWith("mcp_servers"))return wa(e);if(t===void 0||t.length<2||t[0]!=="mcp_servers")return;let r=wa(e);return r===null?null:[...t,...r]}function eb(e){if(!/^\s*\[/.test(e))return;let t=/^\s*\[([^\]\r\n]+)\]\s*(?:#.*)?$/.exec(e);return t===null?null:wa(t[1])}function TF(e){let t=e.indexOf("=");if(t<0)return;let r=e.slice(0,t).trim();if(!(r.length===0||!r.startsWith("mcp_servers")))return wa(r)}function wa(e){let t=[],r=0,n=()=>{for(;r<e.length&&/\s/.test(e[r]);)r+=1};for(;r<e.length;){if(n(),r>=e.length)return null;if(e[r]==='"'){r+=1;let s="",i=!1;for(;r<e.length;){let o=e[r];if(o==="\\"){if(r+1>=e.length)return null;s+=e[r+1],r+=2;continue}if(o==='"'){r+=1,i=!0;break}s+=o,r+=1}if(!i)return null;t.push(s)}else{let s=r;for(;r<e.length&&/[A-Za-z0-9_-]/.test(e[r]);)r+=1;if(r===s)return null;t.push(e.slice(s,r))}if(n(),r>=e.length)break;if(e[r]!==".")return null;r+=1}return t.length>0?t:null}function tb(e){let t=rb(e).trim();if(t.startsWith('"'))try{let r=JSON.parse(t);return typeof r=="string"?r:null}catch{return null}return t.startsWith("'")&&t.endsWith("'")&&t.length>=2?t.slice(1,-1):null}function bF(e){let t=rb(e).trim();if(!t.startsWith("[")||!t.endsWith("]"))return null;let r=t.slice(1,-1).trim();if(r.length===0)return[];let n=r.split(",").map(s=>tb(s.trim()));return n.some(s=>s===null)?null:n}function rb(e){let t;for(let r=0;r<e.length;r+=1){let n=e[r];if(t!==void 0){if(t==='"'&&n==="\\"){r+=1;continue}n===t&&(t=void 0);continue}if(n==='"'||n==="'"){t=n;continue}if(n==="#")return e.slice(0,r)}return e}function SF(e){return Ot(e)?e.type==="stdio"&&typeof e.command=="string"&&nb(e.command,e.args):!1}function vF(e){return!Ot(e)||!Array.isArray(e.command)?!1:e.command.length===2&&typeof e.command[0]=="string"&&typeof e.command[1]=="string"&&ob(e.command[0])&&e.command[1]==="mcp"||e.command.length===3&&typeof e.command[0]=="string"&&typeof e.command[1]=="string"&&typeof e.command[2]=="string"&&ib(e.command[0],[e.command[1],e.command[2]])}function kF(e){return Ot(e)?e.type==="stdio"&&sb(e.command,e.args):!1}function IF(e){return!Ot(e)||!Array.isArray(e.command)?!1:e.command.length===2&&typeof e.command[0]=="string"&&typeof e.command[1]=="string"&&ab(e.command[0])&&e.command[1]==="mcp"}function nb(e,t){return ob(e)&&lb(t)||ib(e,t)}function sb(e,t){return ab(e)&&lb(t)}function ib(e,t){return NF(e)&&Array.isArray(t)&&t.length===2&&xF(t[0])&&t[1]==="mcp"}function ob(e){return typeof e=="string"&&Ru(e)==="lmctl"}function ab(e){return typeof e=="string"&&Ru(e)==="lmctl0"}function NF(e){if(typeof e!="string")return!1;let t=Ru(e).toLowerCase();return t==="node"||t==="node.exe"}function xF(e){if(typeof e!="string")return!1;let t=e.replace(/\\/g,"/");return t==="lmctl-cli/dist/index.js"||t.endsWith("/lmctl-cli/dist/index.js")}function Ru(e){let t=e.replace(/\\/g,"/");return t.split("/").filter(n=>n.length>0).at(-1)??t}function lb(e){return Array.isArray(e)&&e.length===1&&e[0]==="mcp"}function AF(e,t){return e!==void 0&&Ea(e)===Ea(t)}function Ea(e){return Array.isArray(e)?`[${e.map(t=>Ea(t)).join(",")}]`:Ot(e)?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Ea(e[t])}`).join(",")}}`:JSON.stringify(e)}function Ot(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var ga,ya,_F,Je,KT,Os=T(()=>{"use strict";he();ga="lmctl",ya="lmctl0",_F={existsSync:lF,mkdirSync:cF,readFileSync:dF,writeFileSync:mF,renameSync:uF,unlinkSync:fF},Je=_F});function ub(e){let t=cb(e.registry,e.fromTeamfile);if(t===void 0)return Nn(`sender team is not registered in policy graph: ${e.fromTeamfile}`);if(!db(t,e.fromAlias))return Nn(`sender alias "${e.fromAlias}" not found in ${e.fromTeamfile}`);let r=cb(e.registry,e.toTeamfile);return r===void 0?Nn(`target team is not registered in policy graph: ${e.toTeamfile}`):db(r,e.toAlias)?e.toTeamfile===e.fromTeamfile?{allowed:!0,outOfPolicy:!1,reason:"same team"}:t.leadAlias===null?Nn(`sender team has no Lead: ${e.fromTeamfile}`):e.fromAlias!==t.leadAlias?Nn(`cross-team sends may only originate from Lead; got "${e.fromAlias}" in ${e.fromTeamfile}`):{allowed:!0,outOfPolicy:!1,reason:"cross-team send from Lead"}:Nn(`target alias "${e.toAlias}" not found in ${e.toTeamfile}`)}function cb(e,t){return e.teams.find(r=>r.teamfile===t)}function db(e,t){return e.aliases.some(r=>r===t)}function Nn(e){return{allowed:!1,outOfPolicy:!0,reason:e}}var fb=T(()=>{"use strict"});import{randomUUID as RF}from"node:crypto";import{hostname as mb,networkInterfaces as LF}from"node:os";function pb(e){let t=(e.now??new Date).toISOString();return{lock_id:RF(),teamfile:e.teamfile,alias:e.alias,holder_pid:e.pid??process.pid,holder_host:e.host??mb(),holder_ips:e.ips??jF(),started_at:t,last_heartbeat:t}}function _b(e=process.env){return hb(e.LMCTL_TERMINAL_LOCK_HEARTBEAT_MS,OF)}function CF(e=process.env){return hb(e.LMCTL_TERMINAL_LOCK_STALE_MS,$F)}function Lu(e,t={}){let r=t.now??new Date,n=t.localHost??mb(),s=t.staleMs??CF();if(e.holder_host===n)return(t.isProcessAlive??MF)(e.holder_pid)?{live:!0,reason:"local-pid-alive"}:{live:!1,reason:"dead-pid"};let i=Date.parse(e.last_heartbeat);return Number.isFinite(i)?r.getTime()-i<=s?{live:!0,reason:"remote-heartbeat-fresh"}:{live:!1,reason:"stale-heartbeat"}:{live:!1,reason:"stale-heartbeat"}}function Ou(e){return`${e.alias} is held by a terminal on ${e.holder_host} since ${e.started_at}; retry later`}function hb(e,t){if(e===void 0||e.trim()==="")return t;let r=e.trim(),n=Number.parseInt(r,10);return!Number.isFinite(n)||n<=0||String(n)!==r?t:n}function MF(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(t){return(t!==null&&typeof t=="object"&&"code"in t?t.code:void 0)!=="ESRCH"}}function jF(){let e=new Set;for(let t of Object.values(LF()))for(let r of t??[])r.internal||e.add(r.address);return[...e].sort()}var OF,$F,$u=T(()=>{"use strict";OF=15e3,$F=12e4});function DF(e){return`lmctl ${e}: LMCTL_SELF_SESSIONID is not set \u2014 it looks like you are running lmctl
|
|
2082
2082
|
manually, outside a member session that lmctl started. Running lmctl this way is
|
|
2083
2083
|
not officially supported.
|
|
2084
2084
|
To experiment with it manually: https://lmctl.com/lmctl/docs/manual-invocation`}function $s(e){return`lmctl ${e}: LMCTL_SELF_SESSIONID is set but does not match any member of a registered team.
|
|
2085
2085
|
The session marker may be stale or the team may not be registered in this lmctl database.
|
|
2086
|
-
Consulted ${
|
|
2086
|
+
Consulted ${Ks(Dt(),le())}
|
|
2087
2087
|
To experiment with it manually: https://lmctl.com/lmctl/docs/manual-invocation`}function gb(e){return`unknown option --from
|
|
2088
|
-
${
|
|
2089
|
-
`}),i=await
|
|
2090
|
-
`)}}function Sb(e,t,r){return`${t} is servicing ${r.sender_alias} (${r.sender_teamfile}) since ${r.started_at} \u2014 wait and retry, or inspect without waking it: lmctl tail "${e}" ${t}`}async function
|
|
2091
|
-
`),null}}function Tb(e){return e.length<=wb?{text:e,truncated:!1}:{text:e.slice(0,wb),truncated:!0}}var wb,
|
|
2092
|
-
`),e.length===0?2:0;let n=
|
|
2088
|
+
${DF(e)}`}function yb(e,t){let r=Cu(e,t);return r.ok?{ok:!0,identity:r.identity,source:"session"}:r}function Cu(e,t){let r=e[Kn];if(r===void 0||r.length===0)return{ok:!1,reason:"unset"};let n=[];for(let i of t.listRootTeams()){let o=Pe(i.teamfile_path,t);for(let a of o.members)a.teamfile===void 0&&a.session===r&&n.push(`${i.teamfile_path}:${a.alias}`)}let s=[...new Set(n)];if(s.length===0)return{ok:!1,reason:"not-found"};if(s.length>1)throw new Error("LMCTL_SELF_SESSIONID matches multiple team members; the team registry is ambiguous");return{ok:!0,identity:s[0]}}var Ta=T(()=>{"use strict";it();Xe();Rt()});function qr(e){let t=Wr(e);if(t===null)throw new Error(`invalid agent identity: ${e}`);return{teamfile:t.teamfile,alias:t.alias,value:e}}var Mu=T(()=>{"use strict";Lt()});async function va(e){let t=e.onEvent??(()=>{}),r=FF(e.io,t),n=null,s=null,i=null,o,a=null,l=e.prompt;try{let c=await $(r,w=>He(e.teamfile,e.alias,w)),d=c.teamfile,u=await $(r,w=>GF(w,e.env??process.env)),f=u.sender,m=await VF(r,{explicitRoot:e.rootFlag,sender:f,receiverTeamfile:d,operatorOrigin:u.origin==="operator"}),p=f===null?null:await KF(r,{rootTeamfile:m,sender:f,receiverTeamfile:d,receiverAlias:c.alias});p!==null&&!p.allowed&&t({kind:"warning",message:`warning: out-of-policy chat send: ${p.reason}
|
|
2089
|
+
`}),i=await BF(r,{receiverTeamfile:d,receiverAlias:c.alias,sender:f,rootTeamfile:m,provider:c.provider,model:c.model,sessionId:c.sessionid,cwd:c.sessiondir,prompt:e.prompt,origin:u.origin}),o=JF(r,i);try{In(r,De(d),d)}catch{}n={root_teamfile:m,sender_teamfile:f?.teamfile??null,sender_alias:f?.alias??null,receiver_teamfile:d,receiver_alias:c.alias,origin:u.origin,policy:p};let _=await bb(r,d,c.alias);if(_!==null){let w=Ou(_);if(f!==null){let I=await ju(r,{sender:f,receiverTeamfile:d,receiverAlias:c.alias,rootTeamfile:m,payload:e.prompt});return a=ba(`enqueued mailbox message ${I.id}`,null),Du(I.id,f,d,c.alias)}return xn(i,n,e.prompt,w,"unavailable"),a=Pu(w,null),{status:"busy",message:w,teamChatLogId:null}}if(await UF(r,d,c.alias)){if(f!==null){let I=await ju(r,{sender:f,receiverTeamfile:d,receiverAlias:c.alias,rootTeamfile:m,payload:e.prompt});return a=ba(`enqueued mailbox message ${I.id}`,null),Du(I.id,f,d,c.alias)}let w=await WF(r,d,c.alias);return xn(i,n,e.prompt,w,"unavailable"),a=Pu(w,null),{status:"busy",message:w,teamChatLogId:null}}if(f!==null&&f.teamfile!==d){let w=await $(r,I=>fE(I,{root:m,sender:f,receiverTeamfile:d,receiverAlias:c.alias,now:new Date}));if(w.stop){let I=pE(w.chain);return xn(i,n,e.prompt,I,"cycle"),a=Sa(I,null),{status:"error",errorKind:"cycle",message:I,teamChatLogId:null}}}let g=await ZF(r,{receiver_teamfile:d,receiver_alias:c.alias,sender_teamfile:f?.teamfile??d,sender_alias:f?.alias??"operator"});if(!g.acquired){let w=Sb(d,c.alias,g.current);if(f!==null){let I=await ju(r,{sender:f,receiverTeamfile:d,receiverAlias:c.alias,rootTeamfile:m,payload:e.prompt});return a=ba(`enqueued mailbox message ${I.id}`,null),Du(I.id,f,d,c.alias)}return xn(i,n,e.prompt,w,"unavailable"),a=Pu(w,null),{status:"busy",message:w,teamChatLogId:null}}s=g.lease;let h=await Qo({sender:f??{teamfile:d,alias:"operator"},receiver:{teamfile:d,alias:c.alias,provider:c.provider,sessionId:c.sessionid,cwd:c.sessiondir,...c.model!==void 0?{model:c.model}:{},...c.effort!==void 0?{effort:c.effort}:{},...c.isLead!==void 0?{isLead:c.isLead}:{}},newMessage:e.prompt,newMessageFrom:f===null?"operator":`${f.teamfile}:${f.alias}`,io:r,permissionMode:e.permissionMode,env:e.env??process.env,...e.idleTimeoutMs!==void 0?{idleTimeoutMs:e.idleTimeoutMs}:{},onDelta:w=>t({kind:"delta",chunk:w}),onProgress:w=>t({kind:"progress",alias:c.alias,event:w}),onPromptBuilt:w=>{if(l=w,i!==null)return HF(r,i,w)}});l=h.prompt;let S=h.status==="stalled",y=null;if(S){let w=`provider stalled${h.stalledAfterMs!==void 0?` after ${h.stalledAfterMs}ms`:""}`;xn(i,n,l,w,"error"),a=Sa(w,null,h.receipt)}else y=await e1(r,{...n,message:l,response:h.receipt,status:n.policy?.outOfPolicy===!0?"out_of_policy":"ok",error_detail:n.policy?.outOfPolicy===!0?n.policy.reason:null}),a=ba(h.receipt,y);return{status:S?"stalled":"ok",replyText:h.receipt,wroteDelta:h.wroteDelta,teamChatLogId:y,durationMs:h.durationMs}}catch(c){let d=c instanceof Error?c.message:String(c);return xn(i,n,l,d,"error"),a=Sa(d,null),{status:"error",errorKind:c instanceof ye?"target":"provider",message:d,teamChatLogId:null}}finally{o!==void 0&&clearInterval(o),s!==null&&await QF(r,s),i!==null&&await qF(r,i,a??Sa("chat turn exited without a terminal outcome",null))}}function FF(e,t){return{...e,stdout:{write:()=>{}},stderr:{write:r=>{t({kind:"warning",message:r})}}}}async function UF(e,t,r){return await $(e,n=>eE(n,t,r))}async function WF(e,t,r){let n=await bb(e,t,r);if(n!==null)return Ou(n);let s=await $(e,i=>i.getAgentInflight(t,r));return s!==null?Sb(t,r,s):`${r} is busy; wait and retry`}async function ju(e,t){return await $(e,r=>r.enqueueMail({sender_teamfile:t.sender.teamfile,sender_alias:t.sender.alias,receiver_teamfile:t.receiverTeamfile,receiver_alias:t.receiverAlias,root_teamfile:t.rootTeamfile,payload:t.payload}))}function Du(e,t,r,n){let s=`${r}:${n}`;return{status:"enqueued",id:e,message:`mailbox message ${e} enqueued to ${s}`,teamChatLogId:null,sender:`${t.teamfile}:${t.alias}`,receiver:s}}async function BF(e,t){try{return(await $(e,n=>n.startTrackedInvocation({kind:"chat",origin:t.origin,scope_teamfile:t.receiverTeamfile,from_identity:t.sender===null?"operator":`${t.sender.teamfile}:${t.sender.alias}`,target_teamfile:t.receiverTeamfile,target_alias:t.receiverAlias,root_teamfile:t.rootTeamfile,cwd:t.cwd??null,command:XF(t.receiverTeamfile,t.receiverAlias,t.prompt),holder_pid:process.pid,request_payload:t.prompt,meta:JSON.stringify({provider:t.provider,model:t.model??null,sessionid:t.sessionId??null})}))).id}catch(r){return ce()&&Oe(JSON.stringify({event:"tracked_invocation_start_error",error:r instanceof Error?r.message:String(r)})),null}}async function qF(e,t,r){try{await $(e,n=>{n.finishTrackedInvocation(t,r)})}catch(n){ce()&&Oe(JSON.stringify({event:"tracked_invocation_finish_error",id:t,error:n instanceof Error?n.message:String(n)}))}}async function HF(e,t,r){try{await $(e,n=>{n.updateTrackedInvocationRequestPayload(t,r)})}catch(n){ce()&&Oe(JSON.stringify({event:"tracked_invocation_request_payload_error",id:t,error:n instanceof Error?n.message:String(n)}))}}function JF(e,t){if(t===null)return;let r=setInterval(()=>{$(e,n=>n.heartbeatTrackedInvocation(t)).catch(n=>{ce()&&Oe(JSON.stringify({event:"tracked_invocation_heartbeat_error",id:t,error:n instanceof Error?n.message:String(n)}))})},PF);return r.unref?.(),r}function ba(e,t){return{status:"done",result_summary:Cs(e),error:null,team_chat_log_id:t}}function Pu(e,t){return{status:"busy",result_summary:Cs(e),error:e,team_chat_log_id:t}}function Sa(e,t,r){return{status:"error",result_summary:Cs(r===void 0?e:r),error:e,team_chat_log_id:t}}function Cs(e){let t=e.replace(/\s+/gu," ").trim();return t.length<=500?t:`${t.slice(0,497)}...`}function XF(e,t,r){return`lmctl chat ${JSON.stringify(e)} ${t} ${JSON.stringify(r)}`}function GF(e,t){let r=yb(t,e);if(r.ok)return{sender:qr(r.identity),origin:"agent"};if(r.reason==="unset")return{sender:null,origin:"operator"};throw new Error($s("chat"))}async function VF(e,t){if(t.explicitRoot!==void 0)return await $(e,n=>Ee(t.explicitRoot,n));if(t.operatorOrigin||t.sender===null)return t.receiverTeamfile;let r=t.sender;return await $(e,n=>mE(n,{sender:r,now:new Date})??t.receiverTeamfile)}async function KF(e,t){return await $(e,r=>ub({rootTeamfile:t.rootTeamfile,fromTeamfile:t.sender.teamfile,fromAlias:t.sender.alias,toTeamfile:t.receiverTeamfile,toAlias:t.receiverAlias,registry:YF(r,t.sender.teamfile,t.receiverTeamfile)}))}function YF(e,t,r){return{teams:[t,r].map(s=>zF(s,e))}}function zF(e,t){let r=Pe(e,t),n=At(r);return{teamfile:e,aliases:r.members.map(s=>s.alias),leadAlias:n?.alias??null}}async function ZF(e,t){return await $(e,r=>{let n=ce(),s=hr(r,{receiver_teamfile:t.receiver_teamfile,receiver_alias:t.receiver_alias,sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,ttlMs:gr()});return s.acquired?(n&&Oe(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:t.receiver_teamfile,alias:t.receiver_alias},sender:{teamfile:t.sender_teamfile,alias:t.sender_alias},result:s.reclaimReason===null?"acquired":"reclaimed",...s.reclaimReason===null?{}:{reclaim_reason:s.reclaimReason,holder:Eb(s.previous)}})),{acquired:!0,lease:s.lease}):(n&&Oe(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:t.receiver_teamfile,alias:t.receiver_alias},sender:{teamfile:t.sender_teamfile,alias:t.sender_alias},result:"rejected",holder:Eb(s.current)})),{acquired:!1,current:s.current})})}async function bb(e,t,r){return await $(e,n=>{for(let i=0;i<2;i+=1){let o=n.getTerminalLock(t,r);if(o===null)return null;if(Lu(o).live)return o;let l=n.getAgentInflight(t,r);if(n.clearTerminalLock(t,r,o.lock_id))return l!==null&&l.sender_teamfile===t&&l.sender_alias==="terminal"&&n.clearObservedTerminalAgentInflight(t,r,{sender_teamfile:l.sender_teamfile,sender_alias:l.sender_alias,started_at:l.started_at,holder_pid:l.holder_pid}),null}let s=n.getTerminalLock(t,r);return s===null?null:Lu(s).live?s:null})}function Eb(e){return e===null?null:{sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,holder_pid:e.holder_pid,started_at:e.started_at}}async function QF(e,t){try{await $(e,r=>{r.releaseAgentInflight(t)})}catch(r){e.stderr.write(`warning: failed to release chat in-flight slot: ${r instanceof Error?r.message:String(r)}
|
|
2090
|
+
`)}}function Sb(e,t,r){return`${t} is servicing ${r.sender_alias} (${r.sender_teamfile}) since ${r.started_at} \u2014 wait and retry, or inspect without waking it: lmctl tail "${e}" ${t}`}async function e1(e,t){let r=Tb(t.message),n=t.response===null?null:Tb(t.response);try{return await $(e,s=>s.insertTeamChatLog({root_teamfile:t.root_teamfile,sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,receiver_teamfile:t.receiver_teamfile,receiver_alias:t.receiver_alias,message:r.text,response:n?.text??null,origin:t.origin,status:t.status,error_detail:t.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()}))}catch(s){return e.stderr.write(`warning: failed to record chat log: ${s instanceof Error?s.message:String(s)}
|
|
2091
|
+
`),null}}function xn(e,t,r,n,s){e!==null||t===null||H({event:"chat_attempt_error",reason:s,root_teamfile:t.root_teamfile,sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,receiver_teamfile:t.receiver_teamfile,receiver_alias:t.receiver_alias,origin:t.origin,error_detail:n,message_preview:Cs(r)})}function Tb(e){return e.length<=wb?{text:e,truncated:!1}:{text:e.slice(0,wb),truncated:!0}}var wb,PF,Fu=T(()=>{"use strict";Lt();Yt();Os();fb();Rt();ea();he();Le();Fr();$u();Ta();Mu();Xd();wb=256*1024,PF=3e4});var Nb={};we(Nb,{parseIdleTimeoutMs:()=>kb,runChat:()=>r1});async function r1(e,t={stdout:process.stdout,stderr:process.stderr}){let r=t.env??process.env;if(e.length===0||e[0]==="--help"||e[0]==="-h")return t.stdout.write(`${vb}
|
|
2092
|
+
`),e.length===0?2:0;let n=n1(e);if(typeof n=="string")return t.stderr.write(`error: ${n}
|
|
2093
2093
|
${vb}
|
|
2094
2094
|
`),2;if(n.runFlag!==void 0){let u=Number.parseInt(n.runFlag,10);return!Number.isFinite(u)||u<=0||String(u)!==n.runFlag?(t.stderr.write(`error: invalid --run "${n.runFlag}" (expected a positive integer run id)
|
|
2095
2095
|
`),2):await $(t,async f=>{let m=f.getRun(u);if(m===null)return t.stderr.write(`error: run ${u}: not found
|
|
2096
|
-
`),1;if(m.terminal_state!==null&&m.terminal_state.length>0)return v(t,`run ${u}: already terminal (${m.terminal_state}); chat --run cannot resume a terminated run`);let p=
|
|
2096
|
+
`),1;if(m.terminal_state!==null&&m.terminal_state.length>0)return v(t,`run ${u}: already terminal (${m.terminal_state}); chat --run cannot resume a terminated run`);let p=Jo(f,u);if(p===null)return t.stderr.write(`error: run ${u}: no pending operator-answerable attention (chat --run only resumes paused runs)
|
|
2097
2097
|
`),1;if(p.kind==="workflow_escalation"){if(n.done)return t.stderr.write(`error: --done is not valid for workflow_escalation (the decision itself is terminal)
|
|
2098
2098
|
`),2;let _=f.resumeEscalation(p.attention_id,n.prompt);return _.resumed===!0?(t.stdout.write(`run ${u}: escalation resumed (decision: ${n.prompt})
|
|
2099
2099
|
`),0):(t.stderr.write(`error: run ${u}: resumeEscalation failed (${_.reason})
|
|
@@ -2101,10 +2101,10 @@ ${vb}
|
|
|
2101
2101
|
`),1;let g=f.resumeInteractive(_.step_id,n.prompt,n.done===!0);return g.resumed===!0?(t.stdout.write(`run ${u}: interactive resumed (step ${_.step_id}${n.done===!0?", done":""})
|
|
2102
2102
|
`),0):(t.stderr.write(`error: run ${u}: resumeInteractive failed (${g.reason})
|
|
2103
2103
|
`),1)}return t.stderr.write(`error: run ${u}: pending attention kind "${p.kind}" is not operator-answerable
|
|
2104
|
-
`),1})}let s=yr(
|
|
2104
|
+
`),1})}let s=yr(t1,{target:n.target,alias:n.alias,flags:{session:n.sessionFlag,provider:n.providerFlag}});if(s.mode==="error")return t.stderr.write(`error: ${s.message}
|
|
2105
2105
|
`),2;if(s.mode==="managed")return t.stderr.write(`error: chat managed mode requires --run <id>
|
|
2106
2106
|
`),2;let i;if(s.mode==="ai-team"){if(s.alias===void 0)return t.stderr.write(`error: chat: alias required (internal)
|
|
2107
|
-
`),2;let u=await va({teamfile:s.teamfile,alias:s.alias,prompt:n.prompt,permissionMode:n.permissionMode,...n.idleTimeoutMs!==void 0?{idleTimeoutMs:n.idleTimeoutMs}:{},...n.rootFlag!==void 0?{rootFlag:n.rootFlag}:{},env:r,io:t,onEvent:f=>
|
|
2107
|
+
`),2;let u=await va({teamfile:s.teamfile,alias:s.alias,prompt:n.prompt,permissionMode:n.permissionMode,...n.idleTimeoutMs!==void 0?{idleTimeoutMs:n.idleTimeoutMs}:{},...n.rootFlag!==void 0?{rootFlag:n.rootFlag}:{},env:r,io:t,onEvent:f=>i1(t,f)});return n.json===!0?u.status==="enqueued"?(t.stdout.write(`${JSON.stringify({status:"enqueued",path:"enqueued",id:u.id,sender:u.sender,receiver:u.receiver})}
|
|
2108
2108
|
`),0):u.status==="busy"?(t.stdout.write(`${JSON.stringify({status:"busy",message:u.message,teamChatLogId:u.teamChatLogId})}
|
|
2109
2109
|
`),1):u.status==="error"?(t.stdout.write(`${JSON.stringify({status:"error",errorKind:u.errorKind,message:u.message,teamChatLogId:u.teamChatLogId})}
|
|
2110
2110
|
`),1):(t.stdout.write(`${JSON.stringify({status:u.status,replyText:u.replyText,teamChatLogId:u.teamChatLogId})}
|
|
@@ -2117,15 +2117,15 @@ ${vb}
|
|
|
2117
2117
|
`):t.stdout.write(`${u.replyText}${u.replyText.endsWith(`
|
|
2118
2118
|
`)?"":`
|
|
2119
2119
|
`}`),u.status==="stalled"?1:0)}else{if(s.provider===void 0)return t.stderr.write(`error: chat raw mode (bare sessionid / --session) requires --provider <name>
|
|
2120
|
-
`),2;i={provider:s.provider,sessionId:s.sessionid,cwd:process.cwd()}}let o=!1,a=ce(),l=0,c=0,d=0;try{let u={provider:i.provider,sessionId:i.sessionId,cwd:i.cwd,prompt:n.prompt,permissionMode:n.permissionMode,env:r,onDelta:p=>{o=!0,a&&(l+=1,d=Buffer.byteLength(p,"utf8"),c+=d),t.stdout.write(p)},onProgress:p=>Ib(t,i.alias??"(raw)",p)};i.model!==void 0&&(u.model=i.model),i.effort!==void 0&&(u.effort=i.effort),i.alias!==void 0&&(u.alias=i.alias),i.isLead!==void 0&&(u.isLead=i.isLead),n.idleTimeoutMs!==void 0&&(u.timeoutMs=n.idleTimeoutMs);let f=await St(u);a&&Oe(JSON.stringify({event:"chat_return",alias:i.alias??"(raw)",provider:i.provider,streamed:o,blockCount:l,streamedBytes:c,resultTextBytes:Buffer.byteLength(f.text,"utf8"),lastChunkBytes:d,tailPreview:
|
|
2120
|
+
`),2;i={provider:s.provider,sessionId:s.sessionid,cwd:process.cwd()}}let o=!1,a=ce(),l=0,c=0,d=0;try{let u={provider:i.provider,sessionId:i.sessionId,cwd:i.cwd,prompt:n.prompt,permissionMode:n.permissionMode,env:r,onDelta:p=>{o=!0,a&&(l+=1,d=Buffer.byteLength(p,"utf8"),c+=d),t.stdout.write(p)},onProgress:p=>Ib(t,i.alias??"(raw)",p)};i.model!==void 0&&(u.model=i.model),i.effort!==void 0&&(u.effort=i.effort),i.alias!==void 0&&(u.alias=i.alias),i.isLead!==void 0&&(u.isLead=i.isLead),n.idleTimeoutMs!==void 0&&(u.timeoutMs=n.idleTimeoutMs);let f=await St(u);a&&Oe(JSON.stringify({event:"chat_return",alias:i.alias??"(raw)",provider:i.provider,streamed:o,blockCount:l,streamedBytes:c,resultTextBytes:Buffer.byteLength(f.text,"utf8"),lastChunkBytes:d,tailPreview:s1(f.text,200)}));let m=f.status==="stalled";return o?f.text.endsWith(`
|
|
2121
2121
|
`)||t.stdout.write(`
|
|
2122
2122
|
`):t.stdout.write(`${f.text}${f.text.endsWith(`
|
|
2123
2123
|
`)?"":`
|
|
2124
2124
|
`}`),f.status==="stalled"?1:0}catch(u){let f=u instanceof Error?u.message:String(u);return t.stderr.write(`error: ${f}
|
|
2125
|
-
`),1}}function
|
|
2125
|
+
`),1}}function n1(e){let t=[],r="yolo",n,s,i,o,a,l=!1,c=!1;for(let p=0;p<e.length;p+=1){let _=e[p];if(_==="--permission-mode"){let g=e[++p];if(g===void 0||g.startsWith("--"))return"missing value for --permission-mode";if(g!=="plan"&&g!=="yolo")return`--permission-mode must be one of plan|yolo (got "${g}")`;r=g;continue}if(_==="--idle-timeout"){let g=e[++p];if(g===void 0||g.startsWith("--"))return"missing value for --idle-timeout";let h=kb(g);if(typeof h=="string")return h;n=h;continue}if(_==="--session"){let g=e[++p];if(g===void 0||g.startsWith("--"))return"missing value for --session";s=g;continue}if(_==="--provider"){let g=e[++p];if(g===void 0||g.startsWith("--"))return"missing value for --provider";i=g;continue}if(_==="--from"||_.startsWith("--from="))return gb("chat");if(_.startsWith("I_am="))return`unknown argument: ${_}`;if(_==="--root"){let g=e[++p];if(g===void 0||g.startsWith("--"))return"missing value for --root";o=g;continue}if(_==="--force"||_.startsWith("--force="))return"unknown option --force (a dead holder auto-reclaims; for a live holder use lmctl chat)";if(_==="--json"){c=!0;continue}if(_==="--run"){let g=e[++p];if(g===void 0||g.startsWith("--"))return"missing value for --run";a=g;continue}if(_==="--done"){l=!0;continue}if(_.startsWith("--"))return`unknown flag: ${_}`;t.push(_)}if(a!==void 0)return s!==void 0?"--run is mutually exclusive with --session":i!==void 0?"--run is mutually exclusive with --provider":o!==void 0?"--run is mutually exclusive with --root":t.length===0?"a prompt (answer) is required with --run":t.length>1?`--run takes exactly one positional (the answer); got ${t.length}`:{prompt:t[0],permissionMode:r,runFlag:a,done:l,json:c};let d,u,f;if(t.length===0)return"a prompt is required";if(t.length===1){if(s===void 0)return'expected <teamfile>:<alias> "<prompt>" | <teamfile> <alias> "<prompt>" | <sessionid> "<prompt>" | --session <id> "<prompt>"';f=t[0]}else if(t.length===2)d=t[0],f=t[1];else if(t.length===3)d=t[0],u=t[1],f=t[2];else return`too many positionals (${t.length}); expected at most <teamfile> <alias> <prompt>`;if(l)return"--done requires --run";let m={prompt:f,permissionMode:r};return d!==void 0&&(m.target=d),u!==void 0&&(m.alias=u),n!==void 0&&(m.idleTimeoutMs=n),s!==void 0&&(m.sessionFlag=s),i!==void 0&&(m.providerFlag=i),o!==void 0&&(m.rootFlag=o),c&&(m.json=c),m}function kb(e){if(e==="0")return 0;if(/^\d+$/.test(e))return Number(e);let t=/^(\d+)([smhd])$/.exec(e);if(t===null)return`invalid --idle-timeout "${e}" (expected <n>(s|m|h|d), integer ms, or 0)`;let r=Number(t[1]),n=t[2];return r*(n==="s"?1e3:n==="m"?6e4:n==="h"?36e5:864e5)}function Ib(e,t,r){r.kind==="tool_use"?e.stderr.write(`[${t}] tool_use ${r.tool??"tool"}${r.summary?`: ${r.summary}`:""}
|
|
2126
2126
|
`):r.kind==="tool_result"?e.stderr.write(`[${t}] tool_result${r.status?` ${r.status}`:""}${r.summary?`: ${r.summary}`:""}
|
|
2127
2127
|
`):r.kind==="api_retry"&&e.stderr.write(`[${t}] api_retry${r.summary?`: ${r.summary}`:""}
|
|
2128
|
-
`)}function
|
|
2128
|
+
`)}function s1(e,t){return e.slice(-t)}function i1(e,t){t.kind==="delta"?e.stdout.write(t.chunk):t.kind==="progress"?Ib(e,t.alias,t.event):e.stderr.write(t.message)}var t1,vb,xb=T(()=>{"use strict";vt();Le();Lt();Fu();Ta();he();Xo();Ht();t1={name:"chat",allowsBareTeamfile:!1,supportsRaw:!0},vb=`usage: lmctl chat <teamfile>:<alias> "<prompt>"
|
|
2129
2129
|
lmctl chat <teamfile> <alias> "<prompt>"
|
|
2130
2130
|
lmctl chat <sessionid> "<prompt>" --provider <name>
|
|
2131
2131
|
lmctl chat --provider <name> --session <id> "<prompt>"
|
|
@@ -2133,40 +2133,40 @@ ${vb}
|
|
|
2133
2133
|
[--permission-mode plan|yolo] [--idle-timeout <duration>]
|
|
2134
2134
|
[--root <teamfile>] [--json]
|
|
2135
2135
|
|
|
2136
|
-
Send a prompt to a team member or raw provider session, or answer a paused run.`});function
|
|
2136
|
+
Send a prompt to a team member or raw provider session, or answer a paused run.`});function Ms(e){for(let t=e.length-1;t>=0;t-=1){let r=e[t],n=o1.exec(r.content);if(n===null){if(r.role==="assistant"&&r.content.trim().length>0)return null;continue}let s=Number.parseInt(n[1],10),i=n[2]===void 0?0:Number.parseInt(n[2],10),o=n[3].toLowerCase(),a=n[4]?.trim()??null,l=`${n[1]}${n[2]!==void 0?`:${n[2]}`:""}${o}`;return{state:"LIMITED",resets_at:a===null?null:a1(r.timestamp,s,i,o,a),reset_time:l,timezone:a,detected_at:r.timestamp.toISOString()}}return null}function a1(e,t,r,n,s){if(!Number.isFinite(e.getTime())||t<1||t>12||r<0||r>59)return null;let i=l1(t,n);try{let o=c1(e,s),a=Ab(o.year,o.month,o.day,i,r,s);if(a.getTime()<=e.getTime()){let l=m1(o,1);a=Ab(l.year,l.month,l.day,i,r,s)}return a.toISOString()}catch{return null}}function l1(e,t){return t==="am"?e===12?0:e:e===12?12:e+12}function c1(e,t){let r=Rb(t,!1).formatToParts(e);return{year:zt(r,"year"),month:zt(r,"month"),day:zt(r,"day")}}function Ab(e,t,r,n,s,i){let o=Date.UTC(e,t-1,r,n,s,0,0);for(let a=0;a<3;a+=1){let l=d1(new Date(o),i);o=Date.UTC(e,t-1,r,n,s,0,0)-l}return new Date(o)}function d1(e,t){let r=Rb(t,!0).formatToParts(e);return Date.UTC(zt(r,"year"),zt(r,"month")-1,zt(r,"day"),zt(r,"hour"),zt(r,"minute"),zt(r,"second"),0)-e.getTime()}function Rb(e,t){let r=t?f1:u1,n=r.get(e);if(n!==void 0)return n;let s=new Intl.DateTimeFormat("en-US",{timeZone:e,hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",...t?{hour:"2-digit",minute:"2-digit",second:"2-digit"}:{}});return r.set(e,s),s}function zt(e,t){let r=e.find(n=>n.type===t)?.value;if(r===void 0)throw new Error(`missing ${t}`);return Number.parseInt(r,10)}function m1(e,t){let r=new Date(Date.UTC(e.year,e.month-1,e.day+t));return{year:r.getUTCFullYear(),month:r.getUTCMonth()+1,day:r.getUTCDate()}}var o1,u1,f1,Uu=T(()=>{"use strict";o1=/you['\u2019]ve hit your session limit\s*(?:\u00b7|-|:)?\s*resets\s+([0-9]{1,2})(?::([0-9]{2}))?\s*(am|pm)\s*(?:\(([^)]+)\))?/i;u1=new Map,f1=new Map});function ka(e){return _1.has(e)}function Bu(){return Wu===null&&(Wu=Et(bt())),Wu}function qu(e,t,r={}){if(!ka(e))return null;try{let n=Bu().getAdapter?.(e);if(n===void 0)return null;let s=n.resumeCommand(t).trim();if(s.length===0)return null;let i=s.split(/\s+/),o=e==="codex"&&r.isLead===!0?di({warn:()=>{}}):[],a=r.model!==void 0&&r.model.trim().length>0?p1[e]?.(r.model):void 0;return r.model!==void 0&&r.model.trim().length>0&&a===void 0&&r.onModelIgnored?.({provider:e,model:r.model,reason:`${e} terminal resume does not implement per-session model selection`}),[...i,...a??[],...o,...Lb[e]??[]]}catch{return null}}function Ia(e,t,r={}){let n=qu(e,t,r);return n===null?null:n.join(" ")}function Zt(e,t){return Bu().getSession(e,t)}async function Na(e){return(await Bu().resolveSessions(e)).map(r=>r.provider.name)}var Lb,p1,_1,Ob,Wu,An=T(()=>{"use strict";vt();_l();Lb={claude:["--dangerously-skip-permissions"],codex:["--dangerously-bypass-approvals-and-sandbox"],gemini:["-y"],copilot:["--yolo"],opencode:[],qwen:["--approval-mode","yolo"],agy:[],lmplayer:[]},p1={claude:e=>["--model",e],codex:e=>["--model",e],gemini:e=>["--model",e],opencode:e=>["--model",e],qwen:e=>["--model",e],agy:e=>["--model",e],lmplayer:e=>["--model",e]},_1=new Set(Object.keys(Lb)),Ob=/^[\w.:-]+$/;Wu=null});var Mb={};we(Mb,{runRecover:()=>g1});import{dirname as $b,resolve as Cb}from"node:path";async function g1(e,t,r={}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${Hu}
|
|
2137
2137
|
`),0;let n=Z(e.filter(p=>p!=="--"),[],["--all","--dry-run","--json"]);if(n.error!==void 0)return v(t,`${n.error}
|
|
2138
2138
|
|
|
2139
2139
|
${Hu}`);if(n.positionals.length===0)return v(t,`recover requires a <teamfile>
|
|
2140
2140
|
|
|
2141
|
-
${Hu}`);if(n.positionals.length>2)return v(t,`unexpected argument: ${n.positionals[2]}`);let s=n.positionals[0],i=Wr(s),o=i?.teamfile??s,a=n.positionals[1],l=i?.alias??a;if(i!==null&&a!==void 0)return v(t,"recover alias was provided twice; use either <teamfile>:<alias> or <teamfile> <alias>");if(
|
|
2142
|
-
`)}return m.errors>0?1:0}async function
|
|
2143
|
-
`}var
|
|
2144
|
-
`)});var
|
|
2145
|
-
`).length})),i({status:"ok",data:{text:l.trim()||"(empty response)"}});return}i({status:"error",code:d??1,message:c.trim()||`lmctl chat exited with code ${d}`})})})}function
|
|
2146
|
-
`}async function Fb(e,t){let r=!1,n="",s=!1,i=async o=>{let a=o.trim();if(a.length===0)return;let l;try{l=JSON.parse(a)}catch(d){e.io.write(Ku({jsonrpc:"2.0",id:null,error:{code:-32700,message:`parse error: ${d instanceof Error?d.message:String(d)}`}}));return}l.method==="shutdown"&&(r=!0);let c=await
|
|
2141
|
+
${Hu}`);if(n.positionals.length>2)return v(t,`unexpected argument: ${n.positionals[2]}`);let s=n.positionals[0],i=Wr(s),o=i?.teamfile??s,a=n.positionals[1],l=i?.alias??a;if(i!==null&&a!==void 0)return v(t,"recover alias was provided twice; use either <teamfile>:<alias> or <teamfile> <alias>");if(V(n,"--all")&&l!==void 0)return v(t,"recover --all is mutually exclusive with <alias>");let c;try{c=await y1(t,o,l)}catch(p){if(p instanceof ye)return v(t,p.message);throw p}let d=r.now??new Date,u=V(n,"--dry-run"),f=[];for(let p of c)f.push(await w1(t,p,{now:d,dryRun:u}));let m={checked:f.length,recovered:f.filter(p=>p.action==="recovered").length,wouldRecover:f.filter(p=>p.action==="would_recover").length,skipped:f.filter(p=>p.action!=="recovered"&&p.action!=="would_recover").length,errors:f.filter(p=>p.action==="load_error"||p.action==="send_error").length};if(V(n,"--json"))ae(t,{dryRun:u,now:d.toISOString(),summary:m,members:f});else{for(let p of f)t.stdout.write(E1(p));t.stdout.write(`Recover checked ${m.checked}: ${u?`${m.wouldRecover} would recover`:`${m.recovered} recovered`}, ${m.skipped} skipped, ${m.errors} error(s).
|
|
2142
|
+
`)}return m.errors>0?1:0}async function y1(e,t,r){return await $(e,n=>{let s=Ee(t,n);if(r!==void 0){let i=Pe(s,n);if(i.parseErrors.length>0)throw new ye(`lmctl: ${t}: ${i.parseErrors.join("; ")}`);let o=na(i,r);return o?.teamfile!==void 0?Ju(Cb($b(s),o.teamfile),n,new Set):[He(t,r,n)]}return Ju(s,n,new Set)})}function Ju(e,t,r){let n=Ee(e,t);if(r.has(n))return[];r.add(n);let s=Pe(n,t);if(s.parseErrors.length>0)throw new ye(`lmctl: ${n}: ${s.parseErrors.join("; ")}`);let i=[];for(let o of s.members){if(o.teamfile!==void 0){i.push(...Ju(Cb($b(n),o.teamfile),t,r));continue}o.session!==void 0&&i.push(He(n,o.alias,t))}return i}async function w1(e,t,r){let n;try{let a=await Zt(t.sessionid,t.provider);if(a===null)return $t(t,"session_not_found",null,"session detail not found");n=Ms(a.messages)}catch(a){return $t(t,"load_error",null,a instanceof Error?a.message:String(a))}if(n===null)return $t(t,"not_limited",null,"no current session-limit marker");if(n.resets_at===null)return $t(t,"unknown_reset",n,"reset time could not be parsed");let s=Date.parse(n.resets_at);if(!Number.isFinite(s))return $t(t,"unknown_reset",n,"reset time could not be parsed");if(s>r.now.getTime())return $t(t,"not_due",n,`resets_at ${n.resets_at} is in the future`);let i=await $(e,a=>a.getAgentInflight(t.teamfile,t.alias));if(i!==null)return $t(t,"busy",n,`in-flight since ${i.started_at}`);if(r.dryRun)return $t(t,"would_recover",n,null);let o=await va({teamfile:t.teamfile,alias:t.alias,prompt:h1,permissionMode:"yolo",io:e,env:process.env});return o.status==="ok"||o.status==="stalled"?$t(t,"recovered",n,null):$t(t,o.status==="busy"?"busy":"send_error",n,o.message)}function $t(e,t,r,n){return{alias:e.alias,teamfile:e.teamfile,provider:e.provider,sessionid:e.sessionid,action:t,sessionLimit:r,reason:n}}function E1(e){let t=e.sessionLimit?.resets_at??"unknown",r=e.reason===null?"":` (${e.reason})`;return`${e.alias}: ${e.action} resets_at=${t}${r}
|
|
2143
|
+
`}var h1,Hu,jb=T(()=>{"use strict";Uu();An();Yt();Rt();Lt();Fu();Le();h1="Your session limit reset time has passed. Continue your work from the last actionable point.",Hu=["usage: lmctl recover <teamfile> [--all|<alias>] [--dry-run] [--json]","","Wake team members whose latest provider output is a session-limit message","and whose resets_at time has passed. Defaults to the full teamfile report","subtree. A busy/in-flight member is skipped."].join(`
|
|
2144
|
+
`)});var js,Z6,Xu=T(()=>{"use strict";js=[{name:"lmctl_chat",description:"Synchronous/blocking backup: send one prompt to a member of an AI-managed .lmctl team \u2014 addressed by teamfile path (team) and alias \u2014 and return the reply. This is the only MCP tool lmctl exposes. Prefer the CLI for normal delegation. For async or long-running work, use the provider or host runtime background/task surface around the blocking command.",inputSchema:{type:"object",properties:{team:{type:"string",description:"Path to .lmctl teamfile"},alias:{type:"string",description:"Target alias; omitted means Lead"},prompt:{type:"string",description:"Prompt text to send"}},required:["team","prompt"]},local:!0}],Z6=js.length});import{spawn as T1}from"node:child_process";async function Pb(e,t,r){let n=S1.get(e);if(n===void 0)return{status:"error",code:404,message:`unknown tool: ${e}`};let s=t!==null&&typeof t=="object"&&!Array.isArray(t)?t:{};for(let i of n.inputSchema.required??[])if(s[i]===void 0)return{status:"error",code:400,message:`missing required parameter: ${i}`};return v1(n.name,s)}function v1(e,t){return e==="lmctl_chat"?k1(t):{status:"error",code:404,message:`unknown local tool: ${e}`}}function k1(e){let t=typeof e.prompt=="string"?e.prompt:"";if(t.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: prompt"});let r=typeof e.team=="string"?e.team:"";if(r.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: team"});let n=typeof e.alias=="string"&&e.alias.length>0?e.alias:"Lead",s=["chat",r,n,t];return ce()&&Oe(JSON.stringify({event:"mcp_chat_spawn",team:r,alias:n})),I1(s,process.cwd())}function I1(e,t){return new Promise(r=>{let n=!1,s,i=d=>{n||(n=!0,s!==void 0&&clearTimeout(s),r(d))},o=T1("lmctl",e,{cwd:t,env:process.env,stdio:["ignore","pipe","pipe"]}),a=N1(process.env);s=setTimeout(()=>{try{o.kill("SIGTERM")}catch{}i({status:"error",code:124,message:`lmctl chat timed out after ${a}ms`})},a),s.unref?.();let l="",c="";o.stdout?.on("data",d=>{l+=d.toString("utf8")}),o.stderr?.on("data",d=>{c+=d.toString("utf8")}),o.on("error",d=>{i({status:"error",code:1,message:`failed to spawn lmctl chat: ${d.message}`})}),o.on("exit",d=>{if(d===0){ce()&&Oe(JSON.stringify({event:"mcp_chat_payload",bytes:Buffer.byteLength(l,"utf8"),lines:l.split(`
|
|
2145
|
+
`).length})),i({status:"ok",data:{text:l.trim()||"(empty response)"}});return}i({status:"error",code:d??1,message:c.trim()||`lmctl chat exited with code ${d}`})})})}function N1(e){let t=e.LMCTL_MCP_CHAT_TIMEOUT_MS;if(t===void 0||t.trim().length===0)return Db;let r=Number(t);return!Number.isFinite(r)||r<=0?Db:r}function Gu(e,t=process.env){let n=e.getConfig("api.url")??(t.LMCTL_API_URL!==void 0&&t.LMCTL_API_URL.length>0?t.LMCTL_API_URL:b1),i=e.getConfig("api.token")??(t.LMCTL_API_TOKEN!==void 0&&t.LMCTL_API_TOKEN.length>0?t.LMCTL_API_TOKEN:null);return{baseUrl:n,token:i}}var b1,Db,S1,Vu=T(()=>{"use strict";Xu();he();b1="http://127.0.0.1:8787",Db=30*60*1e3,S1=new Map(js.map(e=>[e.name,e]))});async function L1(e,t){let r=e.id===void 0,n=e.id??null;if(e.method==="exit")return r||t.io.write(Ku({jsonrpc:"2.0",id:n,result:null})),{kind:"exit"};if(e.method==="initialize")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{protocolVersion:x1,capabilities:{tools:{listChanged:!1}},serverInfo:{name:A1,version:R1}}}};if(e.method==="notifications/initialized")return{kind:"notification"};if(e.method==="shutdown")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:null}};if(e.method==="tools/list")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{tools:js.map(s=>({name:s.name,description:s.description,inputSchema:s.inputSchema}))}}};if(e.method==="tools/call"){let s=e.params!==null&&typeof e.params=="object"?e.params:{},i=typeof s.name=="string"?s.name:"",o=s.arguments,a=await Pb(i,o,t.dispatch),l=i==="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: ${e.method}`}}}}function Ku(e){return`${JSON.stringify(e)}
|
|
2146
|
+
`}async function Fb(e,t){let r=!1,n="",s=!1,i=async o=>{let a=o.trim();if(a.length===0)return;let l;try{l=JSON.parse(a)}catch(d){e.io.write(Ku({jsonrpc:"2.0",id:null,error:{code:-32700,message:`parse error: ${d instanceof Error?d.message:String(d)}`}}));return}l.method==="shutdown"&&(r=!0);let c=await L1(l,e);c.kind==="response"?e.io.write(Ku(c.message)):c.kind==="exit"&&(s=!0)};return new Promise(o=>{let a=Promise.resolve(),l=!1,c=u=>{l||(l=!0,o(u))},d=()=>{let u=n.indexOf(`
|
|
2147
2147
|
`);for(;u!==-1;){let f=n.slice(0,u);n=n.slice(u+1),a=a.then(()=>i(f)).then(()=>{s&&c(0)}),u=n.indexOf(`
|
|
2148
2148
|
`)}};t.setEncoding("utf8"),t.on("data",u=>{n+=u,d()}),t.on("end",()=>{n.trim().length>0&&(a=a.then(()=>i(n))),a.finally(()=>c(0))}),t.on("error",u=>{e.io.log?.(`mcp: stdin error: ${u.message}
|
|
2149
|
-
`),a.finally(()=>c(1))})})}var
|
|
2150
|
-
`),2;
|
|
2149
|
+
`),a.finally(()=>c(1))})})}var x1,A1,R1,Ub=T(()=>{"use strict";Xu();Vu();x1="2025-06-18",A1="lmctl",R1="0.0.1"});var Bb={};we(Bb,{runMcp:()=>$1});async function $1(e,t={stdout:process.stdout,stderr:process.stderr},r=process.stdin){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(O1),0;if(e.length>0)return t.stderr.write(`usage: lmctl mcp
|
|
2150
|
+
`),2;H({event:"mcp_bridge_start",pid:process.pid});let n=t.dal===void 0,s=t.dal??C1(),i=1;try{let o=s===void 0?Gu({getConfig:()=>null},process.env):Gu(s,process.env);return i=await Fb({io:{write:l=>t.stdout.write(l),log:l=>t.stderr.write(l)},dispatch:{config:o,...s!==void 0?{dal:s}:{}}},r),i}finally{H({event:"mcp_bridge_exit",pid:process.pid,exit_code:i}),n&&s!==void 0&&s.close()}}function C1(){let e=le(),t=3;for(let r=1;r<=t;r+=1)try{return Ie({path:e})}catch(n){let s=n instanceof Error?n.message:String(n);if(H({event:"mcp_bridge_db_open_failed",pid:process.pid,attempt:r,db_path:e,error_message:s}),r<t&&Wb(s))M1(50*r);else if(!Wb(s))break}}function Wb(e){return/SQLITE_BUSY|database is locked|database is busy/i.test(e)}function M1(e){let t=new Int32Array(new SharedArrayBuffer(4));Atomics.wait(t,0,0,e)}var O1,qb=T(()=>{"use strict";Ze();Vu();Ub();he();Xe();O1=`usage: lmctl mcp
|
|
2151
2151
|
|
|
2152
2152
|
Start the stdio MCP bridge. The bridge resolves api.url and api.token from
|
|
2153
2153
|
local config, then uses stdin/stdout for JSON-RPC frames.
|
|
2154
|
-
`});var Hb={};
|
|
2155
|
-
`),0}if(r==="id"){let n=Br();return n===null?(t.stderr.write(`error: no device id initialized at ${
|
|
2154
|
+
`});var Hb={};we(Hb,{runDevice:()=>X1});import{readFileSync as j1}from"node:fs";import{homedir as D1}from"node:os";import{join as P1}from"node:path";import{CognitoIdentityClient as F1,GetIdCommand as U1}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as W1}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as B1,ListObjectsV2Command as q1,PutObjectCommand as H1,S3Client as J1}from"@aws-sdk/client-s3";async function X1(e,t={stdout:process.stdout,stderr:process.stderr}){let[r]=e;if(r===void 0||r==="--help"||r==="-h"||r==="help")return t.stdout.write(Yu),0;if(r==="init"){let n=ku();return t.stdout.write(`${n.device_id}
|
|
2155
|
+
`),0}if(r==="id"){let n=Br();return n===null?(t.stderr.write(`error: no device id initialized at ${pa()}; run 'lmctl device init'
|
|
2156
2156
|
`),1):(t.stdout.write(`${n.device_id}
|
|
2157
|
-
`),0)}return r==="login"?await
|
|
2158
|
-
`),1)}async function
|
|
2157
|
+
`),0)}return r==="login"?await G1(e.slice(1),t):r==="prompt"?await K1(e.slice(1),t):(t.stderr.write(`usage: lmctl device <id|init|login|prompt>
|
|
2158
|
+
`),1)}async function G1(e,t){let r=V1(e);if(typeof r=="string")return t.stderr.write(`error: ${r}
|
|
2159
2159
|
${Yu}`),2;let n=Rs();if(n.config===void 0)return t.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
|
|
2160
|
-
`),1;uT({userId:r.userId,refreshToken:r.accessKey});let s,i,o;try{let c=await
|
|
2160
|
+
`),1;uT({userId:r.userId,refreshToken:r.accessKey});let s,i,o;try{let c=await la({region:n.config.region,clientId:n.config.cognitoClientId??ma,refreshToken:r.accessKey});s=c.idToken,i=c.accessToken,o=c.expiresAt}catch(c){let d=c instanceof Error?c.message:String(c);return t.stderr.write(`error: could not authenticate access key: ${d}
|
|
2161
2161
|
`),1}let a=Ns(s);if(a!==null&&a!==r.userId)return t.stderr.write(`error: access key belongs to user-id ${a}, not ${r.userId}
|
|
2162
2162
|
`),1;hu({idToken:s,...i!==void 0?{accessToken:i}:{},refreshToken:r.accessKey,...o!==void 0?{expiresAt:o}:{}});let l=Br()??ku();return t.stdout.write(`logged in as ${r.userId}
|
|
2163
2163
|
device id: ${l.device_id}
|
|
2164
2164
|
mailbox prefix: ${r.userId}/${l.device_id}/
|
|
2165
2165
|
access key stored at ${xs()}
|
|
2166
|
-
`),0}function
|
|
2166
|
+
`),0}function V1(e){let t,r;for(let n=0;n<e.length;n+=1){let s=e[n];if(s==="--user-id"){let i=e[++n];if(i===void 0||i.startsWith("--"))return"missing value for --user-id";t=i;continue}if(s==="--access-key"){let i=e[++n];if(i===void 0||i.startsWith("--"))return"missing value for --access-key";r=i;continue}return`unknown argument: ${s}`}return t===void 0?"missing --user-id <sub>":r===void 0?"missing --access-key <refreshToken>":{userId:t,accessKey:r}}async function K1(e,t){let r=Y1(e);if(typeof r=="string")return t.stderr.write(`error: ${r}
|
|
2167
2167
|
${Yu}`),2;let n=Rs();if(n.config===void 0)return t.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
|
|
2168
|
-
`),1;let s=
|
|
2169
|
-
`),0}function
|
|
2168
|
+
`),1;let s=Z1();if(s===null)return t.stderr.write("error: no Cognito id token found; run `webcli login` or `lmctl device login` first\n"),1;let i=s.cognito?.idToken;if(typeof i!="string"||i.length===0)return t.stderr.write("error: no Cognito id token found; run `webcli login` or `lmctl device login` first\n"),1;let o=`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 z1({region:n.config.region,identityPoolId:n.config.identityPoolId,idpProvider:o,idToken:i}),l=W1({identityId:a,logins:{[o]:i},clientConfig:{region:n.config.region}}),c=n.config.deviceId??Br()?.device_id,d=Ns(i)??void 0,u=new Dr({bucket:n.config.mailboxBucket,identityId:a,...d!==void 0?{userId:d}:{},...c!==void 0?{deviceId:c}:{},...n.config.mailboxKey!==void 0?{mailboxKey:n.config.mailboxKey}:{},s3:new J1({region:n.config.region,credentials:l}),commands:{ListObjectsV2Command:q1,GetObjectCommand:B1,PutObjectCommand:H1},selfRole:"browser",onMessage:async()=>{}}),f=eT({root_teamfile:r.root,text:r.text,...r.promptId!==void 0?{prompt_id:r.promptId}:{}}),m=await u.putMessage({conversation_id:QE,payload:f});return t.stdout.write(JSON.stringify({prompt_id:f.prompt_id,mailbox_key:u.getMailboxBasePrefix(),object_key:m},null,2)+`
|
|
2169
|
+
`),0}function Y1(e){let t,r,n;for(let s=0;s<e.length;s+=1){let i=e[s];if(i==="--root"){let o=e[++s];if(o===void 0||o.startsWith("--"))return"missing value for --root";t=o;continue}if(i==="--text"){let o=e[++s];if(o===void 0||o.startsWith("--"))return"missing value for --text";r=o;continue}if(i==="--prompt-id"){let o=e[++s];if(o===void 0||o.startsWith("--"))return"missing value for --prompt-id";n=o;continue}return`unknown argument: ${i}`}return t===void 0?"missing --root <teamfile>":r===void 0?"missing --text <prompt>":{root:t,text:r,...n!==void 0?{promptId:n}:{}}}async function z1(e){let r=await new F1({region:e.region}).send(new U1({IdentityPoolId:e.identityPoolId,Logins:{[e.idpProvider]:e.idToken}}));if(r.IdentityId===void 0||r.IdentityId.length===0)throw new Error("Cognito GetId returned no IdentityId");return r.IdentityId}function Z1(e=process.env.LMCTL_TOKEN_PATH??P1(D1(),".lmctl","cli-tokens.json")){try{return JSON.parse(j1(e,"utf8"))}catch{return null}}var Yu,Jb=T(()=>{"use strict";Iu();Eu();Fo();fu();mu();gu();pu();Yu=`usage: lmctl device <id|init|login|prompt>
|
|
2170
2170
|
lmctl device login --user-id <sub> --access-key <refreshToken>
|
|
2171
2171
|
lmctl device prompt --root <teamfile> --text <prompt> [--prompt-id <id>]
|
|
2172
2172
|
|
|
@@ -2176,7 +2176,7 @@ addressing. The id is stored in ~/.lmctl/device.json by default.
|
|
|
2176
2176
|
'lmctl device login' authenticates this machine's 'lmctl serve' daemon to the
|
|
2177
2177
|
cloud mailbox using your user-id (Cognito sub) and an access key (refresh
|
|
2178
2178
|
token). The access key is stored in ~/.lmctl/device-auth.json (chmod 600).
|
|
2179
|
-
`});import{existsSync as Xb,mkdirSync as
|
|
2179
|
+
`});import{existsSync as Xb,mkdirSync as Q1,readdirSync as eU,readFileSync as Gb,writeFileSync as tU}from"node:fs";import{join as Rn}from"node:path";import{fileURLToPath as rU}from"node:url";function Zu(e){try{return nU.some(t=>Xb(Rn(e,t)))}catch{return!1}}function sU(e){let t=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(t===null)return null;let r=t[1],n=t[2].trimStart(),s=r.match(/^name:\s*(.+)$/m),i=r.match(/^type:\s*(.+)$/m),o=r.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=i?.[1]?.trim();return!a||!l?null:{name:a,type:l,description:o?.[1]?.trim()??null,body:n}}function Vb(e,t){e.durable_memory_mode!=="db"?iU(e):oU(e,t)}function Kb(e){let t=Zu(e),r;try{r=eU(zu).filter(n=>n.endsWith(".template")).sort()}catch{return[]}return r.filter(n=>n==="skills_lmprobe.md.template"||n==="skills_lmdebug.md.template"?t:!0)}function iU(e){let t=e.local_path;if(!t){console.warn("[bootstrap] skipping: project has no local_path");return}let r=Rn(t,"durable-memory");try{Q1(r,{recursive:!0})}catch(i){console.error("[bootstrap] failed to create durable-memory directory:",i);return}let n=Kb(t),s=[];for(let i of n){let o=i.replace(/\.template$/,""),a=Rn(r,o);if(!Xb(a))try{let l=Gb(Rn(zu,i),"utf8");tU(a,l,"utf8"),s.push(o)}catch(l){console.error(`[bootstrap] failed to copy ${i}:`,l)}}s.length>0&&console.log(`[bootstrap] filled durable-memory stubs at ${r}: ${s.join(", ")}`)}function oU(e,t){let r=e.local_path??"",n=Kb(r),s=[];for(let i of n){let o=Rn(zu,i),a;try{a=Gb(o,"utf8")}catch(c){console.error(`[bootstrap] failed to read ${i}:`,c);continue}let l=sU(a);if(l===null){console.error(`[bootstrap] failed to parse frontmatter in ${i}`);continue}if(t.getDurableMemoryByName(e.id,l.name)===null)try{t.upsertDurableMemory({project_id:e.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 ${e.name}: ${s.join(", ")}`)}var zu,nU,Qu=T(()=>{"use strict";zu=Rn(rU(import.meta.url),"../../config/durable_memory_templates"),nU=[".git","package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","composer.json","Pipfile"]});import{existsSync as aU,mkdirSync as lU,readdirSync as cU,readFileSync as dU,writeFileSync as uU}from"node:fs";import{join as xa}from"node:path";import{fileURLToPath as fU}from"node:url";function zb(e){let t=e.local_path;if(!t){console.warn("[bootstrap] skipping ai-test: project has no local_path");return}if(!Zu(t))return;let r=xa(t,"ai-test");try{lU(r,{recursive:!0})}catch(s){console.error("[bootstrap] failed to create ai-test directory:",s);return}let n=[];for(let s of mU()){let i=s.replace(/\.template$/,""),o=xa(r,i);if(!aU(o))try{uU(o,pU(s),"utf8"),n.push(i)}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 mU(){try{return cU(Yb).filter(e=>e.endsWith(".template")).sort()}catch{return["example-test.md.template","index.md.template"]}}function pU(e){try{return dU(xa(Yb,e),"utf8")}catch{return _U(e)}}function _U(e){let t=e.replace(/\.template$/,"");return t==="index.md"?`# AI Test Suite - index
|
|
2180
2180
|
|
|
2181
2181
|
Add test chapters in this directory.
|
|
2182
2182
|
`:`---
|
|
@@ -2198,9 +2198,9 @@ last_run_id: 0
|
|
|
2198
2198
|
## Expected
|
|
2199
2199
|
|
|
2200
2200
|
## Cleanup
|
|
2201
|
-
`}var Yb,Zb=T(()=>{"use strict";Qu();Yb=xa(
|
|
2202
|
-
`,"utf8")}function
|
|
2203
|
-
`)};if(s.mcp.length>0){let l=[];for(let c of s.mcp)l.push(...await
|
|
2201
|
+
`}var Yb,Zb=T(()=>{"use strict";Qu();Yb=xa(fU(import.meta.url),"../../config/ai_test_templates")});import{createHash as hU}from"node:crypto";import{existsSync as gU,mkdirSync as yU,writeFileSync as wU}from"node:fs";import{dirname as EU,join as Ln}from"node:path";function Aa(e){return typeof e=="string"&&e.startsWith(Qb)}function IU(e){if(!Aa(e))throw new ht(`not an lmctl:// URI: ${e}`,"malformed");let t=e.slice(Qb.length),r=t.indexOf("/");if(r<=0)throw new ht(`malformed lmctl:// URI (expected lmctl://<workflow|mcp|skill>/<name>): ${e}`,"malformed");let n=t.slice(0,r);if(!vU.has(n))throw new ht(`unknown lmctl:// kind '${n}' (expected workflow|mcp|skill): ${e}`,"malformed");let s=t.slice(r+1),i,o=s.indexOf("@");o>=0&&(i=s.slice(o+1).trim(),s=s.slice(0,o));let a=s.trim();if(a.length===0)throw new ht(`empty name in lmctl:// URI: ${e}`,"malformed");if(/[\\/]|\.\./.test(a))throw new ht(`invalid name in lmctl:// URI (no path separators): ${e}`,"malformed");return{kind:n,name:a,...i!==void 0&&i.length>0?{ref:i}:{}}}function NU(e,t,r){if(e==="workflow")return yo(t,r);let n=e==="mcp"?Ln("templates","mcp",`${t}.json`):Ln("templates","skills",t,"SKILL.md");for(let s of nd(r)){let i=Ln(s,n);if(gU(i))return i}return null}function xU(e,t,r){let n=Ln(rd(r),bU,e);return e==="skill"?Ln(n,t,"SKILL.md"):Ln(n,`${t}${e==="workflow"?".compound.json":".json"}`)}function AU(e,t){if(t.trim().length===0)return!1;if(e==="skill")return!0;let r=t.trim();if(e==="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 ef(e,t){let{kind:r,name:n,ref:s}=IU(e),i=NU(r,n,t);if(i!==null)return i;let o=`${TU}${r}/${n}`,a;try{a=await fetch(o,{signal:AbortSignal.timeout(SU)})}catch(d){throw new ht(`lmctl:// '${e}' not found locally or at the remote catalog ${o} (${d instanceof Error?d.message:String(d)}). Failing closed.`,"missing")}if(!a.ok)throw new ht(`lmctl:// '${e}' not found locally or at the remote catalog ${o} (HTTP ${a.status}). Failing closed.`,"missing");let l=await a.text();if(s!==void 0){let d=kU.exec(s);if(d!==null){let u=hU("sha256").update(l).digest("hex");if(u.toLowerCase()!==d[1].toLowerCase())throw new ht(`lmctl:// '${e}' remote artifact FAILED integrity pin (expected sha256 ${d[1]}, got ${u}) \u2014 discarded, NOT cached.`,"validation-failure")}}if(!AU(r,l))throw new ht(`lmctl:// '${e}' remote artifact failed shape validation for ${r} \u2014 discarded, NOT cached.`,"validation-failure");let c=xU(r,n,t);return yU(EU(c),{recursive:!0}),wU(c,l,"utf8"),c}var Qb,TU,bU,SU,vU,ht,kU,eS=T(()=>{"use strict";sd();Qb="lmctl://",TU="https://lmctl.com/templates/",bU=".cache",SU=8e3,vU=new Set(["workflow","mcp","skill"]),ht=class extends Error{reason;constructor(t,r="malformed"){super(t),this.reason=r,this.name="LmctlUriError"}},kU=/^(?:sha256[:-])?([0-9a-f]{64})$/i});import{spawnSync as oS}from"node:child_process";import{cpSync as tS,existsSync as nf,mkdirSync as aS,mkdtempSync as RU,readFileSync as lS,statSync as LU,writeFileSync as tf}from"node:fs";import{homedir as OU,tmpdir as $U}from"node:os";import{basename as rS,join as rt}from"node:path";function Qt(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function rf(e,t,r){if(Array.isArray(e)){for(let n of e)rf(n,t,r);return}if(Qt(e)){e.alias===t&&(Array.isArray(e.mcp)&&r.mcp.push(...e.mcp),Array.isArray(e.skills)&&r.skills.push(...e.skills));for(let n of Object.values(e))rf(n,t,r)}}function DU(e,t){let r={mcp:[],skills:[]},n=new Set;for(let i of e.listProjects()){if(i.team_id!==t.team_id)continue;let o=e.getWorkflowByName(i.workflow_name);if(o===null||n.has(o.id))continue;n.add(o.id);let a;try{a=JSON.parse(o.definition)}catch{continue}if(!(!Qt(a)||!Array.isArray(a.steps)))for(let l of a.steps)Qt(l)&&l.members!==void 0&&rf(l.members,t.alias,r)}let s=i=>{let o=new Map;for(let a of i)o.set(jU(a),a);return[...o.values()]};return{mcp:s(r.mcp),skills:s(r.skills)}}function PU(e,t){return e.listProjects().find(r=>r.team_id===t.team_id)?.local_path}async function cS(e,t){let r;try{r=await fetch(e,{signal:AbortSignal.timeout(CU)})}catch(s){throw new nt(t,`fetch ${e} failed: ${s.message}`)}if(!r.ok)throw new nt(t,`fetch ${e} \u2192 HTTP ${r.status}`);let n=await r.text();if(n.length>nS)throw new nt(t,`fetched ${e} exceeds ${nS} bytes`);return n}async function FU(e,t){if(typeof e!="string")return[e];Aa(e)&&(e=await ef(e));let r;if(sf.test(e))r=await cS(e,t);else{if(!nf(e))throw new nt(t,`mcp file not found: ${e}`);r=lS(e,"utf8")}let n;try{n=JSON.parse(r)}catch{throw new nt(t,`mcp source is not JSON: ${e}`)}if(Qt(n)&&Qt(n.mcpServers))return Object.entries(n.mcpServers).map(([s,i])=>({name:s,...Qt(i)?i:{}}));if(Qt(n)&&typeof n.name=="string")return[n];throw new nt(t,`mcp source ${e} is neither {mcpServers:{\u2026}} nor a {name,\u2026} server`)}function La(e){return e.type==="http"||e.type==="sse"||e.url!==void 0&&e.command===void 0}function Ra(e,t,r,n){let s=oS(e,t,{cwd:r,env:Ft(void 0,r),encoding:"utf8",timeout:6e4});if(s.error)throw new nt(n,`spawn ${e} failed: ${s.error.message}`);if(s.status!==0)throw new nt(n,`${e} ${t.slice(0,3).join(" ")} exited ${s.status}: ${(s.stderr??"").trim().slice(0,200)}`)}function UU(e,t,r){oS(e,t,{cwd:r,env:Ft(void 0,r),encoding:"utf8",timeout:6e4})}function WU(e,t){return e==="claude"?["mcp","remove",t,"--scope","user"]:["mcp","remove",t]}function BU(e){let t=["mcp","add"];if(La(e)){t.push("-t",e.type==="sse"?"sse":"http");for(let[r,n]of Object.entries(e.headers??{}))t.push("-H",`${r}: ${n}`);t.push(e.name,e.url??"")}else{for(let[r,n]of Object.entries(e.env??{}))t.push("-e",`${r}=${n}`);t.push(e.name,e.command??"",...e.args??[])}return t}function qU(e){if(La(e))return["mcp","add",e.name,"--url",e.url??""];let t=["mcp","add",e.name];for(let[r,n]of Object.entries(e.env??{}))t.push("--env",`${r}=${n}`);return t.push("--",e.command??"",...e.args??[]),t}function HU(e){let t=rt(process.env.XDG_CONFIG_HOME??rt(On(),".config"),"opencode"),r=rt(t,"opencode.json"),n={};if(nf(r))try{let i=JSON.parse(lS(r,"utf8"));Qt(i)&&(n=i)}catch{}let s=Qt(n.mcp)?{...n.mcp}:{};for(let i of e){let{name:o,...a}=i;s[o]=La(i)?{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"),aS(t,{recursive:!0}),tf(r,`${JSON.stringify(n,null,2)}
|
|
2202
|
+
`,"utf8")}function JU(e,t){let r={};for(let n of e)r[n.name]=La(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{YT(Au(On()),r)}catch(n){throw new nt(t,`copilot MCP config install failed: ${n instanceof Error?n.message:String(n)}`)}}function XU(e){if(typeof e!="string")return e.name;let t=rS(e.replace(/\/+$/,""));return t.toLowerCase()==="skill.md"?rS(e.replace(/\/skill\.md$/i,"")):t}async function sS(e,t,r){let n=XU(e),s=rt(t,n);if(aS(s,{recursive:!0}),typeof e!="string")return tf(rt(s,"SKILL.md"),e.content,"utf8"),{name:n,dir:s};if(Aa(e)&&(e=await ef(e)),sf.test(e))return tf(rt(s,"SKILL.md"),await cS(e,r),"utf8"),{name:n,dir:s};if(!nf(e))throw new nt(r,`skill path not found: ${e}`);return LU(e).isDirectory()?(tS(e,s,{recursive:!0}),{name:n,dir:s}):(tS(e,rt(s,"SKILL.md")),{name:n,dir:s})}async function dS(e){let{dal:t,member:r,stderr:n}=e,s=DU(t,r);if(s.mcp.length===0&&s.skills.length===0)return;let i=Ue(r),o=r.sessiondir||e.baseDir||PU(t,r)||process.cwd(),a=l=>{n.write(`[seed:${r.alias}] ${l}
|
|
2203
|
+
`)};if(s.mcp.length>0){let l=[];for(let c of s.mcp)l.push(...await FU(c,r.alias));if(i==="opencode")HU(l);else if(i==="copilot")JU(l,r.alias);else if(i==="claude"||i==="gemini"||i==="qwen"||i==="agy"||i==="codex")for(let c of l)if(UU(i,WU(i,c.name),o),i==="claude"){let{name:d,...u}=c;Ra("claude",["mcp","add-json",d,JSON.stringify(u),"--scope","user"],o,r.alias)}else i==="codex"?Ra("codex",qU(c),o,r.alias):Ra(i,BU(c),o,r.alias);else a(`provider ${i} has no known MCP install mechanism \u2014 ${l.length} declared server(s) NOT installed.`);["opencode","claude","gemini","qwen","agy","codex","copilot"].includes(i)&&a(`installed ${l.length} MCP server(s) into ${i} (idempotent).`)}if(s.skills.length>0)if(MU.has(i))a(`skills for ${i} 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(i==="gemini"||i==="agy"){let l=RU(rt($U(),`lmctl-skill-${r.alias}-`));for(let c of s.skills){let d=typeof c=="string"&&!sf.test(c)?c:(await sS(c,l,r.alias)).dir;Ra(i,["skills","install",d,"--scope","user","--consent"],o,r.alias)}a(`installed ${s.skills.length} skill(s) via \`${i} skills install --scope user\` (idempotent).`)}else if(iS[i]!==void 0){let l=iS[i]();for(let c of s.skills)await sS(c,l,r.alias);a(`installed ${s.skills.length} skill(s) \u2192 ${l}/<name>/SKILL.md (idempotent overwrite).`)}else a(`provider ${i} has no verified skills mechanism \u2014 ${s.skills.length} declared skill(s) NOT installed.`)}var nt,sf,CU,nS,MU,jU,On,iS,uS=T(()=>{"use strict";Ze();eS();it();Os();nt=class extends Error{alias;constructor(t,r){super(`capability install failed for ${t}: ${r}`),this.alias=t,this.name="CapabilityInstallError"}},sf=/^https?:\/\//i,CU=8e3,nS=1e6,MU=new Set(["opencode"]),jU=e=>JSON.stringify(e),On=()=>process.env.HOME??OU();iS={claude:()=>rt(On(),".claude","skills"),qwen:()=>rt(On(),".qwen","skills"),codex:()=>rt(On(),".codex","skills"),copilot:()=>rt(On(),".copilot","skills")}});var of,fS=T(()=>{"use strict";of=`---
|
|
2204
2204
|
|
|
2205
2205
|
# Durable memory \u2014 how to use it
|
|
2206
2206
|
|
|
@@ -2211,22 +2211,22 @@ ON EVERY NEW TASK:
|
|
|
2211
2211
|
2. Pull only the chapters relevant to your current task. Don't load everything.
|
|
2212
2212
|
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.
|
|
2213
2213
|
|
|
2214
|
-
Don't dump all of durable-memory into your context. The pattern is index-first, chapter-on-demand.`});var pS={};
|
|
2214
|
+
Don't dump all of durable-memory into your context. The pattern is index-first, chapter-on-demand.`});var pS={};we(pS,{runTeam:()=>KU});import{join as GU}from"node:path";async function KU(e,t){let[r,...n]=e;if(r==="--help"||r==="-h"||r==="help")return t.stdout.write(VU),0;try{return await $(t,async s=>{switch(r){case"create":return zU(n,t,s);case"list":return ZU(n,t,s);case"show":return QU(n,t,s);case"add-member":return eW(n,t,s);case"seed":return mS(n,t,s,!1);case"refresh":return mS(n,t,s,!0);case"companion":return rW(n,t,s);case"list-roots":return YU(n,t,s);default:return v(t,"usage: lmctl team <create|list|show|add-member|seed|refresh|companion|list-roots>")}})}catch(s){return je(t,s)}}function YU(e,t,r){let n=Z(e,[]);if(n.error!==void 0)return v(t,n.error);if(n.positionals.length>0)return v(t,"usage: team list-roots [--json]");let s=r.listRootTeams();return V(n,"--json")?ae(t,s):t.stdout.write(s.map(i=>`${i.name??"(unnamed)"} ${i.teamfile_path} ${i.last_seeded_at??""}`).join(`
|
|
2215
2215
|
`)+(s.length>0?`
|
|
2216
|
-
`:"")),0}function
|
|
2217
|
-
`),0}function
|
|
2216
|
+
`:"")),0}function zU(e,t,r){let[n]=e;if(n===void 0)return v(t,"usage: team create <name>");let s=r.insertTeam({name:n});return t.stdout.write(`created team ${s.name}
|
|
2217
|
+
`),0}function ZU(e,t,r){let n=Z(e,[]);if(n.error!==void 0)return v(t,n.error);let s=r.listTeams();return V(n,"--json")?ae(t,s):t.stdout.write(`${s.map(i=>`${i.id} ${i.name}`).join(`
|
|
2218
2218
|
`)}${s.length>0?`
|
|
2219
|
-
`:""}`),0}function
|
|
2219
|
+
`:""}`),0}function QU(e,t,r){let n=Z(e,[]);if(n.error!==void 0)return v(t,n.error);let[s]=n.positionals;if(s===void 0)return v(t,"usage: team show <name> [--json]");let i=r.findTeamByName(s);if(i===null)return v(t,`team not found: ${s}`);let o=r.listTeamMembers(i.id);if(V(n,"--json"))ae(t,{team:i,members:o});else{t.stdout.write(`team ${i.name}
|
|
2220
2220
|
`);for(let a of o)t.stdout.write(`- ${a.alias} ${Ue(a)} ${a.sessionid??"(unseeded)"}
|
|
2221
|
-
`)}return 0}function
|
|
2222
|
-
`),0}async function mS(e,t,r,n){let s=Z(e,["--alias"]);if(s.error!==void 0)return v(t,s.error);let[i]=s.positionals;if(i===void 0)return v(t,n?"usage: team refresh <team-name> --alias A":"usage: team seed <team-name> [--alias A]");let o=r.findTeamByName(i);if(o===null)return v(t,`team not found: ${i}`);let a=P(s,"--alias");if(n&&a===void 0)return v(t,"team refresh requires --alias");if(n&&a!==void 0&&a.trim().toLowerCase()==="lead")return v(t,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let l=
|
|
2221
|
+
`)}return 0}function eW(e,t,r){let n=Z(e,["--alias","--provider","--model","--role","--sessiondir"]);if(n.error!==void 0)return v(t,n.error);let[s]=n.positionals;if(s===void 0)return v(t,"usage: team add-member <team-name> --alias A --provider P [--model M] [--role R] [--sessiondir D]");let i=r.findTeamByName(s);if(i===null)return v(t,`team not found: ${s}`);let o=P(n,"--alias"),a=P(n,"--provider");if(o===void 0||a===void 0)return v(t,"team add-member requires --alias and --provider");let l=r.insertTeamMember({team_id:i.id,alias:o,provider:a,model:P(n,"--model")??null,role:P(n,"--role")??"agent",sessiondir:P(n,"--sessiondir")??GU(br(),"sessions",i.name,o)});return V(n,"--json")?ae(t,l):t.stdout.write(`added member ${l.alias} to ${i.name}
|
|
2222
|
+
`),0}async function mS(e,t,r,n){let s=Z(e,["--alias"]);if(s.error!==void 0)return v(t,s.error);let[i]=s.positionals;if(i===void 0)return v(t,n?"usage: team refresh <team-name> --alias A":"usage: team seed <team-name> [--alias A]");let o=r.findTeamByName(i);if(o===null)return v(t,`team not found: ${i}`);let a=P(s,"--alias");if(n&&a===void 0)return v(t,"team refresh requires --alias");if(n&&a!==void 0&&a.trim().toLowerCase()==="lead")return v(t,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let l=tW(r.listTeamMembers(o.id),a,n);if(a!==void 0&&l.length===0)return v(t,`member not found or already seeded: ${a}`);if(n&&l.some(f=>f.alias.toLowerCase()==="lead"||f.role==="lead"))return v(t,"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===o.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=gy(f.workflow_name,m.definition);if(p.status==="FAIL")return v(t,`cannot seed team \`${o.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===o.id))Vb(f,r),zb(f);let d=[],u=!1;for(let f of l){let m=await $i({member:f,dal:r}),p=r.updateTeamMemberSession(f.id,m.sessionid);if(p!==null){let _=p.role_prompt??"",g=_.length>0?`${_}
|
|
2223
2223
|
|
|
2224
2224
|
${of}`:of;r.setMemberPromptSnapshot(f.id,g),d.push(p);let h=Ia(Ue(p),m.sessionid);h!==null&&t.stderr.write(`[seeded ${p.alias}] customize/compact in its native TUI:
|
|
2225
2225
|
${h}
|
|
2226
2226
|
`);try{await dS({dal:r,member:p,stderr:t.stderr})}catch(S){u=!0,t.stderr.write(`error: ${S instanceof Error?S.message:String(S)}
|
|
2227
|
-
`)}}}return
|
|
2228
|
-
`),u?1:0}function
|
|
2229
|
-
`),0}var
|
|
2227
|
+
`)}}}return V(s,"--json")?ae(t,d):t.stdout.write(`seeded ${d.length} member(s)
|
|
2228
|
+
`),u?1:0}function tW(e,t,r){return e.filter(n=>t!==void 0&&n.alias!==t?!1:r||n.sessionid===null)}function rW(e,t,r){let n=Z(e,["--interpreter","--of"]);if(n.error!==void 0)return v(t,n.error);let[s]=n.positionals;if(s===void 0)return v(t,"usage: team companion <team-name> --interpreter A --of B[,C]");let i=r.findTeamByName(s);if(i===null)return v(t,`team not found: ${s}`);let o=P(n,"--interpreter"),a=P(n,"--of")?.split(",").map(c=>c.trim()).filter(Boolean);if(o===void 0||a===void 0||a.length===0)return v(t,"team companion requires --interpreter and --of");let l=r.findTeamMemberByAlias(i.id,o);if(l===null)return v(t,`member not found: ${o}`);for(let c of a){let d=r.findTeamMemberByAlias(i.id,c);if(d===null)return v(t,`member not found: ${c}`);r.insertTeamMemberCompanion({interpreter_id:l.id,companion_id:d.id})}return t.stdout.write(`recorded ${a.length} companion link(s)
|
|
2229
|
+
`),0}var VU,_S=T(()=>{"use strict";Xe();hc();Qu();Zb();Ze();An();uS();xo();Le();fS();VU=`usage: lmctl team create <name>
|
|
2230
2230
|
lmctl team list [--json]
|
|
2231
2231
|
lmctl team show <name> [--json]
|
|
2232
2232
|
lmctl team add-member <team-name> --alias A --provider P [--model M] [--role R] [--sessiondir D] [--json]
|
|
@@ -2237,8 +2237,8 @@ ${of}`:of;r.setMemberPromptSnapshot(f.id,g),d.push(p);let h=Ia(Ue(p),m.sessionid
|
|
|
2237
2237
|
|
|
2238
2238
|
Manage DB-backed teams, members, and provider session lifecycle. Use seed or
|
|
2239
2239
|
refresh to create/update native provider sessions for team members.
|
|
2240
|
-
`});var bS={};
|
|
2241
|
-
`),0;let r=Z(e,["--lines","--max-bytes","--watch-interval","--provider","--session","--run"],["--watch","--help"]);if(r.error!==void 0)return v(t,r.error);let n=P(r,"--lines"),s=P(r,"--max-bytes");if(n!==void 0&&s!==void 0)return v(t,"--lines and --max-bytes are mutually exclusive (choose one)");let i;if(n!==void 0){let m=Number.parseInt(n,10);if(!Number.isFinite(m)||m<1||String(m)!==n)return v(t,`invalid --lines "${n}" (expected a positive integer)`);i={kind:"lines",lines:m}}else{let m=s===void 0?
|
|
2240
|
+
`});var bS={};we(bS,{applyMaxBytes:()=>Oa,renderMessage:()=>ES,runTail:()=>aW});async function aW(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${oW}
|
|
2241
|
+
`),0;let r=Z(e,["--lines","--max-bytes","--watch-interval","--provider","--session","--run"],["--watch","--help"]);if(r.error!==void 0)return v(t,r.error);let n=P(r,"--lines"),s=P(r,"--max-bytes");if(n!==void 0&&s!==void 0)return v(t,"--lines and --max-bytes are mutually exclusive (choose one)");let i;if(n!==void 0){let m=Number.parseInt(n,10);if(!Number.isFinite(m)||m<1||String(m)!==n)return v(t,`invalid --lines "${n}" (expected a positive integer)`);i={kind:"lines",lines:m}}else{let m=s===void 0?sW:Number.parseInt(s,10);if(!Number.isFinite(m)||m<0||s!==void 0&&String(m)!==s)return v(t,`invalid --max-bytes "${s}" (expected a non-negative integer)`);i={kind:"bytes",maxBytes:m}}let o=V(r,"--watch"),a=P(r,"--watch-interval"),l=a===void 0?iW:Number.parseInt(a.replace(/s$/,""),10);if(!Number.isFinite(l)||l<1)return v(t,`invalid --watch-interval "${a}" (expected <N>s, N\u22651)`);if(r.positionals.length>2)return v(t,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let c=P(r,"--run");if(c!==void 0){if(r.positionals.length>0)return v(t,"--run is mutually exclusive with positional [target] [alias]");if(P(r,"--session")!==void 0)return v(t,"--run is mutually exclusive with --session");if(P(r,"--provider")!==void 0)return v(t,"--run is mutually exclusive with --provider");let m=Number.parseInt(c,10);if(!Number.isFinite(m)||m<=0||String(m)!==c)return v(t,`invalid --run "${c}" (expected a positive integer run id)`);try{return await $(t,async p=>lW(t,p,m,i,o,l))}catch(p){return je(t,p)}}let d=yr(nW,{target:r.positionals[0],alias:r.positionals[1],flags:{session:P(r,"--session"),provider:P(r,"--provider")}});if(d.mode==="error")return v(t,d.message);if(d.mode==="managed")return v(t,"tail managed mode requires --run <id>");let u;if(d.mode==="ai-team")if(d.alias===void 0){let m;try{m=await $(t,g=>Ee(d.teamfile,g))}catch(g){return v(t,`tail: ${g instanceof Error?g.message:String(g)}`)}let p;try{p=De(m)}catch(g){return v(t,`tail: ${g instanceof Error?g.message:String(g)}`)}let _=At(p);if(_===void 0)return v(t,`tail: ${d.teamfile} has no Lead member; pass <tf>:<alias>`);try{let g=await $(t,h=>He(d.teamfile,_.alias,h));u={provider:g.provider,sessionId:g.sessionid,cwd:g.sessiondir}}catch(g){return g instanceof ye?v(t,g.message):je(t,g)}}else try{let m=await $(t,p=>He(d.teamfile,d.alias,p));u={provider:m.provider,sessionId:m.sessionid,cwd:m.sessiondir}}catch(m){return m instanceof ye?v(t,m.message):je(t,m)}else{let m=d.sessionid,p=d.provider;if(p===void 0){let _=await Na(m);if(_.length===0)return v(t,`tail: session "${m}" not found in any provider store`);if(_.length>1)return v(t,`tail: session "${m}" matches multiple providers (${_.join(", ")}); pass --provider`);p=_[0]}u={provider:p,sessionId:m}}let f=await hS(t,u.provider,u.sessionId,i,-1);return f<0?1:o?await new Promise(m=>{let p=async()=>{try{let h=await hS(t,u.provider,u.sessionId,i,f);h>=0&&(f=h)}catch(h){t.stderr.write(`tail: ${h instanceof Error?h.message:String(h)}
|
|
2242
2242
|
`)}},_=setInterval(()=>{p()},l*1e3),g=()=>{clearInterval(_),m(0)};process.once("SIGINT",g),process.once("SIGTERM",g)}):0}async function hS(e,t,r,n,s){let i;try{i=await Zt(r,t)}catch(c){return e.stderr.write(`tail: failed to load session: ${c instanceof Error?c.message:String(c)}
|
|
2243
2243
|
`),-1}if(i===null)return e.stderr.write(`tail: session not found: ${r} (provider=${t})
|
|
2244
2244
|
`),-1;let o=i.messages??[],a=s<0&&n.kind==="lines"?Math.max(0,o.length-n.lines):s+1;if(a>=o.length)return o.length-1;let l="";for(let c=a;c<o.length;c+=1)l+=`${ES(o[c])}
|
|
@@ -2247,18 +2247,18 @@ refresh to create/update native provider sessions for team members.
|
|
|
2247
2247
|
`).split(`
|
|
2248
2248
|
`),i=s[0]??"",o=s.slice(1);return o.length===0?`${r}: ${i}`:`${r}: ${i}
|
|
2249
2249
|
${o.map(a=>` ${a}`).join(`
|
|
2250
|
-
`)}`}async function
|
|
2250
|
+
`)}`}async function lW(e,t,r,n,s,i){if(t.getRun(r)===null)return v(e,`tail: run ${r}: not found`);let a=t.listSessionEvents(r),c=(n.kind==="lines"?a.slice(Math.max(0,a.length-n.lines)):a).map(u=>`${wS(u)}
|
|
2251
2251
|
`).join("");e.stdout.write(n.kind==="bytes"?Oa(c,n.maxBytes):c);let d=a.length>0?a[a.length-1].id:0;return s?await new Promise(u=>{let m=setInterval(()=>{try{let _=t.listSessionEvents(r,d),g="";for(let h of _)g+=`${wS(h)}
|
|
2252
2252
|
`,d=h.id;g.length>0&&e.stdout.write(n.kind==="bytes"?Oa(g,n.maxBytes):g)}catch(_){e.stderr.write(`tail: ${_ instanceof Error?_.message:String(_)}
|
|
2253
|
-
`)}},i*1e3),p=()=>{clearInterval(m),u(0)};process.once("SIGINT",p),process.once("SIGTERM",p)}):0}function Oa(e,t){if(t===0||Buffer.byteLength(e,"utf8")<=t)return e;let n=Buffer.byteLength(gS,"utf8");if(n>=t)return yS(e,t);let s=t-n,i=yS(e,s);return`${gS}${i}`}function yS(e,t){if(t<=0)return"";let r=Buffer.from(e,"utf8"),n=Math.max(0,r.length-t);for(;n<r.length&&(r[n]&192)===128;)n+=1;return r.subarray(n).toString("utf8")}function wS(e){let t=TS(new Date(e.timestamp_ms))??"",r="";try{let i=JSON.parse(e.payload);typeof i.alias=="string"&&(r=`alias=${i.alias}`),typeof i.provider=="string"&&(r+=`${r?" ":""}provider=${i.provider}`),typeof i.tool=="string"&&(r+=`${r?" ":""}tool=${i.tool}`),typeof i.status=="string"&&(r+=`${r?" ":""}status=${i.status}`),(typeof i.tokens_in=="number"||typeof i.tokens_out=="number")&&(r+=`${r?" ":""}tokens=${i.tokens_in??0}/${i.tokens_out??0}`)}catch{}let n=r!==""?r:e.payload.slice(0,200),s=e.step_id===null?"":` step=${e.step_id}`;return`${t} ${e.kind}${s}: ${n}`}function TS(e){if(e===void 0)return;let t=e instanceof Date?e:new Date(e);if(Number.isNaN(t.getTime()))return;let r=n=>String(n).padStart(2,"0");return`${t.getFullYear()}-${r(t.getMonth()+1)}-${r(t.getDate())} ${r(t.getHours())}:${r(t.getMinutes())}:${r(t.getSeconds())}`}var
|
|
2253
|
+
`)}},i*1e3),p=()=>{clearInterval(m),u(0)};process.once("SIGINT",p),process.once("SIGTERM",p)}):0}function Oa(e,t){if(t===0||Buffer.byteLength(e,"utf8")<=t)return e;let n=Buffer.byteLength(gS,"utf8");if(n>=t)return yS(e,t);let s=t-n,i=yS(e,s);return`${gS}${i}`}function yS(e,t){if(t<=0)return"";let r=Buffer.from(e,"utf8"),n=Math.max(0,r.length-t);for(;n<r.length&&(r[n]&192)===128;)n+=1;return r.subarray(n).toString("utf8")}function wS(e){let t=TS(new Date(e.timestamp_ms))??"",r="";try{let i=JSON.parse(e.payload);typeof i.alias=="string"&&(r=`alias=${i.alias}`),typeof i.provider=="string"&&(r+=`${r?" ":""}provider=${i.provider}`),typeof i.tool=="string"&&(r+=`${r?" ":""}tool=${i.tool}`),typeof i.status=="string"&&(r+=`${r?" ":""}status=${i.status}`),(typeof i.tokens_in=="number"||typeof i.tokens_out=="number")&&(r+=`${r?" ":""}tokens=${i.tokens_in??0}/${i.tokens_out??0}`)}catch{}let n=r!==""?r:e.payload.slice(0,200),s=e.step_id===null?"":` step=${e.step_id}`;return`${t} ${e.kind}${s}: ${n}`}function TS(e){if(e===void 0)return;let t=e instanceof Date?e:new Date(e);if(Number.isNaN(t.getTime()))return;let r=n=>String(n).padStart(2,"0");return`${t.getFullYear()}-${r(t.getMonth()+1)}-${r(t.getDate())} ${r(t.getHours())}:${r(t.getMinutes())}:${r(t.getSeconds())}`}var nW,sW,iW,oW,gS,SS=T(()=>{"use strict";An();Le();Lt();Yt();Rt();nW={name:"tail",allowsBareTeamfile:!0,supportsRaw:!0},sW=4096,iW=2,oW=`usage: lmctl tail [target] [alias]
|
|
2254
2254
|
lmctl tail --session <id> [--provider <name>]
|
|
2255
2255
|
lmctl tail --run <id>
|
|
2256
2256
|
[--lines N | --max-bytes N] [--watch] [--watch-interval Ns] [--provider <name>]
|
|
2257
2257
|
|
|
2258
2258
|
Print or watch provider session messages, or follow a managed run timeline.
|
|
2259
2259
|
--lines and --max-bytes are mutually exclusive. Default: --max-bytes 4096.`;gS=`\u2026 [truncated older output \u2014 raise with --max-bytes]
|
|
2260
|
-
`});var LS={};
|
|
2261
|
-
`),0;let r=Z(e,["--provider","--run"],["--json","--help"]);if(r.error!==void 0)return v(t,r.error);if(r.positionals.length>2)return v(t,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let n=
|
|
2260
|
+
`});var LS={};we(LS,{runInfo:()=>mW});import{execFileSync as af}from"node:child_process";import{dirname as vS,resolve as cW}from"node:path";function fW(e){return e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${Math.round(e/1e3)}K`:String(e)}async function mW(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${uW}
|
|
2261
|
+
`),0;let r=Z(e,["--provider","--run"],["--json","--help"]);if(r.error!==void 0)return v(t,r.error);if(r.positionals.length>2)return v(t,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let n=V(r,"--json"),s=P(r,"--run");if(s!==void 0){if(r.positionals.length>0)return v(t,"--run is mutually exclusive with positional [target] [alias]");if(P(r,"--provider")!==void 0)return v(t,"--run is mutually exclusive with --provider");let d=Number.parseInt(s,10);if(!Number.isFinite(d)||d<=0||String(d)!==s)return v(t,`invalid --run "${s}" (expected a positive integer run id)`);try{return await $(t,async u=>_W(t,u,d,n))}catch(u){return je(t,u)}}let i=yr(dW,{target:r.positionals[0],alias:r.positionals[1],flags:{provider:P(r,"--provider")}});if(i.mode==="error")return v(t,i.message);if(i.mode==="managed")return v(t,"health managed mode requires --run <id>");if(i.mode==="ai-team"&&i.alias===void 0){let d;try{d=await $(t,u=>Ee(i.teamfile,u))}catch(u){return v(t,`health: ${u instanceof Error?u.message:String(u)}`)}return hW(t,d,n)}let o,a,l,c;if(i.mode==="ai-team")try{let d=await $(t,u=>He(i.teamfile,i.alias,u));o=d.provider,a=d.sessionid,l=d.alias,c={teamfile:d.teamfile,alias:d.alias}}catch(d){return d instanceof ye?v(t,d.message):je(t,d)}else if(a=i.sessionid,i.provider!==void 0)o=i.provider;else{let d=await Na(a);if(d.length===0)return v(t,`health: session "${a}" not found in any provider store`);if(d.length>1)return v(t,`health: session "${a}" matches multiple providers (${d.join(", ")}); pass --provider`);o=d[0]}return pW(t,o,a,l,n,c)}async function pW(e,t,r,n,s,i){let o;try{o=await Zt(r,t)}catch(d){return v(e,`health: failed to load session: ${d instanceof Error?d.message:String(d)}`)}if(o===null)return v(e,`health: session not found: ${r} (provider=${t})`);let a=Ms(o.messages),l=i===void 0?null:await gW(e,i,o),c={provider:o.provider,sessionId:o.sessionId,sessionid:o.sessionId,cwd:o.cwd,messageCount:o.messageCount??null,...o.model!==void 0?{model:o.model}:{},...n!==void 0?{alias:n}:{},...l??{},totalInputTokens:o.totalInputTokens??null,totalOutputTokens:o.totalOutputTokens??null,...o.totalCachedInputTokens!==void 0?{totalCachedInputTokens:o.totalCachedInputTokens}:{},sessionLimit:a,createdAt:o.createdAt.toISOString(),modifiedAt:o.modifiedAt.toISOString()};return s?(ae(e,c),0):(e.stdout.write(`Session: ${o.sessionId}
|
|
2262
2262
|
`),e.stdout.write(` Provider: ${o.provider}
|
|
2263
2263
|
`),n!==void 0&&e.stdout.write(` Alias: ${n}
|
|
2264
2264
|
`),l!==null&&e.stdout.write(` Liveness: ${lf(l.liveness)}
|
|
@@ -2270,7 +2270,7 @@ Print or watch provider session messages, or follow a managed run timeline.
|
|
|
2270
2270
|
`),a!==null&&e.stdout.write(` SessionLimit: LIMITED resets_at=${NS(a)}
|
|
2271
2271
|
`),e.stdout.write(` Created: ${c.createdAt}
|
|
2272
2272
|
`),e.stdout.write(` Modified: ${c.modifiedAt}
|
|
2273
|
-
`),0)}async function
|
|
2273
|
+
`),0)}async function _W(e,t,r,n){let s=Rr(t,r);if(s===null)return v(e,`health: run ${r}: not found`);let i=on(t,r),o=t.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?(ae(e,{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:i?.paused??!1,started_at:s.started_at,ended_at:s.ended_at,step_count:s.steps.length,totalInputTokens:o.totalInputTokens,totalOutputTokens:o.totalOutputTokens,agent_call_count:o.agentCallCount}),0):(e.stdout.write(`RUN: ${s.id}
|
|
2274
2274
|
`),e.stdout.write(` Workflow: ${s.workflow?.name??"(unknown)"}
|
|
2275
2275
|
`),e.stdout.write(` Team: ${s.team?.name??"(unknown)"}
|
|
2276
2276
|
`),e.stdout.write(` State: ${s.current_state??"(none)"}${s.terminal_state!==null?` (terminal: ${s.terminal_state})`:""}
|
|
@@ -2280,64 +2280,64 @@ Print or watch provider session messages, or follow a managed run timeline.
|
|
|
2280
2280
|
`),e.stdout.write(` Steps: ${s.steps.length}
|
|
2281
2281
|
`),e.stdout.write(` AgentCalls: ${o.agentCallCount}
|
|
2282
2282
|
`),e.stdout.write(` Tokens: ${o.totalInputTokens} in / ${o.totalOutputTokens} out
|
|
2283
|
-
`),0)}async function
|
|
2284
|
-
`)}let I=w?.messageCount,x=o===null?void 0:w===null?null:AS(w,o.since),U=o===null?void 0:w===null?null:RS(w)??"n/a",ue=o===null?void 0:{messageCount:x??null,tokens:null};l.push({alias:y.alias,reportPath:y.reportPath,teamfile:y.teamfile,provider:y.provider,sessionid:y.sessionid,messageCount:I??null,model:w?.model??"(unknown)",lastContext:w?.lastInputTokens,detailLoaded:w!==null,liveness:a.get(cf(y.teamfile,y.alias))??df(),sessionLimit:w===null?null:
|
|
2283
|
+
`),0)}async function hW(e,t,r){let n,s;try{let y=await $(e,w=>{let I=Pe(t,w);if(I.parseErrors.length>0)throw new Error(I.parseErrors.join("; "));return{teamName:I.name,targets:kS(t,w,new Set,[])}});s=y.teamName,n=y.targets}catch(y){return v(e,`health: ${y instanceof Error?y.message:String(y)}`)}let i=xS(t),o=i.kind==="repo"?i:null,a=await IS(e,n),l=[],c=0,d=o===null?void 0:0,u=o===null?void 0:0;for(let y of n){let w=null;try{w=await Zt(y.sessionid,y.provider)}catch(W){e.stderr.write(`warning: failed to load session "${y.sessionid}" for ${y.reportPath} (${y.provider}): ${W instanceof Error?W.message:String(W)}
|
|
2284
|
+
`)}let I=w?.messageCount,x=o===null?void 0:w===null?null:AS(w,o.since),U=o===null?void 0:w===null?null:RS(w)??"n/a",ue=o===null?void 0:{messageCount:x??null,tokens:null};l.push({alias:y.alias,reportPath:y.reportPath,teamfile:y.teamfile,provider:y.provider,sessionid:y.sessionid,messageCount:I??null,model:w?.model??"(unknown)",lastContext:w?.lastInputTokens,detailLoaded:w!==null,liveness:a.get(cf(y.teamfile,y.alias))??df(),sessionLimit:w===null?null:Ms(w.messages),...o!==null?{activitySinceLastCommit:ue,cumulativeTokens:U}:{}}),I===void 0?c=void 0:c!==void 0&&(c+=I),o!==null&&(x==null?d=void 0:d!==void 0&&(d+=x),U==null||U==="n/a"?u=void 0:u!==void 0&&(u+=U))}if(r)return ae(e,{team:s,git:o===null?null:{teamDir:o.teamDir,commits:o.commits.map(y=>({ref:y.ref,timestamp:y.timestamp.toISOString()})),since:o.since.toISOString(),working:o.working},members:l.map(({detailLoaded:y,cumulativeTokens:w,...I})=>({...I,lastContext:I.lastContext??null,...w!==void 0?{cumulativeTokens:w==="n/a"?null:w}:{}})),total:{messageCount:c??null}}),0;let f=Math.max(7,...l.map(y=>y.sessionid.length)),m=Math.max(5,...l.map(y=>y.reportPath.length))+1,p=Math.max(8,...l.map(y=>y.provider.length))+1,_=Math.max(5,...l.map(y=>y.model.length))+1,g=Math.max(4,...l.map(y=>lf(y.liveness).length))+1;if(e.stdout.write(`TEAM: ${s}
|
|
2285
2285
|
`),i.kind==="repo"){e.stdout.write(`Git progress:
|
|
2286
2286
|
`);for(let y of i.commits)e.stdout.write(` ${y.ref}: ${y.timestamp.toISOString()}
|
|
2287
2287
|
`);e.stdout.write(` Uncommitted: ${gt(i.working.uncommittedTracked)} changed (tracked), ${gt(i.working.untracked)} untracked
|
|
2288
2288
|
`)}else i.reason==="no-commits"?e.stdout.write(`Git progress: git repository in ${i.teamDir} has no commits (no commit-based progress to report)
|
|
2289
2289
|
`):e.stdout.write(`Git progress: no git repository in ${i.teamDir} (no commit-based progress to report)
|
|
2290
2290
|
`);e.stdout.write(` ${"SESSION".padEnd(f)} ${"ALIAS".padEnd(m)}${"PROVIDER".padEnd(p)}${"MODEL".padEnd(_)}${"LIVE".padEnd(g)}${"MSGS".padStart(6)} ${"LAST CONTEXT".padStart(12)}`+(o!==null?` ${"MSGS SINCE COMMIT".padStart(17)} ${"TOKENS SINCE COMMIT".padStart(19)} ${"TOKENS (cumulative)".padStart(19)}`:"")+`
|
|
2291
|
-
`);let h=!1,S=l.filter(y=>y.sessionLimit!==null);for(let y of l){let w=
|
|
2291
|
+
`);let h=!1,S=l.filter(y=>y.sessionLimit!==null);for(let y of l){let w=EW(y.lastContext,y.detailLoaded,fW);(w==="n/a"||y.cumulativeTokens==="n/a")&&(h=!0),e.stdout.write(` ${y.sessionid.padEnd(f)} ${y.reportPath.padEnd(m)}${y.provider.padEnd(p)}${y.model.padEnd(_)}${lf(y.liveness).padEnd(g)}${gt(y.messageCount).padStart(6)} ${w.padStart(12)}`+(o!==null?` ${gt(y.activitySinceLastCommit?.messageCount).padStart(17)} ${gt(y.activitySinceLastCommit?.tokens).padStart(19)} ${wW(y.cumulativeTokens).padStart(19)}`:"")+`
|
|
2292
2292
|
`)}if(e.stdout.write(` ${"TOTAL".padEnd(f)} ${"".padEnd(m)}${"".padEnd(p)}${"".padEnd(_)}${"".padEnd(g)}${gt(c).padStart(6)}`+(o!==null?` ${"".padStart(12)} ${gt(d).padStart(17)} ${gt(null).padStart(19)} ${gt(u).padStart(19)}`:"")+`
|
|
2293
2293
|
`),h&&e.stdout.write(`n/a = this provider does not expose a context/token total; absence is not a health signal.
|
|
2294
2294
|
`),S.length>0){e.stdout.write(`Session limits:
|
|
2295
2295
|
`);for(let y of S)e.stdout.write(` ${y.reportPath}: LIMITED resets_at=${NS(y.sessionLimit)}
|
|
2296
|
-
`)}return 0}function kS(e,t,r,n){let s=Ee(e,t);if(r.has(s))return[];r.add(s);let i=Pe(s,t);if(i.parseErrors.length>0)throw new Error(`${s}: ${i.parseErrors.join("; ")}`);let o=[];for(let a of i.members){if(a.teamfile!==void 0){o.push(...kS(
|
|
2296
|
+
`)}return 0}function kS(e,t,r,n){let s=Ee(e,t);if(r.has(s))return[];r.add(s);let i=Pe(s,t);if(i.parseErrors.length>0)throw new Error(`${s}: ${i.parseErrors.join("; ")}`);let o=[];for(let a of i.members){if(a.teamfile!==void 0){o.push(...kS(cW(vS(s),a.teamfile),t,r,[...n,a.alias]));continue}a.session===void 0||a.session.length===0||o.push({teamfile:s,alias:a.alias,reportPath:[...n,a.alias].join("/"),provider:a.provider,sessionid:a.session})}return o}async function gW(e,t,r){let n=await IS(e,[{teamfile:t.teamfile,alias:t.alias}]),s=xS(t.teamfile),i=s.kind==="repo"?s:null;return{teamfile:t.teamfile,reportPath:t.alias,lastContext:r.lastInputTokens??null,liveness:n.get(cf(t.teamfile,t.alias))??df(),...i!==null?{activitySinceLastCommit:{messageCount:AS(r,i.since),tokens:null},cumulativeTokens:RS(r)??"n/a"}:{}}}async function IS(e,t){try{let r=await $(e,n=>t.map(s=>{let i=Pr(n,s.teamfile,s.alias);return[cf(s.teamfile,s.alias),yW(i)]}));return new Map(r)}catch{return new Map}}function cf(e,t){return`${e}\0${t.toLowerCase()}`}function yW(e){return e.busy?e.reason==="terminal-held"?e.source==="terminal-invocation"?{state:"busy",reason:"terminal-held",inFlight:null,terminalLock:null,terminalInvocation:{id:e.terminalInvocation.id,startedAt:e.terminalInvocation.started_at,lastHeartbeat:e.terminalInvocation.last_heartbeat_at,holderPid:e.terminalInvocation.holder_pid,holderHost:e.terminalInvocation.holder_host}}:{state:"busy",reason:"terminal-held",inFlight:null,terminalLock:{startedAt:e.terminalLock.started_at,lastHeartbeat:e.terminalLock.last_heartbeat,holderPid:e.terminalLock.holder_pid,holderHost:e.terminalLock.holder_host},terminalInvocation:null}:{state:"busy",reason:"in-flight",inFlight:{senderTeamfile:e.inFlight.sender_teamfile,senderAlias:e.inFlight.sender_alias,startedAt:e.inFlight.started_at,activeCount:e.inFlight.active_count,holderPid:e.inFlight.holder_pid},terminalLock:null,terminalInvocation:null}:df()}function df(){return{state:"idle",reason:null,inFlight:null,terminalLock:null,terminalInvocation:null}}function lf(e){return e.state==="idle"?"idle":`busy (${e.reason})`}function NS(e){return e.resets_at!==null?e.resets_at:e.timezone!==null?`${e.reset_time} (${e.timezone})`:e.reset_time}function gt(e){return e==null?"unknown":String(e)}function wW(e){return e==="n/a"?e:gt(e)}function EW(e,t,r=String){return e!==void 0?r(e):t?"n/a":"unknown"}function xS(e){let t=vS(e),r;try{af("git",["-C",t,"rev-parse","--is-inside-work-tree"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{kind:"unavailable",reason:"no-repo",teamDir:t}}try{r=af("git",["-C",t,"log","-2","--format=%ct"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{kind:"unavailable",reason:"no-commits",teamDir:t}}let n=r.split(/\r?\n/).map(i=>Number.parseInt(i.trim(),10)).filter(i=>Number.isFinite(i)&&i>0);if(n.length===0)return{kind:"unavailable",reason:"no-commits",teamDir:t};let s=n.slice(0,2).map((i,o)=>({ref:o===0?"HEAD":`HEAD~${o}`,timestamp:new Date(i*1e3)}));return{kind:"repo",teamDir:t,since:s[0].timestamp,commits:s,working:TW(t)}}function TW(e){let t;try{t=af("git",["-C",e,"status","--porcelain"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{uncommittedTracked:null,untracked:null}}let r=0,n=0;for(let s of t.split(/\r?\n/))s.trim().length!==0&&(s.startsWith("??")?n+=1:r+=1);return{uncommittedTracked:r,untracked:n}}function AS(e,t){let r=t.getTime();return e.messages.filter(n=>(n.role==="user"||n.role==="assistant")&&Number.isFinite(n.timestamp.getTime())&&n.timestamp.getTime()>r).length}function RS(e){if(e===null)return null;let t=[e.totalInputTokens,e.totalCachedInputTokens,e.totalCacheWriteInputTokens,e.totalOutputTokens,e.totalReasoningOutputTokens].filter(r=>typeof r=="number"&&Number.isFinite(r));return t.length===0?null:t.reduce((r,n)=>r+n,0)}var dW,uW,OS=T(()=>{"use strict";An();Le();Lt();Rt();Fr();Ht();Uu();dW={name:"health",allowsBareTeamfile:!0,supportsRaw:!0},uW=`usage: lmctl health [target] [alias]
|
|
2297
2297
|
lmctl health <teamfile> # team rollup
|
|
2298
2298
|
lmctl health <sessionid> [--provider <name>]
|
|
2299
2299
|
[--json]
|
|
2300
2300
|
|
|
2301
|
-
Show provider session details, team rollups, or managed run state/token totals.`});var CS={};
|
|
2302
|
-
`),0;let r=Z(e,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(r.error!==void 0)return v(t,r.error);if(r.positionals.length>0)return v(t,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let n=P(r,"--format"),s=
|
|
2301
|
+
Show provider session details, team rollups, or managed run state/token totals.`});var CS={};we(CS,{runLs:()=>kW});import{resolve as uf}from"node:path";function vW(e){let t=new Map;for(let r of e){let n=`${r.provider}:${r.sessionId}`,s=t.get(n);(s===void 0||r.modifiedAt.getTime()>s.modifiedAt.getTime())&&t.set(n,r)}return[...t.values()]}async function kW(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${bW}
|
|
2302
|
+
`),0;let r=Z(e,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(r.error!==void 0)return v(t,r.error);if(r.positionals.length>0)return v(t,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let n=P(r,"--format"),s=V(r,"--json");if(V(r,"--runs")){for(let h of["--provider","--sessiondir"])if(P(r,h)!==void 0)return v(t,`--runs is mutually exclusive with ${h}`);for(let h of["--recursive","--all"])if(V(r,h))return v(t,`--runs is mutually exclusive with ${h}`);if(n==="teamfile")return v(t,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let p=P(r,"--limit"),_=SW;if(p!==void 0){let h=Number.parseInt(p,10);if(!Number.isFinite(h)||h<1||String(h)!==p)return v(t,`invalid --limit "${p}" (expected a positive integer)`);if(h>$S)return v(t,`--limit ${h} exceeds maximum (${$S})`);_=h}let g=n==="json"||s===!0?"json":"table";try{return await $(t,async h=>IW(t,h,_,g))}catch(h){return je(t,h)}}let o=NW(n,s);if("error"in o)return v(t,o.error);let a=o.format,l=P(r,"--provider"),c=P(r,"--sessiondir"),d=V(r,"--recursive"),u=V(r,"--all"),f;try{f=await lc(l?{provider:l}:{})}catch(p){return v(t,`ls: discovery failed: ${p instanceof Error?p.message:String(p)}`)}if(!u){let p=c!==void 0?uf(c):uf(process.cwd());f=f.filter(_=>{let g=uf(_.cwd);return d?g===p||g.startsWith(`${p}/`):g===p})}if(f=vW(f),a==="json")return ae(t,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=u?"(all)":c??process.cwd(),_=d?"under":"in";t.stdout.write(`No native sessions found ${_} ${p}.
|
|
2303
2303
|
`)}return 0}if(a==="teamfile"){for(let p of f)t.stdout.write(`_MEMBER_ alias=- provider=${p.provider} sessionid=${p.sessionId} sessiondir=${p.cwd}
|
|
2304
2304
|
`);return 0}let m=Math.max(14,...f.map(p=>p.sessionId.length));t.stdout.write(`${"SESSION".padEnd(m)} ${"PROVIDER".padEnd(10)} ${"SESSIONDIR".padEnd(36)} MODIFIED
|
|
2305
2305
|
`);for(let p of f){let _=p.cwd.length>36?`\u2026${p.cwd.slice(-35)}`:p.cwd;t.stdout.write(`${p.sessionId.padEnd(m)} ${p.provider.padEnd(10)} ${_.padEnd(36)} ${p.modifiedAt.toISOString()}
|
|
2306
|
-
`)}return 0}async function
|
|
2306
|
+
`)}return 0}async function IW(e,t,r,n){let s=sn(t,{limit:r});if(n==="json")return ae(e,s.map(i=>({id:i.id,job_id:i.job_id,workflow_id:i.workflow_id,team_id:i.team_id,current_state:i.current_state,terminal_state:i.terminal_state,started_at:i.started_at,ended_at:i.ended_at,paused_at:i.paused_at}))),0;if(s.length===0)return e.stdout.write(`No runs found.
|
|
2307
2307
|
`),0;e.stdout.write(`${"RUN_ID".padEnd(8)} ${"WORKFLOW".padEnd(8)} ${"TEAM".padEnd(8)} ${"STATE".padEnd(20)} ${"TERMINAL".padEnd(20)} STARTED
|
|
2308
2308
|
`);for(let i of s){let o=(i.current_state??"").padEnd(20),a=(i.terminal_state??"").padEnd(20);e.stdout.write(`${String(i.id).padEnd(8)} ${String(i.workflow_id).padEnd(8)} ${String(i.team_id).padEnd(8)} ${o} ${a} ${i.started_at}
|
|
2309
|
-
`)}return 0}function
|
|
2309
|
+
`)}return 0}function NW(e,t){return e===void 0?{format:t?"json":"teamfile"}:e==="table"||e==="teamfile"||e==="json"?{format:e}:{error:`invalid --format "${e}" (expected: table | teamfile | json)`}}var bW,SW,$S,MS=T(()=>{"use strict";vt();Le();Ht();bW=`usage: lmctl ls [--provider <name>] [--sessiondir <path>]
|
|
2310
2310
|
[--recursive] [--all] [--format table|teamfile|json] [--json]
|
|
2311
2311
|
lmctl ls --runs [--limit N] [--format table|json] [--json]
|
|
2312
2312
|
|
|
2313
|
-
List native provider sessions in scope, or list recent managed runs with --runs.`,
|
|
2314
|
-
`),2;let r=e[0],n;try{n=await $(t,c=>Ee(r,c))}catch(c){return $e(t,`${r}: ${c instanceof Error?c.message:String(c)}`)}let s;try{s=De(n)}catch(c){return $e(t,`${r}: ${c instanceof Error?c.message:String(c)}`)}let i=Yd(s,Jr(n)),o=pf(s.members),a=Fa(n,"utf8"),l=Ma(a,ja({workdir:Jr(n),teamfile:n,date:new Date})).unknownNames;l.length>0&&o.push(`unknown template placeholder${l.length===1?"":"s"}: ${l.map(c=>`{{${c}}}`).join(", ")}`),o.push(...Sl(s.members,Jr(n))),o.push(...
|
|
2315
|
-
`);for(let c of s.members)Tf([c],t),c.session!==void 0&&c.session.length<
|
|
2313
|
+
List native provider sessions in scope, or list recent managed runs with --runs.`,SW=50,$S=500});import{existsSync as Ps,readFileSync as jS}from"node:fs";import{homedir as xW}from"node:os";import{dirname as DS,resolve as $n}from"node:path";import{fileURLToPath as AW}from"node:url";function pf(e,t={}){let r=[],n=OW(t.modelSelectionDocPath);for(let s of e){let i=s.provider.trim().toLowerCase();if(s.effort&&i!=="opencode"&&i!=="lmplayer"&&i!=="qwen"&&r.push(`[${s.alias}] effort="${s.effort}" is ignored: effort selection is only supported for opencode and lmplayer.`),i==="qwen"&&s.effort&&r.push(`[${s.alias}] effort="${s.effort}" is not a qwen CLI flag: Qwen Code does not expose reasoning-effort selection. Use a thinking/effort model id in model= instead.`),i==="copilot"){if(!s.model)continue;r.push(`[${s.alias}] model="${s.model}" is ignored: copilot does not support lmctl model selection.`);continue}if(i==="lmplayer"&&!s.model){r.push(`[${s.alias}] provider=lmplayer has no model= \u2014 lmplayer will choose its own default model, which may not be visible in the teamfile. Set model= explicitly (e.g. github-copilot/gpt-5.4).`);continue}if(i==="lmplayer")continue;if(i==="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=PW(t.opencodeConfigPath);if(!a.available){r.push(`[${s.alias}] model="${s.model}" cannot be verified for opencode: ${a.reason}.`);continue}if(a.models.includes(s.model)||/^github-copilot\/(gpt|gemini|o[0-9])/.test(s.model))continue;if(!s.model.includes("/")){let l=a.models.filter(c=>c.endsWith(`/${s.model}`));r.push(l.length>0?`[${s.alias}] model="${s.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model>. Your opencode.json declares it as ${l.join(" / ")}; set model=${l[0]}.`:`[${s.alias}] model="${s.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model> (e.g. github-copilot/${s.model}). Declare it in ~/.config/opencode/opencode.json (see https://lmctl.com/examples/opencode.json).`);continue}r.push(`[${s.alias}] model="${s.model}" is not declared in your opencode.json. opencode resolves github-copilot GPT/Gemini config-free, but copilot Claude and custom providers must be declared \u2014 copy https://lmctl.com/examples/opencode.json to ~/.config/opencode/opencode.json and adjust for your account.`);continue}if(!s.model)continue;let o=n.get(i);if(!o){r.push(`[${s.alias}] model="${s.model}" cannot be verified for provider "${i}": `+(Ca??"no tested models found in durable-memory/model_selection.md"));continue}o.includes(s.model)||r.push(`[${s.alias}] model="${s.model}" is not in the tested model list for provider "${i}". Valid tested models: ${UW(o)}`)}return r}function OW(e){if(!e&&Ds)return Ds;let t=new Map,r,n=e??$W();if(!Ps(n))return r=`${n} not found`,e||ff(t),e||(Ds=t),e||(Ca=r),t;let s;try{s=jS(n,"utf-8")}catch(i){return r=`${n} could not be read: ${i instanceof Error?i.message:String(i)}`,e||ff(t),e||(Ds=t),e||(Ca=r),t}for(let[i,o]of Object.entries(RW)){let a=jW(s,o),l=DW(a);l.length>0&&t.set(i,l)}return t.size===0&&(r=`${n} has no tested model rows`),!e&&t.size===0&&ff(t),e||(Ds=t),e||(Ca=r),t}function $W(){return CW(DS(AW(import.meta.url)))}function CW(e){let t=MW(e);if(t){let n=$n(t,"durable-memory","model_selection.md");if(Ps(n))return n}let r=[$n(e,"..","..","durable-memory","model_selection.md"),$n(e,"..","..","..","durable-memory","model_selection.md")];for(let n of r)if(Ps(n))return n;return r[r.length-1]}function MW(e){let t=$n(e);for(;;){if(Ps($n(t,"package.json")))return t;let r=DS(t);if(r===t)return null;t=r}}function ff(e){for(let[t,r]of Object.entries(LW))e.set(t,r)}function jW(e,t){let n=new RegExp(`^## ${WW(t)}\\s*$`,"m").exec(e);if(!n)return"";let s=n.index+n[0].length,i=e.slice(s),o=/^##\s+/m.exec(i);return o?i.slice(0,o.index):i}function DW(e){let t=new Set;for(let r of e.split(/\r?\n/)){let n=r.trim();if(!n.startsWith("| `"))continue;let s=/^\|\s*`([^`]+)`\s*\|/.exec(n);if(!s)continue;let i=s[1].trim();i&&i!=="Configured `model="&&t.add(i)}return[...t]}function PW(e){let t=e??$n(xW(),".config","opencode","opencode.json");if(!Ps(t))return{available:!0,models:[]};let r;try{r=JSON.parse(jS(t,"utf-8"))}catch(n){return{available:!1,models:[],reason:`${t} could not be parsed: ${n instanceof Error?n.message:String(n)}`}}return{available:!0,models:FW(r)}}function FW(e){if(!mf(e))return[];let t=$a(e.provider)??$a(e.providers);if(!t)return[];let r=new Set;for(let[n,s]of Object.entries(t)){if(!mf(s))continue;let i=$a(s.models)??$a(s.model);if(i)for(let o of Object.keys(i))r.add(o.startsWith(`${n}/`)?o:`${n}/${o}`)}return[...r].sort()}function $a(e){return mf(e)?e:null}function mf(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function UW(e){return e.length>0?e.join(", "):"(none)"}function WW(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var RW,LW,Ds,Ca,PS=T(()=>{"use strict";RW={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen",agy:"Antigravity"},LW={claude:["claude-opus-4-6","claude-opus-4-7","claude-opus-4-8","claude-sonnet-4-6","claude-sonnet-5","claude-haiku-4-5","claude-fable-5"],codex:["gpt-5.2","gpt-5.4","gpt-5.5","gpt-5.4-mini","gpt-5.3-codex","gpt-5.3-codex-spark"],gemini:["gemini-3.1-pro-preview","gemini-3-flash-preview","gemini-3.1-flash-lite-preview","gemini-2.5-flash","gemini-2.5-flash-lite"],qwen:["qwen3.5-plus","qwen3.6-plus"],agy:["gemini-1.5-flash","gemini-1.5-pro","gemini-3.5-flash","gemini-3.1-pro","gpt-oss-120b","gpt-4-turbo","gpt-4","gpt-3.5-turbo","claude-3-opus","claude-3-sonnet","claude-3-haiku"]},Ds=null});import{homedir as BW}from"node:os";import{basename as qW}from"node:path";function Ma(e,t){let r=new Set;return{text:e.replace(JW,(s,i)=>{let o=i.trim(),a=HW[o];return a===void 0?(r.add(o),s):a(t)}),unknownNames:[...r].sort()}}function ja(e){return{workdir:e.workdir,teamfile:e.teamfile,date:XW(e.date)}}function XW(e){return e.toISOString().slice(0,10)}var HW,JW,_f=T(()=>{"use strict";HW={workdir:e=>e.workdir,teamfile:e=>e.teamfile,teamname:e=>{let t=qW(e.teamfile);return t.endsWith(".lmctl")?t.slice(0,-6):t},home:()=>BW(),date:e=>e.date},JW=/{{\s*([A-Za-z0-9_-]+)\s*}}/g});var Ws={};we(Ws,{GEMINI_PROVIDER_NOTICE:()=>BS,_setLintSessiondirFsOpsForTests:()=>eB,_setTeamfileSeedForTests:()=>QW,buildRootTeamRegistrationRow:()=>GS,registerRootTeam:()=>VS,runHire:()=>lB,runLint:()=>aB,runRefresh:()=>cB,runSeed:()=>JS,sha256Text:()=>XS});import{createHash as GW}from"node:crypto";import{accessSync as VW,constants as FS,existsSync as KW,readFileSync as Fa,realpathSync as yf,statSync as YW,writeFileSync as Pa}from"node:fs";import{dirname as Jr,resolve as WS}from"node:path";function QW(e){qS=e??(async t=>{let{seed:r}=await Promise.resolve().then(()=>(vt(),dc)),n=await r(t);return n.success?{sessionId:n.sessionId,warnings:n.warnings}:{error:n.error??"provider seed failed"}})}function eB(e){Hr=e===null?wf:{...wf,...e}}function tB(e,t){let r=Jr(t),n=new Set,s=[];for(let i of e){if(i.teamfile!==void 0)continue;let o=i.sessiondir??r,a=WS(o);if(n.has(a))continue;let l=rB(a);l!==void 0&&(n.add(a),s.push(`${i.alias}: sessiondir ${a} is not writable (seed would fail: ${l}) \u2014 fix permissions or set a writable sessiondir`))}return s}function rB(e){try{if(Hr.existsSync(e)){if(!Hr.statSync(e).isDirectory())return"ENOTDIR";Hr.accessSync(e,FS.W_OK);return}let t=iB(e);if(t===void 0)return;if(!Hr.statSync(t).isDirectory())return"ENOTDIR";Hr.accessSync(t,FS.W_OK);return}catch(t){return oB(t)??"permission check failed"}}function nB(e,t){let r=[];for(let n of e)n.teamfile!==void 0||n.sessiondir===void 0||HS(n.sessiondir,t)&&r.push(`${n.alias}: sessiondir equals the teamfile directory and is redundant; lmctl seed will remove it`);return r}function sB(e,t,r,n){let s=!1;for(let i of e){if(i.teamfile!==void 0||i.sessiondir===void 0||!HS(i.sessiondir,n))continue;let o=r.get(i.alias.toLowerCase());if(o===void 0)continue;let a=KS(t[o],"sessiondir");a!==t[o]&&(t[o]=a,s=!0),i.sessiondir=void 0}return s}function HS(e,t){return US(e)===US(t)}function US(e){let t=WS(e);try{return yf(t)}catch{return t}}function iB(e){let t=e;for(;;){try{if(Hr.existsSync(t))return t}catch{return}let r=Jr(t);if(r===t)return;t=r}}function oB(e){if(typeof e=="object"&&e!==null&&"code"in e){let t=e.code;if(typeof t=="string"&&t.length>0)return t}}async function aB(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(zW),0;if(e.length!==1)return t.stderr.write(`usage: lmctl lint <teamfile.lmctl>
|
|
2314
|
+
`),2;let r=e[0],n;try{n=await $(t,c=>Ee(r,c))}catch(c){return $e(t,`${r}: ${c instanceof Error?c.message:String(c)}`)}let s;try{s=De(n)}catch(c){return $e(t,`${r}: ${c instanceof Error?c.message:String(c)}`)}let i=Yd(s,Jr(n)),o=pf(s.members),a=Fa(n,"utf8"),l=Ma(a,ja({workdir:Jr(n),teamfile:n,date:new Date})).unknownNames;l.length>0&&o.push(`unknown template placeholder${l.length===1?"":"s"}: ${l.map(c=>`{{${c}}}`).join(", ")}`),o.push(...Sl(s.members,Jr(n))),o.push(...tB(s.members,n)),o.push(...nB(s.members,Jr(n)));for(let c of i)t.stderr.write(`error: ${c.field}: ${c.message}
|
|
2315
|
+
`);for(let c of s.members)Tf([c],t),c.session!==void 0&&c.session.length<Fs&&o.push(`${c.alias}: sessionid is shorter than ${Fs} chars; run lmctl seed to refresh it`);for(let c of o)t.stderr.write(`warning: ${c}
|
|
2316
2316
|
`);return await $(t,c=>{IE(n,c,d=>t.stderr.write(`${d}
|
|
2317
2317
|
`))}),i.length>0?1:(t.stdout.write(`ok
|
|
2318
|
-
`),0)}async function JS(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(
|
|
2318
|
+
`),0)}async function JS(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(ZW),0;if(e.length!==1)return t.stderr.write(`usage: lmctl seed <teamfile.lmctl>
|
|
2319
2319
|
`),2;let r=e[0],n;try{n=await $(t,h=>Ee(r,h))}catch(h){return $e(t,`${r}: ${h instanceof Error?h.message:String(h)}`)}let s;try{s=yf(n)}catch(h){return $e(t,`${r}: ${h instanceof Error?h.message:String(h)}`)}let i=Jr(n),o;try{o=De(n)}catch(h){return $e(t,`${r}: ${h instanceof Error?h.message:String(h)}`)}let l=Fa(n,"utf8").split(`
|
|
2320
|
-
`),c=
|
|
2320
|
+
`),c=fB(l),d=sB(o.members,l,c,i),u=Yd(o,i);if(u.length>0){Tf(o.members,t);for(let h of u)t.stderr.write(`error: ${h.field}: ${h.message}
|
|
2321
2321
|
`);return 1}try{In(t,o,n)}catch{}Tf(o.members,t);for(let h of pf(o.members))t.stderr.write(`warning: ${h}
|
|
2322
2322
|
`);for(let h of Sl(o.members,i))t.stderr.write(`warning: ${h}
|
|
2323
|
-
`);let f=0,m=o.members.filter(h=>h.teamfile!==void 0?!1:h.session===void 0||h.session.length<
|
|
2324
|
-
`),1;for(let h of o.members){if(h.teamfile!==void 0)continue;if(h.session!==void 0&&h.session.length>=
|
|
2325
|
-
`);continue}let S=h.sessiondir??i,y=await qS({provider:h.provider,cwd:S,...h.model!==void 0?{model:h.model}:{},...h.effort!==void 0?{effort:h.effort}:{},...h.alias.toLowerCase()==="lead"?{prompt:
|
|
2323
|
+
`);let f=0,m=o.members.filter(h=>h.teamfile!==void 0?!1:h.session===void 0||h.session.length<Fs);for(let h of m)if(!YS(h.provider))return t.stderr.write(`error: ${h.alias}: invalid provider "${h.provider}"
|
|
2324
|
+
`),1;for(let h of o.members){if(h.teamfile!==void 0)continue;if(h.session!==void 0&&h.session.length>=Fs){t.stderr.write(`warning: ${h.alias}: existing sessionid preserved; skipping
|
|
2325
|
+
`);continue}let S=h.sessiondir??i,y=await qS({provider:h.provider,cwd:S,...h.model!==void 0?{model:h.model}:{},...h.effort!==void 0?{effort:h.effort}:{},...h.alias.toLowerCase()==="lead"?{prompt:dB(n,l.join(`
|
|
2326
2326
|
`),o.members)}:{}});for(let x of y.warnings??[])t.stderr.write(`warning: ${h.alias}: ${x}
|
|
2327
|
-
`);if(y.error!==void 0||y.sessionId===void 0||y.sessionId.length<
|
|
2327
|
+
`);if(y.error!==void 0||y.sessionId===void 0||y.sessionId.length<Fs){let x=`provider did not report a sessionid; no new session was found for ${S} (possible provider workspace/cwd mismatch)`;return t.stderr.write(`error: ${h.alias}: seed failed${y.error!==void 0?`: ${y.error}`:`; ${x}`}
|
|
2328
2328
|
`),1}let w=c.get(h.alias.toLowerCase());if(w===void 0)return t.stderr.write(`error: ${h.alias}: could not find matching _MEMBER_ line to update
|
|
2329
|
-
`),1;let I=
|
|
2329
|
+
`),1;let I=hB(l[w],"sessionid",y.sessionId);l[w]=I,f+=1,Pa(n,l.join(`
|
|
2330
2330
|
`),"utf8"),t.stdout.write(`${h.alias}: seeded ${y.sessionId} provider=${h.provider} sessiondir=${S}
|
|
2331
2331
|
`)}let p=l.join(`
|
|
2332
|
-
`),_=
|
|
2333
|
-
`);let g=new Date().toISOString();return await $(t,h=>{VS(h,{teamfilePath:s,name:o.name,rawText:_,now:g})}),0}async function
|
|
2332
|
+
`),_=yB(p,yf(n));(_!==p||d)&&Pa(n,_,"utf8"),f===0&&t.stdout.write(`no members needed seeding
|
|
2333
|
+
`);let g=new Date().toISOString();return await $(t,h=>{VS(h,{teamfilePath:s,name:o.name,rawText:_,now:g})}),0}async function lB(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(Da),0;let r=Z(e,["--provider","--sessiondir"],[]);if(r.error!==void 0)return gf(t,r.error,Da);if(r.positionals.length!==2)return gf(t,"expected <teamfile.lmctl> and <alias>",Da);let[n,s]=r.positionals;if(!_B(s))return $e(t,`invalid alias "${s}"`);if(s.toLowerCase()==="lead")return $e(t,"hire only applies to non-Lead members");let i=P(r,"--provider");if(i===void 0)return gf(t,"missing value for --provider",Da);if(!YS(i))return $e(t,`invalid provider "${i}"`);let o;try{o=await $(t,u=>Ee(n,u))}catch(u){return $e(t,`${n}: ${u instanceof Error?u.message:String(u)}`)}let a;try{a=Fa(o,"utf8")}catch(u){return $e(t,`${n}: ${u instanceof Error?u.message:String(u)}`)}if(pB(a,s))return $e(t,`${s}: alias already exists in ${o}`);let l=P(r,"--sessiondir"),c=[`_MEMBER_ alias=${Ef(s)} provider=${i}`,...l===void 0?[]:[`sessiondir=${Ef(l)}`]].join(" "),d=gB(a,c);return Pa(o,d,"utf8"),t.stdout.write(`Hired ${s} (${i}) -> ${o}
|
|
2334
2334
|
`),t.stdout.write(`Run: lmctl seed ${o}
|
|
2335
|
-
`),0}async function
|
|
2336
|
-
`),a=
|
|
2337
|
-
`),"utf8"),JS([s],t))}function XS(e){return
|
|
2338
|
-
`):"- (no non-Lead members)",i=r.find(a=>a.alias.toLowerCase()==="lead")?.provider??"",o=
|
|
2339
|
-
`)}function
|
|
2340
|
-
`))if(/^\s*#?\s*_MEMBER_\s+\S/u.test(r)&&
|
|
2335
|
+
`),0}async function cB(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(hf),0;let r,n;if(e.length===1){let u=Wr(e[0]);if(u===null)return t.stderr.write(hf),2;r=u.teamfile,n=u.alias}else if(e.length===2)[r,n]=e;else return t.stderr.write(hf),2;let s;try{s=await $(t,u=>Ee(r,u))}catch(u){return $e(t,`${r}: ${u instanceof Error?u.message:String(u)}`)}let i;try{i=Fa(s,"utf8")}catch(u){return $e(t,`${r}: ${u instanceof Error?u.message:String(u)}`)}let o=i.split(`
|
|
2336
|
+
`),a=mB(o,n);if(a===void 0)return $e(t,`${n}: no active _MEMBER_ entry found`);let l=o[a];if(Us(l,"teamfile")!==void 0)return $e(t,`${n}: refresh only applies to provider-backed members, not teamfile= members`);let c=(t.env??process.env)[Kn],d=Us(l,"sessionid");return c!==void 0&&c.length>0&&d===c?$e(t,`${n}: cannot refresh its own running session \u2014 a meta-Lead or the operator must run this refresh.`):(o[a]=KS(l,"sessionid"),a>0&&/^\s*#CreationTime:/u.test(o[a-1])&&o.splice(a-1,1),Pa(s,o.join(`
|
|
2337
|
+
`),"utf8"),JS([s],t))}function XS(e){return GW("sha256").update(e).digest("hex")}function GS(e,t){return{teamfile_path:t.teamfilePath,name:t.name,raw_text:t.rawText,raw_sha256:XS(t.rawText),registered_at:e?.registered_at??t.now,last_seeded_at:t.now}}function VS(e,t){let r=GS(e.getRootTeam(t.teamfilePath),t);return e.upsertRootTeam(r),r}function dB(e,t,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(`
|
|
2338
|
+
`):"- (no non-Lead members)",i=r.find(a=>a.alias.toLowerCase()==="lead")?.provider??"",o=uB(i,e);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: ${e}`,"You are alias Lead for this AI-managed .lmctl team.","","Delegating work:",`- Blocking command shape: lmctl chat "${e}" <alias> "your task here"`,"- MCP lmctl_chat is synchronous/blocking; use it only as a quick-ping or backup path.","- lmctl is foreground/background agnostic. Use your provider or host runtime for async command handling when it supports that.","- For delegation, run the lmctl chat command above. If your runtime has a tracked background mode, it may wrap that same blocking command and notify you when it completes.","- For arbitrary shell work, use your provider/runtime shell tools directly; lmctl does not execute shell commands.",o,"","Delegation is an ACTION, not a plan: to hand a member a task, run the command or call the tool.","If you use lmctl_chat and it appears only after tool search, call it in the SAME turn and do not stop after discovering it or say you're about to call it.","","Team members:",s,"","Example MCP calls:",...r.filter(a=>a.alias.toLowerCase()!=="lead").map(a=>`lmctl_chat(team="${e}", 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 "${e}" <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 "${e}" <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 "${e}" <alias> to inspect its recent messages while troubleshooting.`,"(These health/recovery commands are shell commands. For delegation, prefer lmctl chat; lmctl_chat is the synchronous backup.)","","Full teamfile document at seed time:","```lmctl",t.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(`
|
|
2339
|
+
`)}function uB(e,t){let r=`lmctl chat "${t}" <alias> "your task here"`;switch(e.toLowerCase()){case"claude":return`- Claude tip: run the blocking command (${r}) as background Bash (run_in_background: true); the runtime re-invokes you with the reply when it completes.`;case"copilot":return`- Copilot tip: run the blocking command (${r}) via bash async mode (mode:"async"); the runtime notifies you with output when it completes.`;case"agy":return`- Antigravity tip: run the blocking command (${r}) via run_command with WaitMsBeforeAsync: 0 (Background Tasks); agy wakes you with the output when it completes.`;case"qwen":return`- Qwen tip: run the blocking command (${r}) via the monitor tool; it notifies you on completion.`;case"codex":return"- Codex note: run lmctl chat as the blocking delegation primitive; use Codex-native tool/background behavior when available.";case"gemini":return"- Gemini note: run lmctl chat as the blocking delegation primitive; use Gemini-native tool/background behavior when available.";case"opencode":return"- OpenCode note: use the provider-native background/task surface when available; otherwise run one blocking lmctl chat turn and wait.";default:return"- If your provider has native background completion, use it around the blocking command; otherwise run one blocking lmctl chat turn at a time."}}function fB(e){let t=new Map;for(let r=0;r<e.length;r+=1){let n=e[r];if(!/^\s*_MEMBER_\s+\S/.test(n))continue;let s=Us(n,"alias");s!==void 0&&t.set(s.toLowerCase(),r)}return t}function mB(e,t){let r=t.toLowerCase();for(let n=0;n<e.length;n+=1){let s=e[n];if(/^\s*_MEMBER_\s+\S/u.test(s)&&Us(s,"alias")?.toLowerCase()===r)return n}}function pB(e,t){for(let r of e.split(`
|
|
2340
|
+
`))if(/^\s*#?\s*_MEMBER_\s+\S/u.test(r)&&Us(r,"alias")===t)return!0;return!1}function _B(e){return/^[A-Za-z][A-Za-z0-9_-]*$/u.test(e)}function Us(e,t){let n=new RegExp(`(?:^|\\s)${t}=(?:"([^"]*)"|(\\S*))`).exec(e);return n===null?void 0:n[1]??n[2]??""}function hB(e,t,r){let n=`${t}=${Ef(r)}`,s=new RegExp(`(^|\\s)${t}=(?:"[^"]*"|\\S*)`);return s.test(e)?e.replace(s,(i,o)=>`${o}${n}`):`${e.trimEnd()} ${n}`}function KS(e,t){let r=new RegExp(`(^|\\s)${t}=(?:"[^"]*"|\\S*)`);return e.replace(r,"").replace(/\s+/gu," ").trimEnd()}function Ef(e){return/[\s"]/u.test(e)?`"${e.replace(/"/g,'\\"')}"`:e}function gB(e,t){let r=e.split(`
|
|
2341
2341
|
`),n=-1;for(let a=r.length-1;a>=0;a-=1)if(/^\s*_MEMBER_(?:\s|$)/u.test(r[a])){n=a;break}if(n>=0)return r.splice(n+1,0,t),r.join(`
|
|
2342
2342
|
`);let s=r.length;for(;s>0&&r[s-1]==="";)s-=1;let i=r.slice(0,s).join(`
|
|
2343
2343
|
`),o=r.slice(s).join(`
|
|
@@ -2345,7 +2345,7 @@ List native provider sessions in scope, or list recent managed runs with --runs.
|
|
|
2345
2345
|
|
|
2346
2346
|
`:""}${t}${o.length>0?`
|
|
2347
2347
|
${o}`:`
|
|
2348
|
-
`}`}function
|
|
2348
|
+
`}`}function yB(e,t){let r=`#teamfile: ${t}`,n=e.indexOf(`
|
|
2349
2349
|
`),s=n>=0?e.slice(0,n):e,i=n>=0?e.slice(n+1):"";return s===r?e:s.startsWith("#teamfile:")?i.length>0?`${r}
|
|
2350
2350
|
${i}`:`${r}
|
|
2351
2351
|
`:e.length>0?`${r}
|
|
@@ -2354,10 +2354,10 @@ ${e}`:`${r}
|
|
|
2354
2354
|
`),1}function gf(e,t,r){return e.stderr.write(`error: ${t}
|
|
2355
2355
|
${r}`),2}function Tf(e,t){for(let r of e)r.teamfile!==void 0&&t.stderr.write(`warning: member "${r.alias}" uses deprecated member-level teamfile=; cross-team calls now work at runtime without _CONNECT_
|
|
2356
2356
|
`),r.provider==="gemini"&&t.stderr.write(`${BS.replace("%s",r.alias)}
|
|
2357
|
-
`)}var
|
|
2357
|
+
`)}var Fs,zW,ZW,Da,hf,BS,wf,qS,Hr,Bs=T(()=>{"use strict";Yt();PS();mi();it();Le();Rt();Lt();Rt();_f();Os();Fs=5,zW=`usage: lmctl lint <teamfile.lmctl>
|
|
2358
2358
|
|
|
2359
2359
|
Validate an lmctl teamfile and warn about stale or placeholder session ids.
|
|
2360
|
-
`,
|
|
2360
|
+
`,ZW=`usage: lmctl seed <teamfile.lmctl>
|
|
2361
2361
|
|
|
2362
2362
|
Seed missing or placeholder session ids in an lmctl teamfile by calling each
|
|
2363
2363
|
member's configured native provider.
|
|
@@ -2374,32 +2374,32 @@ Refreshing the Lead drops its chat history; it re-reads durable-memory/ on
|
|
|
2374
2374
|
re-seed.
|
|
2375
2375
|
A member cannot refresh its own running session; run the refresh from a
|
|
2376
2376
|
meta-Lead or operator shell outside that sessiondir.
|
|
2377
|
-
`,BS='notice: member "%s" uses provider=gemini \u2014 the Gemini CLI requires an API/enterprise Google account; personal Google subscriptions should use provider=agy (Antigravity).',wf={existsSync:
|
|
2378
|
-
`),2;let[r,n]=e,s,i=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=ZS(r);if(!bf(c))throw new Error(`source not found: ${r}`);let u=QS(c).isDirectory()?
|
|
2379
|
-
`),1}let o=ZS(n),a=
|
|
2380
|
-
`),1;let l=
|
|
2377
|
+
`,BS='notice: member "%s" uses provider=gemini \u2014 the Gemini CLI requires an API/enterprise Google account; personal Google subscriptions should use provider=agy (Antigravity).',wf={existsSync:KW,statSync:YW,accessSync:VW},qS=async e=>{let{seed:t}=await Promise.resolve().then(()=>(vt(),dc)),r=await t(e);return r.success?{sessionId:r.sessionId,warnings:r.warnings}:{error:r.error??"provider seed failed"}},Hr=wf});var tv={};we(tv,{runClone:()=>IB});import{existsSync as bf,mkdirSync as wB,readFileSync as EB,readdirSync as TB,statSync as QS,writeFileSync as bB}from"node:fs";import{basename as zS,dirname as SB,extname as vB,join as ev,resolve as ZS}from"node:path";async function IB(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(kB),0;if(e.length!==2)return t.stderr.write(`usage: lmctl clone <source> <dest>
|
|
2378
|
+
`),2;let[r,n]=e,s,i=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=ZS(r);if(!bf(c))throw new Error(`source not found: ${r}`);let u=QS(c).isDirectory()?NB(c):c;s=EB(u,"utf8"),i=u}}catch(c){return t.stderr.write(`error: ${c instanceof Error?c.message:String(c)}
|
|
2379
|
+
`),1}let o=ZS(n),a=xB(o,i,n);if(bf(a))return t.stderr.write(`error: ${a} already exists.
|
|
2380
|
+
`),1;let l=RB(AB(s));return wB(SB(a),{recursive:!0}),bB(a,l,"utf8"),t.stdout.write(`Cloned ${r} -> ${a}
|
|
2381
2381
|
`),t.stdout.write(`Edit ${a}; only _MEMBER_ lines are parsed, everything else is free-form.
|
|
2382
2382
|
`),t.stdout.write(`After editing, run: lmctl lint ${a}
|
|
2383
2383
|
`),t.stdout.write(`Then run: lmctl seed ${a}
|
|
2384
|
-
`),0}function
|
|
2384
|
+
`),0}function NB(e){let t=TB(e).filter(r=>r.endsWith(".lmctl"));if(t.length===0)throw new Error(`no .lmctl files in source directory: ${e}`);if(t.length>1)throw new Error(`multiple .lmctl files in source directory: ${e}; specify the source file explicitly`);return ev(e,t[0])}function xB(e,t,r){if(r.endsWith("/")||bf(e)&&QS(e).isDirectory()){let n=zS(t).endsWith(".lmctl")?zS(t):"team.lmctl";return ev(e,n)}return vB(e)?e:`${e}.lmctl`}function AB(e){return e.split(`
|
|
2385
2385
|
`).map(t=>/^\s*_MEMBER_\s+\S/.test(t)?t.replace(/\s+sessionid=(?:"[^"]*"|\S+)/g,"").replace(/^(\s*_MEMBER_)\s+sessionid=(?:"[^"]*"|\S+)\s+/g,"$1 "):t).join(`
|
|
2386
|
-
`)}function
|
|
2386
|
+
`)}function RB(e){return e.split(`
|
|
2387
2387
|
`).map(t=>/^\s*_MEMBER_\s+\S/.test(t)?t.replace(/\s+sessiondir=(?:"[^"]*"|\S+)/g,"").replace(/^(\s*_MEMBER_)\s+sessiondir=(?:"[^"]*"|\S+)\s+/g,"$1 "):t).join(`
|
|
2388
|
-
`)}var
|
|
2388
|
+
`)}var kB,rv=T(()=>{"use strict";kB=`usage: lmctl clone <source> <dest>
|
|
2389
2389
|
|
|
2390
2390
|
Copy a teamfile and strip its session ids, producing a static editable template.
|
|
2391
2391
|
|
|
2392
2392
|
Examples:
|
|
2393
2393
|
lmctl clone ./backend/backend.lmctl ./backend-v2/backend-v2.lmctl
|
|
2394
|
-
`});var iv={};
|
|
2394
|
+
`});var iv={};we(iv,{runPlan:()=>DB});import{existsSync as LB,mkdirSync as OB,writeFileSync as $B}from"node:fs";import{basename as nv,extname as sv,join as CB,resolve as MB}from"node:path";async function DB(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(jB),0;let r=Z(e,["--team","--provider"],[]);if(r.error!==void 0)return t.stderr.write(`error: ${r.error}
|
|
2395
2395
|
`),t.stderr.write(`usage: lmctl plan [options] <directory>
|
|
2396
2396
|
`),2;if(r.positionals.length!==1)return t.stderr.write(`usage: lmctl plan [options] <directory>
|
|
2397
|
-
`),2;let n=
|
|
2398
|
-
`),1;let a=
|
|
2397
|
+
`),2;let n=MB(r.positionals[0]);OB(n,{recursive:!0});let s=P(r,"--team")??nv(n),i=P(r,"--provider")??"claude",o=CB(n,PB(s));if(LB(o))return t.stderr.write(`error: ${o} already exists.
|
|
2398
|
+
`),1;let a=UB({teamName:FB(s),leadProvider:i}),l=Ma(a,ja({workdir:n,teamfile:o,date:new Date}));return $B(o,l.text,"utf8"),t.stdout.write(`Created ${o}
|
|
2399
2399
|
`),t.stdout.write(`Edit ${o}; only _MEMBER_ lines are parsed, everything else is free-form.
|
|
2400
2400
|
`),t.stdout.write(`After editing, run: lmctl lint ${o}
|
|
2401
2401
|
`),t.stdout.write(`Then run: lmctl seed ${o}
|
|
2402
|
-
`),0}function
|
|
2402
|
+
`),0}function PB(e){return sv(e)?e:`${e}.lmctl`}function FB(e){let t=sv(e);return t?nv(e,t):e}function UB(e){let{teamName:t,leadProvider:r}=e;return`# ${t}
|
|
2403
2403
|
|
|
2404
2404
|
# Lead operating guide: https://lmctl.com/skills/lmctl-lead.md
|
|
2405
2405
|
|
|
@@ -2411,7 +2411,7 @@ _MEMBER_ alias=Coder provider=codex
|
|
|
2411
2411
|
_MEMBER_ alias=Reviewer1 provider=codex
|
|
2412
2412
|
_MEMBER_ alias=Reviewer2 provider=${r}
|
|
2413
2413
|
_MEMBER_ alias=Reviewer3 provider=agy
|
|
2414
|
-
`}var
|
|
2414
|
+
`}var jB,ov=T(()=>{"use strict";Le();_f();jB=`usage: lmctl plan [options] <directory>
|
|
2415
2415
|
|
|
2416
2416
|
Generate a starter lmctl team document template for a directory.
|
|
2417
2417
|
|
|
@@ -2426,8 +2426,8 @@ Examples:
|
|
|
2426
2426
|
|
|
2427
2427
|
# Same shape, codex for the Lead and Reviewer2
|
|
2428
2428
|
lmctl plan ./backend --provider codex
|
|
2429
|
-
`});import{execFileSync as
|
|
2430
|
-
`),Ae({event:"model_ignored",provider:c.provider,model:c.model,reason:c.reason})}});if(o===null||o.length===0)return v(e,`no resume incantation for provider "${r}"`);let[a,...l]=o;return await new Promise(c=>{let d=
|
|
2429
|
+
`});import{execFileSync as WB}from"node:child_process";import{resolve as av}from"node:path";function BB(e){return e.filter(t=>t.state!=="retired")}function lv(e,t,r){if(r!==void 0){let a=t.findProjectByName(r);return a===null?v(e,`project not found: ${r}`):a}let n=e.cwd??process.cwd(),s;try{s=WB("git",["rev-parse","--show-toplevel"],{cwd:n,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return v(e,"terminal cannot infer a member from cwd because this directory is not in a git repo; use `lmctl terminal <teamfile> <alias>`")}let i=av(s),o=t.listProjects().find(a=>av(a.local_path)===i);return o===void 0?v(e,`terminal cannot infer a member from cwd ${i}; use \`lmctl terminal <teamfile> <alias>\``):o}function cv(e,t,r,n){if(n!==void 0){let i=t.findTeamByName(n);return i===null?v(e,`team not found: ${n}`):i}let s=t.getTeam(r.team_id);return s===null?v(e,`project ${r.name} has no assigned team; use --team <name>`):s}function dv(e,t,r,n){if(n!==void 0){let i=t.findTeamMemberByAlias(r.id,n);return i===null||i.state==="retired"?v(e,`member not found: ${n}`):i}let s=BB(t.listTeamMembers(r.id)).find(i=>i.role==="agent");return s===void 0?v(e,`team ${r.name} has no active agent member`):s}var uv=T(()=>{"use strict";Le()});var pv={};we(pv,{SIZE_WARN_EST_TOKENS:()=>qs,estimateTokens:()=>mv,runTerminal:()=>XB});import{spawn as qB}from"node:child_process";import{statSync as HB}from"node:fs";async function XB(e,t){if(e.includes("--help")||e.includes("-h"))return QB(t);let r=Z(e,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(r.error!==void 0)return v(t,r.error);let n=P(r,"--run");if(n!==void 0){let s=Number.parseInt(n,10);if(!Number.isFinite(s)||s<=0||String(s)!==n)return v(t,`invalid --run "${n}" (expected a positive integer run id)`);if(r.positionals.length>0)return v(t,"--run is mutually exclusive with positional <teamfile>[:alias]");let i=["--team","--project","--size","--json"];for(let o of i)if(o==="--size"||o==="--json"?V(r,o):P(r,o)!==void 0)return v(t,`--run is mutually exclusive with ${o}`);try{return await $(t,async o=>{let a=P(r,"--alias"),l=gw(o,s,a);return"err"in l?v(t,l.err):Sf(t,{provider:l.ok.provider,sessionid:l.ok.sessionid,sessiondir:l.ok.sessiondir,...l.ok.model!==void 0?{model:l.ok.model}:{}})})}catch(o){return je(t,o)}}if(r.positionals.length>0){let s=["--team","--project","--size","--alias","--json"];for(let l of s)if(l==="--size"||l==="--json"?V(r,l):P(r,l)!==void 0)return v(t,`positional <teamfile>[:alias] is mutually exclusive with ${l} (alias is the SECOND POSITIONAL: \`terminal <teamfile> <alias>\`).`);if(r.positionals.length>2)return v(t,`too many positionals (${r.positionals.length}); expected <teamfile>[:alias] [alias]`);let i=r.positionals[0],o=r.positionals[1],a=yr(JB,{target:i,alias:o,flags:{}});return a.mode==="error"?v(t,a.message):a.mode!=="ai-team"?v(t,`internal: terminal positional yielded unexpected mode "${a.mode}"`):a.alias===void 0?v(t,"terminal: alias required for the teamfile target"):await $(t,l=>GB(t,a.teamfile,a.alias,l))}try{return await $(t,async s=>{let i=YB(t,s,r);if(typeof i=="number")return i;let o=P(r,"--alias");return V(r,"--size")?ZB(t,s,i,o,V(r,"--json")):zB(t,s,i,o)})}catch(s){return je(t,s)}}async function GB(e,t,r,n){let s;try{s=He(t,r,n)}catch(d){return d instanceof ye?v(e,d.message):je(e,d)}let i=hr(n,{receiver_teamfile:s.teamfile,receiver_alias:s.alias,sender_teamfile:s.teamfile,sender_alias:"terminal",ttlMs:gr()});if(!i.acquired)return v(e,`${s.alias} is busy/held by ${i.current.sender_alias} (${i.current.sender_teamfile}) since ${i.current.started_at}`);let o=pb({teamfile:s.teamfile,alias:s.alias}),a=null,l=null,c=null;try{n.setTerminalLock(o),l=VB(n,s),a=setInterval(()=>{try{!n.heartbeatTerminalLock(o.teamfile,o.alias,o.lock_id,new Date().toISOString())&&a!==null&&(clearInterval(a),a=null)}catch{}},_b()),a.unref?.();try{In(e,De(s.teamfile),s.teamfile)}catch{}return c=await Sf(e,{provider:s.provider,sessionid:s.sessionid,sessiondir:s.sessiondir,...s.model!==void 0?{model:s.model}:{},isLead:s.isLead}),c}finally{a!==null&&clearInterval(a),n.clearTerminalLock(o.teamfile,o.alias,o.lock_id),n.releaseAgentInflight(i.lease),KB(n,l,c)}}function VB(e,t){try{return e.startTrackedInvocation({kind:"exec",origin:"operator",scope_teamfile:t.teamfile,from_identity:`${t.teamfile}:terminal`,target_teamfile:t.teamfile,target_alias:t.alias,root_teamfile:t.teamfile,cwd:t.sessiondir,command:`lmctl terminal ${t.teamfile} ${t.alias}`,holder_pid:process.pid,launch_source:"terminal",meta:JSON.stringify({provider:t.provider,sessionid:t.sessionid,...t.model!==void 0?{model:t.model}:{}})}).id}catch{return null}}function KB(e,t,r){if(t!==null)try{e.finishTrackedInvocation(t,{status:r===0?"done":"error",exit_code:r,result_summary:r===0?"terminal session ended":null,error:r===0?null:`terminal exited with code ${r??"unknown"}`})}catch{}}async function Sf(e,t){let{provider:r,sessionid:n,sessiondir:s,model:i}=t;if(!ka(r))return v(e,`no resume incantation for provider "${r}"`);if(!Ob.test(n))return v(e,"refusing to resume: malformed sessionid");let o=qu(r,n,{isLead:t.isLead,model:i,onModelIgnored:c=>{let d=`warning: ${c.provider} terminal ignored model=${c.model}: ${c.reason}`;e.stderr.write(`${d}
|
|
2430
|
+
`),Ae({event:"model_ignored",provider:c.provider,model:c.model,reason:c.reason})}});if(o===null||o.length===0)return v(e,`no resume incantation for provider "${r}"`);let[a,...l]=o;return await new Promise(c=>{let d=qB(a,l,{stdio:"inherit",cwd:s,env:Be(process.env,s,n,"terminal")});d.on("error",u=>{c(v(e,`failed to launch ${a}: ${u.message}`))}),d.on("exit",u=>c(u??0))})}function YB(e,t,r){let n=P(r,"--team");if(n!==void 0){let o=t.findTeamByName(n);return o===null?v(e,`team not found: ${n}`):o}let s=lv(e,t,P(r,"--project"));return typeof s=="number"?s:cv(e,t,s,void 0)}async function zB(e,t,r,n){let s=dv(e,t,r,n);if(typeof s=="number")return s;let i=s.sessionid;return i===null||i.trim().length===0?v(e,`member ${s.alias} has no session yet \u2014 run \`lmctl team seed ${r.name}\` first`):Sf(e,{provider:Ue(s),sessionid:i,sessiondir:s.sessiondir,...s.model!==null&&s.model!==void 0?{model:s.model}:{}})}function mv(e){if(e&&Array.isArray(e.messages)&&e.messages.length>0){let r=e.messages.reduce((n,s)=>n+(s.content?.length??0),0);return{chars:r,est:Math.ceil(r/4),messages:e.messages.length,bytes:null}}let t=e?.filePath;if(t!==void 0)try{let r=HB(t).size;return{chars:r,est:Math.ceil(r/4),messages:e?.messages?.length??null,bytes:r}}catch{}return{chars:0,est:0,messages:null,bytes:null}}async function ZB(e,t,r,n,s){let i;if(n!==void 0){let a=t.findTeamMemberByAlias(r.id,n);if(a===null||a.state==="retired")return v(e,`member not found: ${n}`);i=[a]}else i=t.listTeamMembers(r.id).filter(a=>a.state!=="retired"&&a.sessionid!==null);let o=[];for(let a of i){let l=a.sessionid;if(l===null)continue;let c=Ue(a),d=a.model??null,u=null;ka(c)&&(u=await Zt(l,c));let f=mv(u),m=f.est>qs;o.push({alias:a.alias,provider:c,sessionid:l,messages:f.messages,bytes:f.bytes,est_tokens:f.est,estimate:!0,over_guide:m,model:d,resume_incantation:m?Ia(c,l,d!==null?{model:d}:{}):null})}if(s)return ae(e,{estimate:!0,legend:fv,guide_tokens:qs,members:o}),0;e.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
|
|
2431
2431
|
`),e.stdout.write(`${fv}
|
|
2432
2432
|
`);for(let a of o){let l=a.messages===null?"?":String(a.messages),c=a.bytes===null?"?":String(a.bytes);e.stdout.write(`${a.alias} ${a.provider} msgs=${l} bytes=${c} ~${a.est_tokens} tok (rough estimate)
|
|
2433
2433
|
`),a.over_guide&&e.stdout.write(` \u26A0 ${a.alias}: estimated ~${a.est_tokens} tokens \u2014 ESTIMATE only, exceeds the 200K guide.
|
|
@@ -2435,7 +2435,7 @@ Examples:
|
|
|
2435
2435
|
session yourself:
|
|
2436
2436
|
${a.resume_incantation??"(no resume incantation for provider "+a.provider+")"}
|
|
2437
2437
|
(or: lmctl terminal --team ${r.name} --alias ${a.alias})
|
|
2438
|
-
`)}return 0}function
|
|
2438
|
+
`)}return 0}function QB(e){return e.stdout.write(`usage: lmctl terminal <teamfile>:<alias>
|
|
2439
2439
|
lmctl terminal <teamfile> <alias>
|
|
2440
2440
|
lmctl terminal --run <id> [--alias A]
|
|
2441
2441
|
lmctl terminal [--project P] [--team T] [--alias A] [--size] [--json]
|
|
@@ -2462,30 +2462,30 @@ Examples:
|
|
|
2462
2462
|
exact provider count: the messages path slightly
|
|
2463
2463
|
under-counts code-dense text; the byte fallback
|
|
2464
2464
|
over-counts (JSONL overhead \u2192 safe over-warn); CJK is
|
|
2465
|
-
denser (under-warns). At >${
|
|
2465
|
+
denser (under-warns). At >${qs} est
|
|
2466
2466
|
tokens it surfaces the resume incantation so YOU can
|
|
2467
2467
|
open & self-compact. Nothing is ever changed
|
|
2468
|
-
automatically; ${
|
|
2469
|
-
`),0}var
|
|
2470
|
-
`)}return 0}function
|
|
2471
|
-
`),0}function
|
|
2472
|
-
`),
|
|
2473
|
-
`),0}function
|
|
2474
|
-
`),0}function
|
|
2475
|
-
`),0):v(t,`workspace not found: ${n}`)}function kf(e,t,r){try{
|
|
2476
|
-
`),Wa(e).isDirectory()?
|
|
2468
|
+
automatically; ${qs} is a guide, not a gate.
|
|
2469
|
+
`),0}var JB,qs,fv,_v=T(()=>{"use strict";Ze();An();Le();uv();Lt();Yt();it();Os();Fr();ea();$u();Xo();he();JB={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},qs=2e5,fv="est = rough local heuristic (~4 chars/token), NOT an exact provider token count \u2014 open the session to verify before acting."});function vf(e,t){let r=eq[e],n=t("which",[e]);return n.status===0&&(n.stdout??"").toString().trim()!==""?t(e,["--version"]).status===0?{provider:e,status:"ok",detail:"installed, --version OK"}:{provider:e,status:"unverified",detail:"installed, session unverified (auth may be required)"}:r.optional?{provider:e,status:"skipped",detail:"not installed"}:{provider:e,status:"missing",detail:`not installed (install: ${r.install_hint})`,remediation:r.install_remediation}}var eq,hv=T(()=>{"use strict";eq={claude:{install_hint:"https://docs.claude.com/en/docs/claude-code",optional:!1,install_remediation:"see https://docs.claude.com/en/docs/claude-code"},codex:{install_hint:"https://github.com/openai/codex",optional:!1,install_remediation:"see https://github.com/openai/codex"},gemini:{install_hint:"https://github.com/google/generative-ai-cli",optional:!1,install_remediation:"npm i -g @google/gemini-cli"},opencode:{install_hint:"https://opencode.ai",optional:!0,install_remediation:"see https://opencode.ai"},lmplayer:{install_hint:"Install lmplayer and ensure the lmplayer binary is on PATH.",optional:!0,install_remediation:"install lmplayer and ensure the lmplayer binary is on PATH"},qwen:{install_hint:"https://github.com/QwenLM/qwen-code",optional:!0,install_remediation:"npm i -g @qwen-code/qwen-code"},copilot:{install_hint:"https://docs.github.com/copilot/cli",optional:!0,install_remediation:"see https://docs.github.com/copilot/cli"},agy:{install_hint:"https://antigravity.google",optional:!0,install_remediation:"see https://antigravity.google"}}});var Sv={};we(Sv,{initWorkspace:()=>Tv,runWorkspace:()=>aq,setWorkspaceProvider:()=>bv});import{copyFileSync as tq,cpSync as rq,existsSync as Fe,mkdirSync as Er,readdirSync as If,renameSync as nq,rmSync as Ua,statSync as Wa,writeFileSync as sq}from"node:fs";import{spawnSync as iq}from"node:child_process";import{homedir as gv}from"node:os";import{dirname as Nf,join as Hs}from"node:path";async function aq(e,t){let[r,...n]=e;if(r==="--help"||r==="-h"||r==="help")return t.stdout.write(oq),0;switch(r){case"list":return lq(n,t);case"create":return cq(n,t);case"use":return dq(n,t);case"show":return uq(n,t);case"delete":return fq(n,t);case"migrate":return mq(n,t);case"init":return Tv(n,t);case"set-provider":return bv(n,t);default:return v(t,"usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>")}}function wv(){let e=Vs(),t=[],r=new Set,n=Sr.default,s=Fe(Xs()),i=Fe(jt(n));if((s||i||e===null||e===n)&&(t.push({name:n,db_path:i?Tr(n):Xs(),active:e===null||e===n,legacy:!i&&s}),r.add(n)),Fe(Xr())){let o;try{o=If(Xr())}catch{o=[]}for(let a of o.sort()){if(r.has(a)||!ze(a))continue;let l=!1;try{l=Wa(jt(a)).isDirectory()}catch{l=!1}l&&(t.push({name:a,db_path:Tr(a),active:e===a,legacy:!1}),r.add(a))}}return t}function lq(e,t){let r=Z(e,[]);if(r.error!==void 0)return v(t,r.error);if(r.positionals.length!==0)return v(t,"usage: lmctl workspace list");let n=wv();if(V(r,"--json"))return ae(t,n),0;for(let s of n){let i=s.active?"*":" ",o=s.legacy?" (legacy)":"";t.stdout.write(`${i} ${s.name} ${s.db_path}${o}
|
|
2470
|
+
`)}return 0}function cq(e,t){let r=Z(e,["--docroot"]);if(r.error!==void 0)return v(t,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return v(t,"usage: lmctl workspace create <name> [--docroot PATH]");if(!ze(n))return v(t,`invalid workspace name: ${n} (allowed: letters, digits, '.', '-', '_'; must start with alnum; \u226464 chars)`);let s=jt(n);if(Fe(s))return v(t,`workspace already exists: ${n} (${s})`);let i=P(r,"--docroot")??Ja(n);Er(s,{recursive:!0}),Er(i,{recursive:!0});let o=Tr(n);Er(Nf(o),{recursive:!0});let a=Ie({path:o});try{a.setConfig("project.docroot",i)}finally{a.close()}let l={name:n,dir:s,db_path:o,docroot:i};return V(r,"--json")?ae(t,l):t.stdout.write(`created workspace ${n} at ${s}
|
|
2471
|
+
`),0}function dq(e,t){let r=Z(e,[]);if(r.error!==void 0)return v(t,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return v(t,"usage: lmctl workspace use <name>");if(!ze(n))return v(t,`invalid workspace name: ${n}`);if(n!==Sr.default&&!Fe(jt(n)))return v(t,`workspace not found: ${n} (run \`lmctl workspace create ${n}\` first)`);let s=Gs();return Er(Nf(s),{recursive:!0}),sq(s,`${n}
|
|
2472
|
+
`),V(r,"--json")?ae(t,{active:n,path:s}):t.stdout.write(`active workspace set to ${n}
|
|
2473
|
+
`),0}function uq(e,t){let r=Z(e,[]);if(r.error!==void 0)return v(t,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return v(t,"usage: lmctl workspace show <name>");if(!ze(n))return v(t,`invalid workspace name: ${n}`);let s=wv().find(d=>d.name===n);if(s===void 0)return v(t,`workspace not found: ${n}`);let i=0;try{i=Fe(s.db_path)?Wa(s.db_path).size:0}catch{i=0}let o=0,a=null,l={};if(Fe(s.db_path)){let d=Ie({path:s.db_path});try{o=d.listProjects().length,l=d.getConfigAll(),a=l["project.docroot"]??null}finally{d.close()}}let c={name:s.name,active:s.active,legacy:s.legacy,db_path:s.db_path,db_size_bytes:i,docroot:a,project_count:o,config_keys:Object.keys(l).sort()};return V(r,"--json")?ae(t,c):t.stdout.write(`${JSON.stringify(c,null,2)}
|
|
2474
|
+
`),0}function fq(e,t){let r=Z(e,[],["--json","--confirm","--force"]);if(r.error!==void 0)return v(t,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return v(t,"usage: lmctl workspace delete <name> --confirm [--force]");if(!ze(n))return v(t,`invalid workspace name: ${n}`);if(!V(r,"--confirm"))return v(t,`refusing to delete workspace ${n} without --confirm`);if(n===Sr.default&&!V(r,"--force"))return v(t,"refusing to delete the default workspace without --force");if(Vs()===n&&!V(r,"--force"))return v(t,`refusing to delete the active workspace (${n}) without --force`);let i=jt(n);return Fe(i)?(Ua(i,{recursive:!0,force:!0}),V(r,"--json")?ae(t,{deleted:n,dir:i}):t.stdout.write(`deleted workspace ${n}
|
|
2475
|
+
`),0):v(t,`workspace not found: ${n}`)}function kf(e,t,r){try{nq(e,t);return}catch(s){if(s.code!=="EXDEV")throw s}if(r.stderr.write(`note: cross-device move; copying ${e} -> ${t} then removing source
|
|
2476
|
+
`),Wa(e).isDirectory()?rq(e,t,{recursive:!0}):tq(e,t),!Fe(t))throw new Error(`migration copy verification failed: ${t} not present after copy`);Ua(e,{recursive:!0,force:!0})}function mq(e,t){let r=Z(e,[],["--json"]);if(r.error!==void 0)return v(t,r.error);let n=V(r,"--json"),s=Xa(),i=Xr(),o=[],a=(f,m)=>{if(n)ae(t,{migrated:f,reason:m??null,actions:o});else{for(let p of o)t.stdout.write(`${p}
|
|
2477
2477
|
`);t.stdout.write(f?`migration complete
|
|
2478
2478
|
`:`${m??"nothing to migrate"}
|
|
2479
|
-
`)}return 0};if(!Fe(s))return a(!1,"no legacy ~/.lmctl/profiles/ found; nothing to migrate");let l;try{l=If(s).sort()}catch{l=[]}let c=l.filter(f=>{try{return Wa(
|
|
2479
|
+
`)}return 0};if(!Fe(s))return a(!1,"no legacy ~/.lmctl/profiles/ found; nothing to migrate");let l;try{l=If(s).sort()}catch{l=[]}let c=l.filter(f=>{try{return Wa(Hs(s,f)).isDirectory()}catch{return!1}});if(c.length===0)Ua(s,{recursive:!0,force:!0}),o.push(`removed empty ${s}`);else if(!Fe(i))kf(s,i,t),o.push(`renamed ${s} -> ${i}`);else{let f=c.filter(m=>Fe(Hs(i,m)));if(f.length>0)return v(t,`refusing to migrate: ~/.lmctl/workspaces/ already has: ${f.join(", ")} (no files were moved; resolve the name collision, then re-run \`lmctl workspace migrate\`)`);Er(i,{recursive:!0});for(let m of c)kf(Hs(s,m),Hs(i,m),t),o.push(`moved ${m} -> workspaces/${m}`);try{If(s).length===0&&(Ua(s,{recursive:!0,force:!0}),o.push(`removed empty ${s}`))}catch{}}let d=Gf(),u=Gs();return Fe(d)&&(Fe(u)?o.push("left active-profile in place (active-workspace already exists; not clobbering)"):(kf(d,u,t),o.push("renamed active-profile -> active-workspace"))),a(!0)}function Ev(e,t){return iq(e,t,{encoding:"utf8",timeout:5e3,maxBuffer:1024*1024})}function hq(e){return process.stderr.write(e),new Promise(t=>{let r=n=>{let s=(typeof n=="string"?n:n.toString("utf8")).trim();process.stdin.removeListener("data",r);try{process.stdin.pause()}catch{}t(s)};try{process.stdin.resume()}catch{}process.stdin.once("data",r)})}function yv(e){return e==="~"?gv():e.startsWith("~/")?Hs(gv(),e.slice(2)):e}async function Tv(e,t,r={}){let n="usage: lmctl workspace init [--name N] [--basedir DIR] [--provider1 P] [--provider2 P] [--provider3 P]";if(e.includes("--help")||e.includes("-h"))return t.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: ${Cn.join(", ")}.`].join(`
|
|
2480
2480
|
`)+`
|
|
2481
2481
|
`),0;let s=Z(e,["--name","--basedir","--provider1","--provider2","--provider3"]);if(s.error!==void 0)return v(t,s.error);if(s.positionals.length!==0)return v(t,n);let i=r.spawn??Ev,a=Cn.map(x=>vf(x,i)).filter(x=>x.status==="ok"||x.status==="unverified").map(x=>x.provider);if(a.length===0)return t.stderr.write(`error: no provider CLI found on PATH; install/auth ${Cn.join("|")} first
|
|
2482
|
-
`),2;let l=r.isTty??!!process.stdin.isTTY,c=r.promptLine??
|
|
2482
|
+
`),2;let l=r.isTty??!!process.stdin.isTTY,c=r.promptLine??hq,d=r.promptLine!==void 0||l,u=x=>(t.stderr.write(`error: ${x} is required in non-interactive mode (no TTY); pass it explicitly
|
|
2483
2483
|
`),2),f,m=P(s,"--name");if(m!==void 0){if(!ze(m))return t.stderr.write(`error: invalid workspace name: ${m}
|
|
2484
2484
|
`),2;f=m}else{if(!d)return u("--name");for(;;){let x=(await c("Workspace name [default]: ")).trim(),U=x.length===0?"default":x;if(ze(U)){f=U;break}t.stderr.write(`invalid workspace name: ${U} (letters/digits/.-_, start alnum, \u226464)
|
|
2485
2485
|
`)}}let p=jt(f);if(Fe(p))return t.stderr.write(`error: workspace already exists: ${f} (${p}) \u2014 refusing to overwrite
|
|
2486
|
-
`),2;let _,g=P(s,"--basedir"),h=Ja(f);if(g!==void 0)_=yv(g);else{if(!d)return u("--basedir");let x=(await c(`Base directory for this workspace's projects [${h}]: `)).trim();_=x.length===0?h:yv(x)}let S={};for(let x of["provider1","provider2","provider3"]){let U=P(s,`--${x}`),ue=
|
|
2487
|
-
`),2;S[x]=U;continue}if(!d)return u(`--${x}`);for(;;){let M=(await c(`${x} (${
|
|
2488
|
-
`)}}Er(p,{recursive:!0}),Er(_,{recursive:!0});let y=Tr(f);Er(Nf(y),{recursive:!0});let w=Ie({path:y});try{w.setConfig("project.docroot",_),w.setConfig("workspace.provider1",S.provider1),w.setConfig("workspace.provider2",S.provider2),w.setConfig("workspace.provider3",S.provider3)}finally{w.close()}let I={name:f,dir:p,db_path:y,basedir:_,providers:{...S}};return
|
|
2486
|
+
`),2;let _,g=P(s,"--basedir"),h=Ja(f);if(g!==void 0)_=yv(g);else{if(!d)return u("--basedir");let x=(await c(`Base directory for this workspace's projects [${h}]: `)).trim();_=x.length===0?h:yv(x)}let S={};for(let x of["provider1","provider2","provider3"]){let U=P(s,`--${x}`),ue=pq[x],W=a.includes(ue)?ue:a[0];if(U!==void 0){if(!a.includes(U))return t.stderr.write(`error: --${x} ${U} is not an available provider (available: ${a.join(", ")})
|
|
2487
|
+
`),2;S[x]=U;continue}if(!d)return u(`--${x}`);for(;;){let M=(await c(`${x} (${_q[x]}) [${W}]: `)).trim(),A=M.length===0?W:M;if(a.includes(A)){S[x]=A;break}t.stderr.write(`not an available provider: ${A} (available: ${a.join(", ")})
|
|
2488
|
+
`)}}Er(p,{recursive:!0}),Er(_,{recursive:!0});let y=Tr(f);Er(Nf(y),{recursive:!0});let w=Ie({path:y});try{w.setConfig("project.docroot",_),w.setConfig("workspace.provider1",S.provider1),w.setConfig("workspace.provider2",S.provider2),w.setConfig("workspace.provider3",S.provider3)}finally{w.close()}let I={name:f,dir:p,db_path:y,basedir:_,providers:{...S}};return V(s,"--json")?ae(t,I):(t.stdout.write(`created workspace ${f} at ${p}
|
|
2489
2489
|
`),t.stdout.write(` basedir: ${_}
|
|
2490
2490
|
`),t.stdout.write(` provider1=${S.provider1} provider2=${S.provider2} provider3=${S.provider3}
|
|
2491
2491
|
`),t.stdout.write(`activate it with: lmctl workspace use ${f}
|
|
@@ -2495,7 +2495,7 @@ Examples:
|
|
|
2495
2495
|
`),2;let c=r.spawn??Ev,d=Cn.map(p=>vf(p,c)).filter(p=>p.status==="ok"||p.status==="unverified").map(p=>p.provider);if(d.length===0)return t.stderr.write(`error: no provider CLI found on PATH; install/auth ${Cn.join("|")} first
|
|
2496
2496
|
`),2;if(!d.includes(o))return t.stderr.write(`error: ${o} is not an available provider (available: ${d.join(", ")})
|
|
2497
2497
|
`),2;let u=t.dal===void 0,f=t.dal??Ie({path:le()});try{f.setConfig(`workspace.${l}`,o)}finally{u&&f.close()}let m=Dt()??Sr.default;return t.stdout.write(`workspace.${l} = ${o} (workspace: ${m})
|
|
2498
|
-
`),0}var
|
|
2498
|
+
`),0}var oq,Cn,pq,_q,vv=T(()=>{"use strict";Ze();hv();Le();Xe();oq=`usage: lmctl workspace list [--json]
|
|
2499
2499
|
lmctl workspace create <name> [--docroot PATH] [--json]
|
|
2500
2500
|
lmctl workspace use <name> [--json]
|
|
2501
2501
|
lmctl workspace show <name> [--json]
|
|
@@ -2507,7 +2507,7 @@ Examples:
|
|
|
2507
2507
|
Manage isolated workspace state directories, active workspace selection,
|
|
2508
2508
|
legacy profile migration, and configured provider slots.
|
|
2509
2509
|
delete requires --confirm; deleting default or active workspaces also requires --force.
|
|
2510
|
-
`;Cn=["claude","codex","gemini","qwen"],
|
|
2510
|
+
`;Cn=["claude","codex","gemini","qwen"],pq={provider1:"claude",provider2:"codex",provider3:"gemini"},_q={provider1:"primary implementer",provider2:"independent reviewer",provider3:"auxiliary / tie-break"}});import{createHash as gq,randomBytes as yq}from"node:crypto";import{readFile as wq}from"node:fs/promises";function kv(e=new Date,t=yq(4)){let r=e.getUTCFullYear().toString().padStart(4,"0"),n=(e.getUTCMonth()+1).toString().padStart(2,"0"),s=e.getUTCDate().toString().padStart(2,"0"),i=e.getUTCHours().toString().padStart(2,"0"),o=e.getUTCMinutes().toString().padStart(2,"0"),a=e.getUTCSeconds().toString().padStart(2,"0"),l=t.toString("hex").slice(0,8).padEnd(8,"0");return`dxx-${r}${n}${s}-${i}${o}${a}-${l}`}function Eq(e){return gq("sha256").update(e).digest("hex")}async function Iv(e){return(await Promise.all(e.map(async({bundlePath:r,absPath:n})=>{let s=await wq(n);return{path:r,sha256:Eq(s),size:s.byteLength}}))).sort((r,n)=>r.path<n.path?-1:r.path>n.path?1:0)}function Nv(e){return{ticket_id:e.ticketId,lmctl_next_version:e.lmctlNextVersion,node_version:e.nodeVersion,platform:e.platform,generated_at:e.generatedAt.toISOString(),sanitized:e.sanitized,files:e.files}}var xf=T(()=>{"use strict"});import{spawnSync as xv}from"node:child_process";import{mkdir as Af,writeFile as Av,readFile as Tq,rm as Rv}from"node:fs/promises";import{tmpdir as bq}from"node:os";import{dirname as Lv,join as Rf}from"node:path";async function Ov(e){let t=e.stagingDir??Rf(bq(),`lmctl-diag-${e.ticketId}`),r=Rf(t,`diagnostic-${e.ticketId}`);await Af(r,{recursive:!0});let n=[],s=async(u,f)=>{let m=Rf(r,u);if(await Af(Lv(m),{recursive:!0}),typeof f=="string")await Av(m,f);else{let p=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);await Av(m,new Uint8Array(p))}n.push({bundlePath:u,absPath:m})},i=u=>`${JSON.stringify(u,null,2)}
|
|
2511
2511
|
`;if(e.data.serve!==void 0){let u=e.data.serve,f=u.pid===null?`no daemon (source=${u.pid_source})
|
|
2512
2512
|
`:`${u.pid}
|
|
2513
2513
|
# source=${u.pid_source} alive=${String(u.pid_alive)}
|
|
@@ -2525,29 +2525,29 @@ delete requires --confirm; deleting default or active workspaces also requires -
|
|
|
2525
2525
|
`:`# source=${f}
|
|
2526
2526
|
# tail_lines=${u.tail_lines}
|
|
2527
2527
|
`;await s("intents/recent.log",`${m}${u.tail}${u.tail.length>0?`
|
|
2528
|
-
`:""}`)}if(await s("README.md",
|
|
2529
|
-
`)}var $v=T(()=>{"use strict";xf();
|
|
2528
|
+
`:""}`)}if(await s("README.md",Sq(e)),e.sanitized)for(let u of n){let f=await Tq(u.absPath);try{Zf(u.bundlePath,f.toString("utf8"))}catch(m){throw await Rv(t,{recursive:!0,force:!0}),m instanceof vr,m}}let o=await Iv(n),a=Nv({ticketId:e.ticketId,lmctlNextVersion:e.lmctlNextVersion,nodeVersion:process.version,platform:process.platform,generatedAt:e.generatedAt??new Date,sanitized:e.sanitized,files:o});await s("manifest.json",i(a)),await Af(Lv(e.outputPath),{recursive:!0});let l=xv("tar",["-czf",e.outputPath,"-C",t,`diagnostic-${e.ticketId}`],{encoding:"utf8"});if(l.status!==0)throw new Error(`tar failed (status=${l.status}): ${l.stderr??""}`);let c=xv("stat",["-c","%s",e.outputPath],{encoding:"utf8"}),d=Number.parseInt((c.stdout??"0").trim(),10)||0;return await Rv(t,{recursive:!0,force:!0}),{outputPath:e.outputPath,manifest:a,bundleSizeBytes:d}}function Sq(e){let t=Object.keys(e.data).sort().join(", ")||"(none)";return[`# Diagnostic Bundle ${e.ticketId}`,"",`Generated by lmctl ${e.lmctlNextVersion}.`,"",`Sections included: ${t}`,`Sanitized: ${e.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(`
|
|
2529
|
+
`)}var $v=T(()=>{"use strict";xf();Ys()});import{spawnSync as vq}from"node:child_process";import{stat as kq}from"node:fs/promises";async function Cv(e){try{if(!(await kq(e.bundlePath)).isFile())return{mode:e.mode,ok:!1,message:`bundle not a regular file: ${e.bundlePath}`}}catch(t){return{mode:e.mode,ok:!1,message:`bundle missing: ${t instanceof Error?t.message:String(t)}`}}switch(e.mode){case"local":return{mode:"local",ok:!0,message:`bundle written: ${e.bundlePath}`,destination:e.bundlePath};case"internal-s3":return Iq(e);case"hq":return Nq(e)}}function Iq(e){let r=vq("which",["aws"],{encoding:"utf8"}).status===0,s=`${e.s3Prefix??"s3://lmctl/diagnostics/"}${e.ticketId}.tar.gz`;return r?{mode:"internal-s3",ok:!0,message:`STUB (no actual upload performed): would run \`aws s3 cp ${e.bundlePath} ${s}\``,destination:s}:{mode:"internal-s3",ok:!1,message:`aws CLI not available; would upload ${e.bundlePath} -> ${s}`,destination:s}}function Nq(e){let t=e.hqUrl??"https://lmctl.anthropic.com";return{mode:"hq",ok:!1,message:`headquarter upload not implemented in MVP; would POST to ${t}/diagnostics/init with ticket ${e.ticketId}`,destination:t}}var Mv=T(()=>{"use strict"});var Dv={};we(Dv,{parseDiagnoseArgs:()=>jv,runDiagnose:()=>Rq});import{tmpdir as xq}from"node:os";import{join as Aq}from"node:path";async function Rq(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${$q()}
|
|
2530
2530
|
`),0;let r=jv(e);if(typeof r=="string")return t.stderr.write(`error: ${r}
|
|
2531
2531
|
`),2;if(r.noSanitize&&(r.upload||r.internalS3||r.hqUrl!==void 0))return t.stderr.write(`error: --no-sanitize is incompatible with upload modes (--upload/--internal-s3/--hq)
|
|
2532
2532
|
`),2;if(r.upload&&r.internalS3)return t.stderr.write(`error: pick one of --upload (HQ) or --internal-s3, not both
|
|
2533
|
-
`),2;let n=kv(),s=r.outputPath??
|
|
2533
|
+
`),2;let n=kv(),s=r.outputPath??Oq(n),i=r.internalS3?"internal-s3":r.upload?"hq":"local";try{return await $(t,async o=>{let a=await em({dal:o,include:r.include,dbPath:le(),intentLog:process.env.LMCTL_INTENT_LOG}),l;try{l=await Ov({ticketId:n,data:a,outputPath:s,lmctlNextVersion:yt(),sanitized:!r.noSanitize})}catch(u){if(u instanceof vr)return t.stderr.write(`sanitization failed: ${u.message}
|
|
2534
2534
|
`),2;throw u}let c=await Cv({mode:i,bundlePath:l.outputPath,ticketId:n,hqUrl:r.hqUrl}),d={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?t.stdout.write(`${JSON.stringify(d,null,2)}
|
|
2535
2535
|
`):(t.stdout.write(`ticket: ${n}
|
|
2536
2536
|
`),t.stdout.write(`bundle: ${l.outputPath} (${l.bundleSizeBytes} bytes, ${l.manifest.files.length} files)
|
|
2537
2537
|
`),t.stdout.write(`upload[${c.mode}]: ${c.ok?"ok":"noop"} \u2014 ${c.message}
|
|
2538
2538
|
`)),c.ok||i==="local"?0:1})}catch(o){return t.stderr.write(`diagnose failed: ${o instanceof Error?o.message:String(o)}
|
|
2539
|
-
`),1}}function jv(e){let t={upload:!1,internalS3:!1,noSanitize:!1,json:!1},r=[];for(let n=0;n<e.length;n+=1){let s=e[n];if(s==="--output"){let i=e[++n];if(i===void 0||i.startsWith("--"))return"missing value for --output";t.outputPath=i;continue}if(s==="--upload"){t.upload=!0;continue}if(s==="--internal-s3"){t.internalS3=!0;continue}if(s==="--hq"){let i=e[++n];if(i===void 0||i.startsWith("--"))return"missing value for --hq";t.hqUrl=i,t.upload=!0;continue}if(s==="--include"){let i=e[++n];if(i===void 0||i.startsWith("--"))return"missing value for --include";if(!
|
|
2540
|
-
`)}var Pv=T(()=>{"use strict";Fn();$v();xf();
|
|
2539
|
+
`),1}}function jv(e){let t={upload:!1,internalS3:!1,noSanitize:!1,json:!1},r=[];for(let n=0;n<e.length;n+=1){let s=e[n];if(s==="--output"){let i=e[++n];if(i===void 0||i.startsWith("--"))return"missing value for --output";t.outputPath=i;continue}if(s==="--upload"){t.upload=!0;continue}if(s==="--internal-s3"){t.internalS3=!0;continue}if(s==="--hq"){let i=e[++n];if(i===void 0||i.startsWith("--"))return"missing value for --hq";t.hqUrl=i,t.upload=!0;continue}if(s==="--include"){let i=e[++n];if(i===void 0||i.startsWith("--"))return"missing value for --include";if(!Lq(i))return`unknown section: ${i} (expected one of ${zs.join(", ")})`;r.push(i);continue}if(s==="--no-sanitize"){t.noSanitize=!0;continue}if(s==="--json"){t.json=!0;continue}if(!(s==="--help"||s==="-h"))return`unknown argument: ${s}`}return r.length>0&&(t.include=r),t}function Lq(e){return zs.includes(e)}function Oq(e){return Aq(xq(),`lmctl-diag-${e}.tar.gz`)}function $q(){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(`
|
|
2540
|
+
`)}var Pv=T(()=>{"use strict";Fn();$v();xf();Ys();Mv();Xe();Le()});var Hv={};we(Hv,{ATTENTION_STATES:()=>$f,DAEMON_INTERVAL_FAST_MS:()=>Of,REQUIRED_TEAM_ALIASES:()=>Fv,chooseDiagnoses:()=>Bv,collectEvidence:()=>Wv,diagnose:()=>Uv,renderReport:()=>qv,runDiagnosePrompt:()=>jq});function Uv(e,t){let r=Wv(e,t),n=Bv(r);return qv(r,n)}function Wv(e,t){let r=t.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:ks(),lastTickAt:null}},s=null;try{s=e.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=Mq(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 i=e.getJob(n.prompt.job_id);if(i!==null&&(n.job.exists=!0,n.job.status=i.status,n.job.attempt_count=i.attempt_count,n.job.last_error=i.last_error,n.job.available_at=i.available_at,n.job.locked_by=i.locked_by,n.job.run_id=i.run_id,i.run_id!==null))try{let o=e.getRun(i.run_id);if(o!==null){n.run.exists=!0,n.run.id=o.id,n.run.current_state=o.current_state,n.run.terminal_state=o.terminal_state,n.run.started_at=o.started_at,n.run.ended_at=o.ended_at;let a="__paused__:";n.run.paused_step=o.current_state!==null&&o.current_state.startsWith(a)?o.current_state.slice(a.length):null,n.run.paused_at=o.paused_at}}catch{n.run.sectionAvailable=!1}}catch{n.job.sectionAvailable=!1}if(n.prompt.project_id!==void 0)try{let i=e.getProject(n.prompt.project_id);if(i!==null){n.project.exists=!0,n.project.id=i.id,n.project.name=i.name,n.project.local_path=i.local_path,n.project.test_command=i.test_command,n.project.workflow_name=i.workflow_name,n.project.team_id=i.team_id;try{n.project.workflow_name_resolves=e.getWorkflowByName(i.workflow_name)!==null}catch{n.project.workflow_name_resolves=!1}}}catch{n.project.sectionAvailable=!1}if(n.project.id!==void 0)try{let i=e.listProjectWorkflows(n.project.id);n.workflows.count=i.length;for(let o of i){let a=`workflow_id=${o.workflow_id}`,l=0,c=null;try{let u=e.listWorkflows().find(f=>f.id===o.workflow_id);u!==void 0&&(a=u.name,l=u.version,c=u.source_uri)}catch{}n.workflows.rows.push({workflow_name:a,version:l,enabled:o.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 i=e.listTeamMembers(n.project.team_id);for(let a of i)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 o=new Set(i.map(a=>a.alias));n.team.missingAliases=Fv.filter(a=>!o.has(a))}catch{n.team.sectionAvailable=!1}return n.daemon.workerPid=null,n.daemon.lastTickAt=null,n}function Bv(e){let t=[];if(e.dispatch.sectionAvailable&&!e.dispatch.rowExists)return t.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"}),t;e.dispatch.rowExists&&e.job.exists&&(e.job.run_id===null||e.job.run_id===void 0)&&!e.run.exists&&t.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)"}),e.daemon.intervalMs>Of&&t.push({cause:`Daemon poll interval is ${e.daemon.intervalMs}ms (${Math.round(e.daemon.intervalMs/1e3)}s); WT/dev expected <=${Of}ms`,action:"Set LMCTL_DAEMON_INTERVAL_MS=5000 (or lower) in the agent's env before relaunching `lmctl-next-agent`"}),e.project.exists&&e.workflows.sectionAvailable&&e.workflows.count===0&&e.project.workflow_name_resolves!==!0&&t.push({cause:`Project ${e.project.name??`id=${e.project.id??"?"}`} has 0 workflows registered AND project.workflow_name does not resolve; engine can't dispatch`,action:"The workflow/project CLI surface is retired; inspect the dormant DB rows or migrate this project to a .lmctl teamfile path."}),e.team.sectionAvailable&&e.team.missingAliases.length>0&&t.push({cause:`Default team (team_id=${e.team.teamId??"?"}) missing required aliases: ${e.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=e.team.sectionAvailable?e.team.members.filter(s=>$f.has(s.state)):[];if(e.run.exists&&(e.run.paused_step??null)!==null||r.length>0){let s=e.run.paused_step??null,i=r.map(a=>a.alias).join(", "),o=s!==null&&i.length>0?`Run paused at ${s} awaiting operator escalation decision (member ${i} attention_needed)`:s!==null?`Run paused at ${s} awaiting operator escalation decision`:`Team member(s) ${i} awaiting operator attention`;t.push({cause:o,action:"Open the run in the SPA escalations panel (paused badge) or resolve via the operator-resume verb"})}return e.dispatch.rowExists&&e.job.exists&&!e.run.exists&&e.daemon.workerPid===null&&t.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"}),t.slice(0,3)}function qv(e,t){let r=[];if(r.push(`DIAGNOSE ${e.promptId}`),r.push(""),r.push("[PROMPT]"),e.prompt.exists?(r.push(` id: ${e.promptId}`),r.push(` project_id: ${e.prompt.project_id??"?"}`),r.push(` text: ${e.prompt.text_preview??"?"}`),r.push(` created_at: ${e.prompt.created_at??"?"}`),r.push(` completed_at: ${e.prompt.completed_at??"null"}`)):r.push(" not present in prompt_dispatch table"),r.push(""),r.push("[PROMPT_DISPATCH]"),e.dispatch.sectionAvailable?(r.push(` row exists in prompt_dispatch table: ${e.dispatch.rowExists?"YES":"NO"}`),e.dispatch.rowExists&&(r.push(` job_id: ${e.prompt.job_id??"?"}`),r.push(` dispatched_at: ${e.prompt.created_at??"?"}`),r.push(` last_seen_status: ${Cq(e)}`))):r.push(" table not present (schema variation)"),r.push(""),r.push("[PROMPT_RUN]"),e.job.sectionAvailable?e.job.exists?e.run.exists?(r.push(" row exists in prompt_runs table: YES"),r.push(` run_id: ${e.run.id??"?"}`),r.push(` current_step: ${e.run.current_state??"null"}`),r.push(` status: ${e.run.terminal_state??"in_progress"}`),r.push(` started_at: ${e.run.started_at??"?"}`),r.push(` attempts: ${e.job.attempt_count??0}`)):(r.push(" row exists in prompt_runs table: NO"),r.push(` job_id: ${e.prompt.job_id??"?"} status=${e.job.status??"?"} attempts=${e.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]"),e.project.sectionAvailable?e.project.exists?(r.push(` id: ${e.project.id??"?"}`),r.push(` name: ${e.project.name??"?"}`),r.push(` local_path: ${e.project.local_path??"?"}`),r.push(` test_command: ${e.project.test_command??"null"}`),r.push(` default_workflow: ${e.project.workflow_name??"null"}`)):e.prompt.project_id===void 0?r.push(" not resolvable (no project_id on prompt)"):r.push(` not present (id=${e.prompt.project_id})`):r.push(" project table not accessible"),r.push(""),r.push("[WORKFLOWS REGISTERED FOR PROJECT]"),!e.workflows.sectionAvailable)r.push(" project_workflow table not accessible");else if(e.workflows.count===0&&e.project.exists&&e.project.workflow_name_resolves===!0)r.push(` default_workflow_name: ${e.project.workflow_name??"?"} (resolved via project.workflow_name)`),r.push(" project_workflow rows: 0 (uses fallback resolution; expected)");else{r.push(` count: ${e.workflows.count}`);for(let i of e.workflows.rows)r.push(` - ${i.workflow_name} v${i.version} enabled=${i.enabled===1?"true":"false"} source=${i.source_uri??"null"}`)}if(r.push(""),r.push("[TEAM MEMBERS FOR PROJECT'S DEFAULT TEAM]"),!e.team.sectionAvailable)r.push(" team_member table not accessible");else if(e.team.teamId===void 0)r.push(" not resolvable (no team_id on project)");else{e.team.members.length===0&&r.push(" (no members)");for(let i of e.team.members)r.push(` - alias=${i.alias} provider=${i.provider} state=${i.state} sessionid=${i.sessionid??"null"} sessiondir=${i.sessiondir}`);e.team.missingAliases.length>0&&r.push(` ! missing aliases: ${e.team.missingAliases.join(", ")}`)}r.push("");let n=e.team.sectionAvailable?e.team.members.filter(i=>$f.has(i.state)):[],s=e.run.exists?e.run.paused_step??null:null;if(s!==null||n.length>0){if(r.push("[ATTENTION/ESCALATION]"),s!==null){let i=e.run.paused_at??e.run.started_at??"?";r.push(` paused_step: ${s} (started: ${i})`)}if(n.length>0){let i=n.map(o=>`${o.alias} (state=${o.state}${o.state_updated_at?` since ${o.state_updated_at}`:""}${o.state_reason?`, reason="${o.state_reason}"`:""})`).join(", ");r.push(` members awaiting operator: ${i}`)}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: ${e.daemon.workerPid===null?"not observable from CLI":String(e.daemon.workerPid)}`),r.push(` daemon poll interval (LMCTL_DAEMON_INTERVAL_MS env): ${e.daemon.intervalMs}`),r.push(` last daemon tick: ${e.daemon.lastTickAt??"not exposed"}`),r.push(""),r.push("[DIAGNOSIS]"),t.length===0)r.push(" no obvious root cause flagged by the v1 rules (see brief Part 4)");else for(let i of t)r.push(` - ${i.cause}`),r.push(` -> ${i.action}`);return r.join(`
|
|
2541
2541
|
`)+`
|
|
2542
|
-
`}function
|
|
2542
|
+
`}function Cq(e){return e.dispatch.rowExists?e.prompt.completed_at!==null&&e.prompt.completed_at!==void 0?"done":e.job.exists?e.run.exists?e.run.terminal_state!==null&&e.run.terminal_state!==void 0?`terminal:${e.run.terminal_state}`:`running:${e.run.current_state??"?"}`:"pending (no run)":"pending (no job)":"unknown"}function Mq(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:`${t.slice(0,80)}...`}async function jq(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${Lf()}
|
|
2543
2543
|
`),0;let r=[];for(let s of e){if(s.startsWith("--"))return t.stderr.write(`error: unknown flag: ${s}
|
|
2544
2544
|
`),t.stderr.write(`${Lf()}
|
|
2545
2545
|
`),2;r.push(s)}if(r.length!==1)return t.stderr.write(`error: expected exactly one positional arg: <prompt_id>
|
|
2546
2546
|
`),t.stderr.write(`${Lf()}
|
|
2547
2547
|
`),2;let n=r[0];try{return await $(t,s=>(t.stdout.write(Uv(s,n)),0))}catch(s){return t.stderr.write(`diagnose-prompt failed: ${s instanceof Error?s.message:String(s)}
|
|
2548
2548
|
`),1}}function Lf(){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(`
|
|
2549
|
-
`)}var Fv,Of,$f,Jv=T(()=>{"use strict";Zd();Le();Fv=["Coder","Reviewer1","Polisher"],Of=3e4,$f=new Set(["attention_needed","paused","escalation"])});var dk={};
|
|
2550
|
-
`)}catch{}}async function
|
|
2549
|
+
`)}var Fv,Of,$f,Jv=T(()=>{"use strict";Zd();Le();Fv=["Coder","Reviewer1","Polisher"],Of=3e4,$f=new Set(["attention_needed","paused","escalation"])});var dk={};we(dk,{appendIntent:()=>ik,resolveIntentLogPath:()=>sk,runStatus:()=>Gq});import{appendFileSync as Dq,mkdirSync as Pq}from"node:fs";import{homedir as Fq}from"node:os";import{basename as Uq,dirname as nk,isAbsolute as Wq,join as Bq,resolve as qq}from"node:path";function sk(){return process.env.LMCTL_INTENT_LOG??Bq(Fq(),".lmctl","recent-intents.log")}function ik(e){try{let t=sk();Pq(nk(t),{recursive:!0});let r=JSON.stringify({ts:e.ts??new Date().toISOString(),cwd:e.cwd??process.cwd(),verb:e.verb,args:[...e.args]});Dq(t,`${r}
|
|
2550
|
+
`)}catch{}}async function Gq(e,t){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(Hq),0;let r=e.find(o=>o==="--project"||o.startsWith("--project=")||o==="--web");if(r!==void 0)return v(t,`unknown option ${r}; lmctl status is team/SELF scoped now`);let n=Z(e,["--since"],["--json"]);if(n.error!==void 0)return v(t,n.error);if(n.positionals.length>0)return v(t,`unknown argument: ${n.positionals[0]}`);let s=V(n,"--json"),i=wH(P(n,"--since"));if("error"in i)return v(t,i.error);try{let o=t.env??process.env;if(s){let a=await $(t,l=>zv(l,o));ae(t,a)}else{let a=await $(t,l=>nH(zv(l,o),{sinceIso:i.iso}));t.stdout.write(a)}return ik({verb:"status",args:e}),0}catch(o){return v(t,o instanceof Error?o.message:String(o))}}function zv(e,t){let r=Cu(t,e);if(!r.ok){if(r.reason==="not-found")throw new Error($s("status"));return Kq(e)}return Vq(e,r.identity)}function Vq(e,t){let r=qr(t),n=e.getRootTeam(r.teamfile);if(n===null)throw new Error($s("status"));let s=Pe(n.teamfile_path,e);return{scope:"self",identity:r.value,...ok(),team:{name:s.name,teamfile:n.teamfile_path},members:s.members.map(i=>zq(e,n.teamfile_path,i)),activity:{from_me:Mf(Cf(e,{from:r.value})).map(i=>jf(i,e)),to_me:Mf(Cf(e,{target_teamfile:r.teamfile,target_alias:r.alias})).map(i=>jf(i,e))},mailbox:{outbound:Ba(Qq(e,r.teamfile,r.alias),"outbound"),inbound_pending:Ba(eH(e,r.teamfile,r.alias),"inbound")},waiting_on:tH(e,r.teamfile,r.alias).map(ak)}}function ok(){return{workspace:Dt(),db_path:le()}}function Kq(e){let t=e.listRootTeams();return{scope:"workspace",identity:null,...ok(),teams:t.map(r=>Yq(e,r)),activity:Mf(Cf(e)).map(r=>jf(r,e)),mailbox:{pending_outbound:Ba(Zv(e,"sender"),"outbound"),pending_inbound:Ba(Zv(e,"receiver"),"inbound")},waiting_on:rH(e).map(ak)}}function Yq(e,t){let r=0;try{r=Pe(t.teamfile_path,e).members.length}catch{r=0}return{name:t.name,teamfile:t.teamfile_path,member_count:r,registered_at:t.registered_at,last_seeded_at:t.last_seeded_at}}function zq(e,t,r){let n=r.teamfile===void 0?null:Ee(Wq(r.teamfile)?r.teamfile:qq(nk(t),r.teamfile),e),s=Pr(e,t,r.alias),i=s.busy&&s.reason==="in-flight"?Zq(e,t,r.alias,s.inFlight):null;return{alias:r.alias,provider:r.provider,model:r.model??null,teamfile:t,referenced_teamfile:n,sessionid:r.session??null,sessiondir:r.sessiondir??null,state:s.busy?"busy":"idle",reason:s.busy?s.reason:null,handling:i}}function Zq(e,t,r,n){let s=n.sender_alias==="operator"?"operator":`${n.sender_teamfile}:${n.sender_alias}`,o=e.db.prepare(`
|
|
2551
2551
|
SELECT * FROM tracked_invocation
|
|
2552
2552
|
WHERE kind = 'chat'
|
|
2553
2553
|
AND status = 'running'
|
|
@@ -2557,18 +2557,18 @@ delete requires --confirm; deleting default or active workspaces also requires -
|
|
|
2557
2557
|
AND holder_pid IS ?
|
|
2558
2558
|
ORDER BY started_at DESC, id DESC
|
|
2559
2559
|
LIMIT 5
|
|
2560
|
-
`).all(t,r,s,n.holder_pid).find(a=>a.request_payload!==null);return o?.request_payload===void 0||o.request_payload===null?null:{tracked_invocation_id:o.id,from_identity:o.from_identity,started_at:o.started_at,request_payload:o.request_payload,request_preview:
|
|
2560
|
+
`).all(t,r,s,n.holder_pid).find(a=>a.request_payload!==null);return o?.request_payload===void 0||o.request_payload===null?null:{tracked_invocation_id:o.id,from_identity:o.from_identity,started_at:o.started_at,request_payload:o.request_payload,request_preview:gH(o.request_payload)}}function Cf(e,t={}){let r=[],n=[];t.from!==void 0&&(r.push("from_identity = ?"),n.push(t.from)),t.target_teamfile!==void 0&&(r.push("target_teamfile = ?"),n.push(t.target_teamfile)),t.target_alias!==void 0&&(r.push("target_alias = ?"),n.push(t.target_alias));let s=r.length===0?"":` WHERE ${r.join(" AND ")}`;return e.db.prepare(`
|
|
2561
2561
|
SELECT * FROM tracked_invocation
|
|
2562
2562
|
${s}
|
|
2563
2563
|
ORDER BY started_at DESC, id DESC
|
|
2564
|
-
`).all(...n)}function
|
|
2564
|
+
`).all(...n)}function Qq(e,t,r){return e.db.prepare(`
|
|
2565
2565
|
SELECT * FROM agent_mailbox
|
|
2566
2566
|
WHERE sender_teamfile = ?
|
|
2567
2567
|
AND sender_alias = ?
|
|
2568
2568
|
AND delivered_at IS NULL
|
|
2569
2569
|
AND delivering_at IS NULL
|
|
2570
2570
|
ORDER BY receiver_teamfile ASC, receiver_alias ASC, id ASC
|
|
2571
|
-
`).all(t,r)}function
|
|
2571
|
+
`).all(t,r)}function eH(e,t,r){return e.db.prepare(`
|
|
2572
2572
|
SELECT * FROM agent_mailbox
|
|
2573
2573
|
WHERE receiver_teamfile = ?
|
|
2574
2574
|
AND receiver_alias = ?
|
|
@@ -2580,7 +2580,7 @@ delete requires --confirm; deleting default or active workspaces also requires -
|
|
|
2580
2580
|
WHERE delivered_at IS NULL
|
|
2581
2581
|
AND delivering_at IS NULL
|
|
2582
2582
|
ORDER BY ${r}
|
|
2583
|
-
`).all()}function
|
|
2583
|
+
`).all()}function tH(e,t,r){return e.db.prepare(`
|
|
2584
2584
|
SELECT * FROM agent_mailbox
|
|
2585
2585
|
WHERE sender_teamfile = ?
|
|
2586
2586
|
AND sender_alias = ?
|
|
@@ -2604,7 +2604,7 @@ delete requires --confirm; deleting default or active workspaces also requires -
|
|
|
2604
2604
|
ELSE delivered_at
|
|
2605
2605
|
END ASC,
|
|
2606
2606
|
id ASC
|
|
2607
|
-
`).all(t,r)}function
|
|
2607
|
+
`).all(t,r)}function rH(e){return e.db.prepare(`
|
|
2608
2608
|
SELECT * FROM agent_mailbox
|
|
2609
2609
|
WHERE delivered_at IS NULL
|
|
2610
2610
|
OR (
|
|
@@ -2624,9 +2624,9 @@ delete requires --confirm; deleting default or active workspaces also requires -
|
|
|
2624
2624
|
ELSE delivered_at
|
|
2625
2625
|
END ASC,
|
|
2626
2626
|
id ASC
|
|
2627
|
-
`).all()}function Mf(e){return e.filter(t=>Jd(t)!=="dead")}function ak(e){let t=e.delivered_at!==null&&(e.receipt===null||e.receipt==="");return{id:e.id,state:t?"no reply":"queued",sender:e.sender_teamfile===null||e.sender_alias===null?null:`${e.sender_teamfile}:${e.sender_alias}`,receiver:`${e.receiver_teamfile}:${e.receiver_alias}`,message_type:e.message_type,age_basis_at:t?e.delivered_at:e.created_at,created_at:e.created_at,delivered_at:e.delivered_at}}function jf(e,t){let r={id:e.id,kind:e.kind,origin:e.origin,status:e.status,holder_liveness:Jd(e),mailbox_delivery:null,from_identity:e.from_identity,target:e.target_teamfile===null||e.target_alias===null?null:`${e.target_teamfile}:${e.target_alias}`,started_at:e.started_at,ended_at:e.ended_at,result:rk(e.result_summary),error:rk(e.error)};return r.mailbox_delivery=
|
|
2628
|
-
`)}function
|
|
2629
|
-
`)}function lk(e){return
|
|
2627
|
+
`).all()}function Mf(e){return e.filter(t=>Jd(t)!=="dead")}function ak(e){let t=e.delivered_at!==null&&(e.receipt===null||e.receipt==="");return{id:e.id,state:t?"no reply":"queued",sender:e.sender_teamfile===null||e.sender_alias===null?null:`${e.sender_teamfile}:${e.sender_alias}`,receiver:`${e.receiver_teamfile}:${e.receiver_alias}`,message_type:e.message_type,age_basis_at:t?e.delivered_at:e.created_at,created_at:e.created_at,delivered_at:e.delivered_at}}function jf(e,t){let r={id:e.id,kind:e.kind,origin:e.origin,status:e.status,holder_liveness:Jd(e),mailbox_delivery:null,from_identity:e.from_identity,target:e.target_teamfile===null||e.target_alias===null?null:`${e.target_teamfile}:${e.target_alias}`,started_at:e.started_at,ended_at:e.ended_at,result:rk(e.result_summary),error:rk(e.error)};return r.mailbox_delivery=uH(r,t),r}function Ba(e,t){let r=new Map;for(let n of e){let s=n.sender_teamfile===null||n.sender_alias===null?"operator":`${n.sender_teamfile}:${n.sender_alias}`,i=`${n.receiver_teamfile}:${n.receiver_alias}`,o=t==="outbound"?`${s}\0${i}`:`${i}\0${s}`,a=r.get(o);a===void 0?r.set(o,[n]):a.push(n)}return[...r.values()].map(n=>{let s=n[0],i=n.map(o=>o.created_at).sort();return{sender:s.sender_teamfile===null||s.sender_alias===null?null:`${s.sender_teamfile}:${s.sender_alias}`,receiver:`${s.receiver_teamfile}:${s.receiver_alias}`,message_types:[...new Set(n.map(o=>o.message_type))].sort(),pending_count:n.length,oldest_created_at:i[0],newest_created_at:i[i.length-1],ids:n.map(o=>o.id)}})}function nH(e,t){return e.scope==="self"?sH(e,t):iH(e,t)}function sH(e,t){let r=[];r.push(`identity: ${e.identity}`),r.push(`team: ${e.team.name}`),r.push(`teamfile: ${e.team.teamfile}`),r.push(""),r.push("members:"),e.members.length===0&&r.push(" none");for(let n of e.members){let s=n.model===null?"":` model=${n.model}`,i=n.sessionid===null?"":` session=${n.sessionid}`,o=n.state==="idle"?"idle":`busy (${n.reason})`,a=n.handling===null?"":` handling="${n.handling.request_preview}"`;r.push(` ${n.alias}: ${o} provider=${n.provider}${s}${i}${a}`)}return r.push(""),r.push("Waiting on:"),ck(r,e.waiting_on,"self"),r.push(""),r.push("activity from me:"),Df(r,Pf(e.activity.from_me,t.sinceIso),"from-me"),r.push(""),r.push("activity to me:"),Df(r,Pf(e.activity.to_me,t.sinceIso),"to-me"),r.push(""),r.push("mailbox outbound:"),qa(r,e.mailbox.outbound),r.push(""),r.push("mailbox inbound pending:"),qa(r,e.mailbox.inbound_pending),r.push(""),r.push(lk(e)),r.join(`
|
|
2628
|
+
`)}function iH(e,t){let r=[];r.push("scope: workspace"),r.push("identity: none"),r.push(""),r.push("teams:"),e.teams.length===0&&r.push(" none");for(let n of e.teams){let s=n.name===null?"(unnamed)":n.name;r.push(` ${s}: ${n.teamfile} (${n.member_count} members)`)}return r.push(""),r.push("Waiting on:"),ck(r,e.waiting_on,"workspace"),r.push(""),r.push("recent activity:"),Df(r,Pf(e.activity,t.sinceIso),"workspace"),r.push(""),r.push("mailbox pending outbound:"),qa(r,e.mailbox.pending_outbound),r.push(""),r.push("mailbox pending inbound:"),qa(r,e.mailbox.pending_inbound),r.push(""),r.push(lk(e)),r.join(`
|
|
2629
|
+
`)}function lk(e){return Ks(e.workspace,e.db_path)}function Df(e,t,r){if(t.length===0){e.push(" none");return}let n=t.filter(tk).sort(cH),s=n.length===0?t:t.filter(i=>!tk(i));for(let i of n.slice(0,Gv))ek(e,i,r);Ff(e,n.length,Gv,"more open delegations");for(let i of s.slice(0,Xv))ek(e,i,r);Ff(e,s.length,Xv,"older")}function ck(e,t,r){if(t.length===0){e.push(" none");return}let n=oH(t,Jq);for(let s of n){let i=r==="workspace"&&s.sender!==null?`${er(s.sender)} -> ${er(s.receiver)}`:er(s.receiver);e.push(` ${i} - ${s.state} ${yH(s.age_basis_at)} (#${s.id}, ${s.message_type})`)}lH(e,t,n)}function oH(e,t){let r=[...e].sort(Qv);if(r.length<=t)return r;let n=r.slice(0,t),s=new Set(r.map(i=>i.state));for(let i of s){if(n.some(l=>l.state===i))continue;let o=r.find(l=>l.state===i);if(o===void 0)continue;let a=aH(n);a>=0&&(n[a]=o)}return n.sort(Qv)}function aH(e){let t=new Map;for(let r of e)t.set(r.state,(t.get(r.state)??0)+1);for(let r=e.length-1;r>=0;r-=1)if((t.get(e[r].state)??0)>1)return r;return-1}function lH(e,t,r){let n=new Set(r.map(l=>l.id)),s=t.filter(l=>!n.has(l.id));if(s.length===0)return;let i=s.filter(l=>l.state==="queued").length,o=s.filter(l=>l.state==="no reply").length,a=[i>0?`${i} queued`:null,o>0?`${o} no reply`:null].filter(l=>l!==null);e.push(` (+${s.length} older: ${a.join(", ")} -- use --json)`)}function Qv(e,t){let r=Date.parse(e.age_basis_at),n=Date.parse(t.age_basis_at);return Number.isFinite(r)&&Number.isFinite(n)&&r!==n?r-n:Number.isFinite(r)!==Number.isFinite(n)?Number.isFinite(r)?-1:1:e.id-t.id}function Pf(e,t){let r=Date.parse(t);return Number.isFinite(r)?e.filter(n=>{let s=Date.parse(n.ended_at??n.started_at);return Number.isFinite(s)&&s>=r}):e}function ek(e,t,r){let n=_H(t,r),s=t.status==="running"?`since ${t.started_at}`:`ended ${t.ended_at??t.started_at}`,i=t.error??t.result,o=i===null?"":` "${hH(i)}"`;e.push(` #${t.id} ${dH(t)} ${t.kind}${n} ${s}${o}`)}function tk(e){return e.mailbox_delivery?.state==="queued"||e.mailbox_delivery?.state==="delivering"}function cH(e,t){let r=Date.parse(e.started_at)-Date.parse(t.started_at);return Number.isFinite(r)&&r!==0?r:e.id-t.id}function dH(e){return e.status==="running"&&e.holder_liveness==="unknown"?"RUNNING_UNKNOWN":e.mailbox_delivery===null?e.status.toUpperCase():e.mailbox_delivery.state.toUpperCase()}function uH(e,t){let r=fH(e,t);return r===null?null:{mailbox_id:r.id,state:r.delivered_at!==null?"delivered":r.delivering_at!==null?"delivering":"queued",delivered_at:r.delivered_at,delivering_at:r.delivering_at}}function fH(e,t){if(e.kind!=="chat"||e.status!=="done"||e.target===null||e.result===null)return null;let r,n;try{r=qr(e.from_identity),n=qr(e.target)}catch{return null}for(let s of mH(e.result)){let i=t.getMailboxMessage(s);if(i!==null&&!(i.sender_teamfile!==r.teamfile||i.sender_alias!==r.alias)&&!(i.receiver_teamfile!==n.teamfile||i.receiver_alias!==n.alias)&&pH(i,e))return i}return null}function mH(e){let t=new Set,r=[];for(let n of e.matchAll(/\d+/g)){let s=Number(n[0]);!Number.isSafeInteger(s)||s<=0||t.has(s)||(t.add(s),r.push(s))}return r}function pH(e,t){let r=Date.parse(t.started_at),n=Date.parse(t.ended_at??t.started_at),s=Date.parse(e.created_at);return!Number.isFinite(r)||!Number.isFinite(n)||!Number.isFinite(s)?!1:s>=r&&s<=n}function _H(e,t){if(t==="from-me")return e.target===null?"":` -> ${er(e.target)}`;if(t==="to-me")return` from ${er(e.from_identity)}`;let r=e.target===null?"":` -> ${er(e.target)}`;return` from ${er(e.from_identity)}${r}`}function Ff(e,t,r,n){let s=t-r;s>0&&e.push(` (+${s} ${n} -- use --json)`)}function qa(e,t){if(t.length===0){e.push(" none");return}for(let r of t.slice(0,Vv)){let n=r.sender??"operator";e.push(` ${er(n)} -> ${er(r.receiver)}: ${r.pending_count} pending ${r.message_types.join("+")} (oldest ${r.oldest_created_at})`)}Ff(e,t.length,Vv,"more lanes")}function rk(e){return e===null||e.length===0?null:e.replace(/\s+/g," ").trim()}function hH(e){let t=e.replace(/\s+/g," ").trim();return t.length<=Kv?t:`${t.slice(0,Kv-3)}...`}function gH(e){let t=e.replace(/\s+/gu," ").trim();return t.length<=Yv?t:`${t.slice(0,Yv-3)}...`}function yH(e){let t=Date.parse(e);if(!Number.isFinite(t))return"unknown age";let r=Math.max(0,Math.floor((Date.now()-t)/1e3));if(r<60)return`${r}s`;let n=Math.floor(r/60);if(n<60)return`${n}m`;let s=Math.floor(n/60);return s<48?`${s}h`:`${Math.floor(s/24)}d`}function er(e){if(e==="operator")return e;try{let t=qr(e);return`${Uq(t.teamfile)}:${t.alias}`}catch{return e}}function wH(e){if(e===void 0)return{iso:new Date(Date.now()-Xq).toISOString()};let t=/^(\d+)([smhd])$/.exec(e);if(t!==null){let n=Number(t[1]),s=t[2],i=s==="s"?n:s==="m"?n*60:s==="h"?n*3600:n*86400;return{iso:new Date(Date.now()-i*1e3).toISOString()}}let r=Date.parse(e);return Number.isFinite(r)?{iso:new Date(r).toISOString()}:{error:`invalid --since value: ${e} (expected ISO8601 or duration like 24h)`}}var Hq,Xv,Gv,Vv,Jq,Xq,Kv,Yv,uk=T(()=>{"use strict";Fr();Le();Mu();Xe();Ta();Rt();Hq=`usage: lmctl status [--json] [--since <duration|ISO8601>]
|
|
2630
2630
|
|
|
2631
2631
|
Show this member's team, busy/idle roster, recent tracked activity, and mailbox
|
|
2632
2632
|
state. From a plain operator shell, show a workspace-level team/activity summary.
|
|
@@ -2634,7 +2634,7 @@ state. From a plain operator shell, show a workspace-level team/activity summary
|
|
|
2634
2634
|
Text output shows recent activity from the last 24h by default. Use --since 7d
|
|
2635
2635
|
or an ISO timestamp to widen the investigation window. --json returns complete,
|
|
2636
2636
|
uncapped data.
|
|
2637
|
-
`,Xv=5,Gv=5,Vv=5,
|
|
2637
|
+
`,Xv=5,Gv=5,Vv=5,Jq=5,Xq=24*60*60*1e3,Kv=72,Yv=80});Xe();Fn();he();import{pathToFileURL as EH}from"node:url";import{mkdirSync as iI,readFileSync as oI,renameSync as aI,writeFileSync as lI}from"node:fs";import{homedir as cI}from"node:os";import{dirname as dI,join as uI}from"node:path";function cm(e){try{return new URL(e).protocol==="https:"}catch{return!1}}function nI(e){return/^[A-Za-z]:[\\/]/.test(e)?!1:/^[A-Za-z][A-Za-z0-9+.-]*:/.test(e)}function sI(e,t){return!nI(e)||cm(e)?null:`${t} must use https://: ${e}`}async function dm(e,t){let r=sI(e,t.description);if(r!==null||!cm(e))throw new Error(r??`${t.description} must use https://: ${e}`);let n=t.timeoutMs??15e3,s=new AbortController,i=setTimeout(()=>s.abort(),n);try{let o;try{o=await fetch(e,{signal:s.signal,redirect:"manual"})}catch(a){throw lm(e,t.description,n,a)}if(o.type==="opaqueredirect"||o.status>=300&&o.status<400)throw new Error(`refusing to follow redirect from ${t.description} ${e} (https-only: the URL must serve the content directly, not redirect)`);if(!o.ok)throw new Error(`failed to fetch ${t.description} ${e}: HTTP ${o.status}${o.statusText?` ${o.statusText}`:""}`);try{return Buffer.from(await o.arrayBuffer())}catch(a){throw lm(e,t.description,n,a)}}finally{clearTimeout(i)}}function lm(e,t,r,n){let i=n instanceof Error&&n.name==="AbortError"?`timed out after ${r}ms`:n instanceof Error?n.message:String(n);return new Error(`failed to fetch ${t} ${e}: ${i}`)}Fn();var fI="https://registry.npmjs.org/@lmctl-ai/lmctl/latest",mI=60*60*1e3,pI=1500;function _I(){let e=process.env.HOME??cI();return uI(e,".lmctl",".update-check.json")}function hI(e){return e.isTTY===!0}function gI(e,t){let r=i=>{let o=/^(\d+)\.(\d+)\.(\d+)(?:$|[-+])/.exec(i.trim());if(o===null)return null;let a=o.slice(1).map(l=>Number(l));return a.some(l=>!Number.isSafeInteger(l)||l<0)?null:a},n=r(e),s=r(t);if(n===null||s===null)return 0;for(let i=0;i<3;i+=1){if(n[i]>s[i])return 1;if(n[i]<s[i])return-1}return 0}function za(e,t){return!!(process.env.LMCTL_NO_UPDATE_NOTIFIER==="1"||!hI(t.stderr)||e.includes("--json")||e.includes("--help")||e.includes("-h")||e[0]==="help"||e[0]==="mcp")}function yI(e,t){try{let r=JSON.parse(oI(e,"utf8"));if(typeof r.checkedAt=="number"&&Number.isFinite(r.checkedAt)&&typeof r.latest=="string"&&t-r.checkedAt<mI)return r.latest}catch{}return null}function wI(e,t){iI(dI(e),{recursive:!0});let r=`${e}.tmp-${process.pid}-${Math.random().toString(16).slice(2)}`;lI(r,`${JSON.stringify(t)}
|
|
2638
2638
|
`,"utf8"),aI(r,e)}async function EI(){let e=await dm(fI,{description:"lmctl npm metadata",timeoutMs:pI}),t=JSON.parse(e.toString("utf8"));if(typeof t.version!="string"||t.version.trim()==="")throw new Error("registry response missing version");return t.version}async function um(e,t=[],r={}){try{if(za(t,e))return;let n=r.now?.()??Date.now(),s=r.cachePath??_I();if(yI(s,n)!==null)return;let o=await(r.fetchLatest??EI)();try{wI(s,{checkedAt:n,latest:o})}catch{return}let a=r.currentVersion?.()??yt();gI(o,a)>0&&e.stderr.write(`update available: ${a} \u2192 ${o} run: npm i -g @lmctl-ai/lmctl@latest
|
|
2639
2639
|
`)}catch{}}var Mn=`usage: lmctl [--db PATH] [--workspace NAME] [--debug] <command> [args]
|
|
2640
2640
|
`,Uf=`${Mn}
|
|
@@ -2687,14 +2687,14 @@ ${Mn}Run 'lmctl help' for usage.
|
|
|
2687
2687
|
${Mn}Run 'lmctl help' for usage.
|
|
2688
2688
|
`),1):(e.stderr.write(`error: unknown command: ${t}
|
|
2689
2689
|
${Mn}Run 'lmctl help' for usage.
|
|
2690
|
-
`),1)}async function
|
|
2691
|
-
`),0;if(n==="--help"||n==="-h"||n===void 0)return t.stdout.write(Uf),0;if(n==="help"){let[a,...l]=r.slice(1);return a===void 0||a==="--help"||a==="-h"?(t.stdout.write(Uf),0):fk.has(a)?mk(a,[...l,"--help"],t):pk(t,a)}Xf(le(),t.stderr),Vf(t.stderr);let[s,...i]=r;if(s===void 0)return t.stdout.write(Uf),0;let o=Date.now();Bf(s,i,{phase:"start",started_at:new Date(o).toISOString()});try{let a=await mk(s,i,t);return Bf(s,i,{phase:"finish",outcome:a===0?"ok":"error",exit_code:a,duration_ms:Date.now()-o}),fk.has(s)&&!za(r,t)&&await um(t,r),a}catch(a){let l=a instanceof Error?a:new Error(String(a));return Bf(s,i,{phase:"fatal",outcome:"fatal",exit_code:1,duration_ms:Date.now()-o,error_class:l.name,error_message:l.message,error_stack:l.stack??null,causes:
|
|
2690
|
+
`),1)}async function TH(e,t={stdout:process.stdout,stderr:process.stderr}){let r=im();try{return await bH(e,t)}finally{om(r)}}async function bH(e,t={stdout:process.stdout,stderr:process.stderr}){let r=[];for(let a=0;a<e.length;a+=1){let l=e[a];if(l==="--db"){let c=e[++a];if(c===void 0||c.startsWith("--"))return Wf(t,"missing value for --db");process.env.LMCTL_DB=c;continue}if(l==="--workspace"){let c=e[++a];if(c===void 0||c.startsWith("--"))return Wf(t,"missing value for --workspace");if(!ze(c))return Wf(t,`invalid workspace name: ${c}`);process.env.LMCTL_WORKSPACE=c;continue}if(l==="--debug"){sm();continue}r.push(l)}let n=r[0];if(n==="--version"||n==="-v"||n==="-V")return t.stdout.write(`lmctl ${yt()}
|
|
2691
|
+
`),0;if(n==="--help"||n==="-h"||n===void 0)return t.stdout.write(Uf),0;if(n==="help"){let[a,...l]=r.slice(1);return a===void 0||a==="--help"||a==="-h"?(t.stdout.write(Uf),0):fk.has(a)?mk(a,[...l,"--help"],t):pk(t,a)}Xf(le(),t.stderr),Vf(t.stderr);let[s,...i]=r;if(s===void 0)return t.stdout.write(Uf),0;let o=Date.now();Bf(s,i,{phase:"start",started_at:new Date(o).toISOString()});try{let a=await mk(s,i,t);return Bf(s,i,{phase:"finish",outcome:a===0?"ok":"error",exit_code:a,duration_ms:Date.now()-o}),fk.has(s)&&!za(r,t)&&await um(t,r),a}catch(a){let l=a instanceof Error?a:new Error(String(a));return Bf(s,i,{phase:"fatal",outcome:"fatal",exit_code:1,duration_ms:Date.now()-o,error_class:l.name,error_message:l.message,error_stack:l.stack??null,causes:vH(l)}),SH(a,s,i,t)}}function Bf(e,t,r){Ae({event:e,record_kind:"cli_action",command:e,argv:t,cwd:process.cwd(),db_path:le(),workspace:process.env.LMCTL_WORKSPACE??null,lmctl_version:yt(),node_version:process.version,...r})}function SH(e,t,r,n){let s=e instanceof Error?e:new Error(String(e));return n.stderr.write(`error: ${s.message}
|
|
2692
2692
|
`),am()?(n.stderr.write(`(debug details written to ~/.lmctl/debug-*.log)
|
|
2693
2693
|
`),1):(n.stderr.write(`(re-run with --debug for the full stack trace and context in ~/.lmctl/debug-*.log)
|
|
2694
|
-
`),1)}function
|
|
2694
|
+
`),1)}function vH(e){let t=[],r=e.cause,n=0;for(;r!=null&&n<8;){let s=r instanceof Error?r:new Error(String(r));t.push({error_class:s.name,error_message:s.message,error_stack:s.stack??null}),r=s.cause,n+=1}return t}async function mk(e,t,r){switch(e){case"api":{let{runApi:n}=await Promise.resolve().then(()=>(Y_(),K_));return n(t,r)}case"serve":{let{runServe:n}=await Promise.resolve().then(()=>(XT(),JT));return n(t,r)}case"chat":{let{runChat:n}=await Promise.resolve().then(()=>(xb(),Nb));return n(t,r)}case"recover":{let{runRecover:n}=await Promise.resolve().then(()=>(jb(),Mb));return n(t,r)}case"mcp":{let{runMcp:n}=await Promise.resolve().then(()=>(qb(),Bb));return n(t,r)}case"device":{let{runDevice:n}=await Promise.resolve().then(()=>(Jb(),Hb));return n(t,r)}case"team":{let{runTeam:n}=await Promise.resolve().then(()=>(_S(),pS));return n(t,r)}case"tail":{let{runTail:n}=await Promise.resolve().then(()=>(SS(),bS));return n(t,r)}case"health":{let{runInfo:n}=await Promise.resolve().then(()=>(OS(),LS));return n(t,r)}case"ls":{let{runLs:n}=await Promise.resolve().then(()=>(MS(),CS));return n(t,r)}case"lint":{let{runLint:n}=await Promise.resolve().then(()=>(Bs(),Ws));return n(t,r)}case"seed":{let{runSeed:n}=await Promise.resolve().then(()=>(Bs(),Ws));return n(t,r)}case"hire":{let{runHire:n}=await Promise.resolve().then(()=>(Bs(),Ws));return n(t,r)}case"refresh":{let{runRefresh:n}=await Promise.resolve().then(()=>(Bs(),Ws));return n(t,r)}case"clone":{let{runClone:n}=await Promise.resolve().then(()=>(rv(),tv));return n(t,r)}case"plan":{let{runPlan:n}=await Promise.resolve().then(()=>(ov(),iv));return n(t,r)}case"terminal":{let{runTerminal:n}=await Promise.resolve().then(()=>(_v(),pv));return n(t,r)}case"workspace":{let{runWorkspace:n}=await Promise.resolve().then(()=>(vv(),Sv));return n(t,r)}case"diagnose":{let{runDiagnose:n}=await Promise.resolve().then(()=>(Pv(),Dv));return n(t,r)}case"diagnose-prompt":{let{runDiagnosePrompt:n}=await Promise.resolve().then(()=>(Jv(),Hv));return n(t,r)}case"status":{let{runStatus:n}=await Promise.resolve().then(()=>(uk(),dk));return n(t,r)}case"db":return kH(t,r);default:return pk(r,e)}}function kH(e,t){let[r,...n]=e;return r==="--help"||r==="-h"||r==="help"?(t.stdout.write(`usage: lmctl db downgrade --to <version> --confirm
|
|
2695
2695
|
|
|
2696
2696
|
Database utilities. The downgrade command is currently a documented stub;
|
|
2697
2697
|
restore from backup for rollback and use normal migrations for forward changes.
|
|
2698
2698
|
`),0):r==="downgrade"?(t.stderr.write(`not yet implemented; restore from backup, or run lmctl migrate (forward-migrates ok)
|
|
2699
2699
|
`),1):(t.stderr.write(`usage: lmctl db downgrade --to <version> --confirm
|
|
2700
|
-
`),1)}if(process.argv[1]!==void 0&&import.meta.url===
|
|
2700
|
+
`),1)}if(process.argv[1]!==void 0&&import.meta.url===EH(process.argv[1]).href){let e=await TH(process.argv.slice(2));process.exitCode=e}export{TH as runCli};
|